ПИТОН | остановить процесс убийства пользователя - PullRequest
0 голосов
/ 28 ноября 2011

Здесь упоминалась очень крутая функция:

Предотвращение уничтожения пользовательского процесса с помощью "End Process" из Process Explorer

Кто-нибудь знает, как перевести этоКод C ++ для Python (или отредактируйте его так, чтобы он хотя бы компилировался в C / C ++, предполагая, что это именно то, в чем он находится):

static const bool ProtectProcess()
{
    HANDLE hProcess = GetCurrentProcess();
    EXPLICIT_ACCESS denyAccess = {0};
    DWORD dwAccessPermissions = GENERIC_WRITE|PROCESS_ALL_ACCESS|WRITE_DAC|DELETE|WRITE_OWNER|READ_CONTROL;
    BuildExplicitAccessWithName( &denyAccess, _T("CURRENT_USER"), dwAccessPermissions, DENY_ACCESS, NO_INHERITANCE );
    PACL pTempDacl = NULL;
    DWORD dwErr = 0;
    dwErr = SetEntriesInAcl( 1, &denyAccess, NULL, &pTempDacl );
    // check dwErr...
    dwErr = SetSecurityInfo( hProcess, SE_KERNEL_OBJECT, DACL_SECURITY_INFORMATION, NULL, NULL, pTempDacl, NULL );
    // check dwErr...
    LocalFree( pTempDacl );
    CloseHandle( hProcess );
    return dwErr == ERROR_SUCCESS;
}

Ответы [ 2 ]

2 голосов
/ 29 ноября 2011

Вот довольно грубый перевод ctypes кода, который вы разместили. Это даже похоже на работу! Обратите внимание, что я удаляю вызов на CloseHandle, что просто неправильно. Вы не должны вызывать CloseHandle на псевдо-дескрипторе, что GetCurrentProcess возвращает.

from ctypes import *
from ctypes.wintypes import *
from win32con import *

class TRUSTEE(Structure):
    pass

TRUSTEE._fields_ = (
    ('pMultipleTrustee', POINTER(TRUSTEE)),
    ('MultipleTrusteeOperation', c_int),
    ('TrusteeForm', c_int),
    ('TrusteeType', c_int),
    ('ptstrName', LPSTR)
)

class EXPLICIT_ACCESS(Structure):
    _fields_ = (
        ('grfAccessPermissions', DWORD),
        ('grfAccessMode', c_int),
        ('grfInheritance', DWORD),
        ('Trustee', TRUSTEE)
    )

GetCurrentProcess = windll.kernel32.GetCurrentProcess
GetCurrentProcess.restype = HANDLE
hProcess = GetCurrentProcess()

denyAccess = EXPLICIT_ACCESS()
dwAccessPermissions = DWORD(GENERIC_WRITE|PROCESS_ALL_ACCESS|WRITE_DAC|DELETE|WRITE_OWNER|READ_CONTROL);

BuildExplicitAccessWithName = windll.advapi32.BuildExplicitAccessWithNameA
BuildExplicitAccessWithName.restype = None
DENY_ACCESS = 3
NO_INHERITANCE = 0
BuildExplicitAccessWithName(byref(denyAccess), 'CURRENT_USER', dwAccessPermissions, DENY_ACCESS, NO_INHERITANCE)

SetEntriesInAcl = windll.advapi32.SetEntriesInAclA
SetEntriesInAcl.restype = DWORD
SetEntriesInAcl.argtypes = (ULONG, POINTER(EXPLICIT_ACCESS), c_voidp, POINTER(c_voidp))
pTempDacl = c_voidp()
dwErr = SetEntriesInAcl(1, byref(denyAccess), None, byref(pTempDacl));

SetSecurityInfo = windll.advapi32.SetSecurityInfo
SetSecurityInfo.restype = DWORD
SetSecurityInfo.argtypes = (HANDLE, c_int, DWORD, c_voidp, c_voidp, c_voidp, c_voidp)
SE_KERNEL_OBJECT = 6
dwErr = SetSecurityInfo(hProcess, SE_KERNEL_OBJECT, DACL_SECURITY_INFORMATION, None, None, pTempDacl, None);

LocalFree = windll.kernel32.LocalFree
LocalFree.restype = c_voidp
LocalFree.argtypes = (c_voidp,)
LocalFree(pTempDacl)
1 голос
/ 28 ноября 2011

Как насчет использования ctypes ? Вы также можете попробовать pywin32 . Вы также можете попробовать использовать IronPython . Для ActivePython есть win32api .

Кроме того, я не знаю ваших аргументов в пользу того, почему вы хотите этого достичь, что означает, что существует потенциально более элегантное решение.

...