2012-02-27 32 views
3

我想設置PROCESS_TERMINATE的安全性。這是代碼:SetSecurityInfo失敗PROCESS_TERMINATE

CreateProcess("C:\\ADP\\SQLBase\\dbntsrv.exe", NULL, NULL, NULL, FALSE, CREATE_NO_WINDOW, NULL, "C:\\ADP\\SQLBase", &si, &pi);  

if(SetSecurityInfo(pi.hProcess, SE_KERNEL_OBJECT, PROCESS_TERMINATE, NULL, NULL, NULL, NULL) == ERROR_SUCCESS) 
{ 
    MessageBox(NULL, "process_terminate granted", NULL, MB_OK); 
} 
else 
{ 
    MessageBox(NULL, "process_terminate not granted", NULL, MB_OK); 
} 



        //--------------------- Permission to query for info to use GetExitCode ------------------------- 
if(SetSecurityInfo(pi.hProcess, SE_KERNEL_OBJECT, PROCESS_QUERY_INFORMATION, NULL, NULL, NULL, NULL) == ERROR_SUCCESS) 
{ 
    MessageBox(NULL, "process_query_information granted", NULL, MB_OK); 
} 
else 
{ 
    MessageBox(NULL, "process_query_information not granted", NULL, MB_OK); 
} 


LPDWORD lpExitCode; 
GetExitCodeProcess(pi.hProcess, lpExitCode); 

這裏SetSecurityInfo爲PROCESS_TERMINATE失敗,我得到一個Unhandled Exception..(KERNEL32.dll):Access Violation

GetExitCodeProcess(pi.hProcess, lpExitCode); 

爲什麼會出現這種情況?謝謝

回答

4

訪問衝突就是因爲這個代碼:

LPDWORD lpExitCode; 
GetExitCodeProcess(pi.hProcess, lpExitCode); 

在這裏,您聲明lpExitCode是一個指針,但你不使它指向任何東西。當GetExitCodeProcess嘗試寫入*lpExitCode時,會導致訪問衝突。

正確的做法是這樣的:

DWORD ExitCode; 
GetExitCodeProcess(pi.hProcess, &ExitCode); 

我也不相信你需要調用SetSecurityInfo可言。 CreateProcess返回的流程句柄應具有足夠的權限。

您需要等待生成的進程終止,然後才能獲得退出代碼。這是因爲GetExitCodeProcess是異步的。你可以這樣等待:

WaitForSingleObject(pi.hProcess); 
//now you can call GetExitCodeProcess and expect an answer. 

而且記得檢查所有的API調用錯誤。

+0

很好..非常感謝你 – digvijay 2012-02-27 11:06:42

3

除了向GetExitCodeProcess打電話外,您致電SetSecurityInfo也是不正確的。對於第三個參數,PROCESS_TERMINATE不是有效值。根據the documentation,第三個參數的有效值是

OWNER_SECURITY_INFORMATION:包含所有者。

GROUP_SECURITY_INFORMATION:包含主要組。

DACL_SECURITY_INFORMATION:包含自由訪問控制列表(DACL)。

SACL_SECURITY_INFORMATION:包含系統訪問控制列表(SACL)。

LABEL_SECURITY_INFORMATION:包含強制性完整性標籤訪問控制項(ACE)。

ATTRIBUTE_SECURITY_INFORMATION:包含SACL的屬性信息。

SCOPE_SECURITY_INFORMATION:包含SACL的中央訪問策略(CAP)標識符。

你的PROCESS_TERMINATE值正好是數值上等於OWNER_SECURITY_INFORMATION所以你的電話實際上是試圖改變流程所有者(但是否有誤,這就是爲什麼調用失敗)。