2012-10-31 99 views
0

我需要從C++程序中註銷用戶。我使用ExitWindowsEx API,但我不確定從文檔是否需要任何特殊權限?我是否需要SE_SHUTDOWN_NAME權限才能註銷用戶?

+1

不,你不從我知道需要任何額外的特權。在我的學校,我可以關閉權限並註銷。 – chris

+0

謝謝。您可能想要將它作爲答案發布。但是,有一個後續問題 - 在企業Active Directory環境中,沒有可以限制用戶使用該API註銷的GPO或權限,是嗎? – ahmd0

+0

我非常懷疑它。如果我是正確的,那麼這個政策很可能不會讓用戶自己註銷。儘管如此,我還是不想聽聽自己的經歷,所以我認爲聽到更確信自己知道的人會是一個好主意。 – chris

回答

0

你這樣做。這裏有一個例子

bool ShutdownWindows(void) 
{ 
HANDLE hToken = NULL; 
TOKEN_PRIVILEGES tkp = {0}; 
bool bRet = false; 

// Get a token for this process. 
if (OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken)) { 
    if (LookupPrivilegeValue(NULL, SE_SHUTDOWN_NAME, &tkp.Privileges[0].Luid)) { 
     tkp.PrivilegeCount = 1; // one privilege to set  
     tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED; 

     // Get the shutdown privilege for this process. 
     if (AdjustTokenPrivileges(hToken, FALSE, &tkp, 0, NULL, 0)) { 
      ::CloseHandle(hToken); 

      if (ERROR_SUCCESS == GetLastError()) { 

       DWORD dwFlags = EWX_POWEROFF; 
       DWORD dwReason = SHTDN_REASON_MAJOR_SYSTEM; 

       if (ExitWindowsEx(dwFlags, dwReason)) { 
        bRet = true; 
       } 
      } 
     } 
    } 
} 

return bRet; 

} // ShutdownWindows

+1

首先,原始問題是關於註銷用戶('EWX_LOGOFF'標誌),而不是關閉工作站('EWX_POWEROFF'參數。)如果你這樣做,那麼確實需要'SE_SHUTDOWN_NAME'特權。如果它只是'EWX_LOGOFF',那麼它不是。請注意,您提出的解決方案仍然可以工作,但您只需爲流程提供不必要的權限即可。 – ahmd0

+0

此外,您調整令牌權限的代碼也是錯誤的。你應該在調用'AdjustTokenPrivileges()'後調用'GetLastError()'並確保它返回'ERROR_SUCCESS',以確保所請求的特權實際上被授予。 'hToken'句柄被釋放的方式也有內存泄漏....所以我會在那裏停下來。 – ahmd0

相關問題