2011-11-28 45 views
0

一個非常酷的功能:PYTHON |停止用戶查殺過程這裏提到

Prevent user process from being killed with "End Process" from 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; 
} 
+3

爲什麼要讓用戶難以終止進程? –

+1

@DavidHeffernan - 天網:) – Rook

+0

你是什麼意思編輯它,使它編譯爲C++。它不會編譯?看起來像通過ctypes Pythin的一個非常容易的端口。 –

回答

2

有關使用ctypes如何?您也可以嘗試pywin32。您也可以嘗試使用IronPython。對於ActivePython有win32api

此外,我不知道你爲什麼要達到目的的理由,這意味着有可能有一些更優雅的解決方案。

+0

嗨,不知道這是如何解決我的問題? – Ian

+0

它給你一些指示,你可以從哪裏開始尋找更多的信息。你所問的問題本身並不重要,這意味着你將需要做一些不平凡的編碼來完全解決它:)或者,你可以爲我們提供一個理由,你爲什麼想要實現你在做什麼,我們可以提出一些替代方案。 – jsalonen

+0

我正在爲應用程序使用情況監控編寫一個用戶生產力模塊 - 由管理員管理 - 如果它可以被用戶殺死,則不算好。我可以作爲服務運行,但是所有的win32gui項目都會失敗。這似乎是一個很好的/簡單的選擇。 – Ian

2

下面是你發佈的代碼的一個相當粗俗的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) 
+0

這對我來說完全適用,所以我想這是一個可行的翻譯。 –