Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Системное программирование и WinAPI > OpenProcess возвращает ACCESS_DENIED


Автор: borisbn 27.5.2010, 10:02
Доброго времени суток всем.
Столкнулся со следующей проблемой: есть функция, прибивающая процесс по имени. На одних компьютерах всё отрабатывает, на других функция OpenProcess возвращает NULL. И там и там Windows XP.
Код

bool RemoteLauncher::killExe( const QString & killName )
{
    HANDLE hProcessSnap = CreateToolhelp32Snapshot( TH32CS_SNAPPROCESS, 0 );
    if ( INVALID_HANDLE_VALUE == hProcessSnap )
    {
        return false;
    }
    bool found = false;
    PROCESSENTRY32 pe32 = {0};
    pe32.dwSize = sizeof( PROCESSENTRY32 );
    if ( Process32First( hProcessSnap, &pe32 ) )
    { 
        do
        {
            if ( QString::fromUtf16( pe32.szExeFile ).toLower() == killName.toLower() )
            {
                HANDLE hProcess = OpenProcess( PROCESS_ALL_ACCESS, FALSE, pe32.th32ProcessID );
                if ( 0 == hProcess )
                {
                    qDebug() << QString( "0 == hProcess. lE = %1" ).arg( GetLastError() ); // <--- тут пишет "0 == hProcess. lE = 5. 5 - это ACCESS_DENIED
                    return false;
                }
                if ( TerminateProcess( hProcess, 0 ) == 0 )
                {
                    qDebug() << QString( "TerminateProcess( hProcess, 0 ) == 0. lE = %1" ).arg( GetLastError() );
                    return false;
                }
                found = true;
            }
        }
        while ( false == found && Process32Next( hProcessSnap, &pe32 ) );
    }
    CloseHandle( hProcessSnap );
    if ( false == found )
    {
        return false;
    }
    return true;
}

Захожу на все компьютеры под администратором. Могу прибить exe-шник из диспетчера задач и при помощи taskkill.
Самое интересное, что эта программа написана на MSVC 2008. У меня была раньше программа, написанная на MSVC 6.0, делающая то же самое (я даже Си-шный код для новой программы из неё и взял), так вот старая программа отрабатывает на всех компьютерах.

Help кто сталкивался, please. Thx.

Автор: Dem_max 27.5.2010, 10:07
а GetLastError() для кого ?

Автор: GremlinProg 27.5.2010, 10:14
Цитата(Dem_max @  27.5.2010,  12:07 Найти цитируемый пост)
а GetLastError() для кого ?

Цитата

возвращает ACCESS_DENIED

Цитата(OpenProcess Function @  MSDN)

To open a handle to another local process and obtain full access rights, you must enable the SeDebugPrivilege privilege. For more information, see Changing Privileges in a Token.

некоторые привелегии надо открывать даже под админом, хотя вот на счет SeDebugPrivilege не проверял

Добавлено через 1 минуту и 40 секунд
хотя возможно стоит просто открыть с правами PROCESS_TERMINATE, а не PROCESS_ALL_ACCESS

Автор: 12usver12 27.5.2010, 10:25
это из-за привилегий 100%, когда-то давно экспериментировал - под админом на одном кампе получалось читать память процесса на другом нет, после debug привилегии все шло пучком 

Автор: borisbn 27.5.2010, 13:09
GremlinProg, 
Цитата(GremlinProg @  27.5.2010,  10:14 Найти цитируемый пост)
хотя возможно стоит просто открыть с правами PROCESS_TERMINATE, а не PROCESS_ALL_ACCESS

сработало !!! Большое спасибо. +1.
тему закрыл.
хотя... непонятно, почему PROCESS_ALL_ACCESS не работал ?

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)