2016-12-05 54 views
1

對於一個小工具,應用程序,我在工作中寫,我有以下的代碼,以確定當前用戶帳戶是本地或域管理員:確定當前用戶帳戶屬於哪個組?

WCHAR wszUser[UNLEN]; 

    GetEnvironmentVariableW(L"username", wszUser, UNLEN); 

#ifndef _DEBUG 
    if (StrCmpIW(wszUser, L"Administrator") != 0) 
    { 
     MessageBoxW(0, L"This program can only be run as Administrator.", L"Error", MB_OK | MB_ICONSTOP); 
     return 0; 
    } 
#endif 

這個權利現在在我們的情況,因爲:

  1. 我們的域管理員帳戶是內置的Administrator帳戶
  2. 我們沒有任何其他域管理員帳戶。

但是,我意識到這是一個糟糕的解決方案,因爲將來我們可能會添加其他域管理員帳戶。有沒有一種方法可以確定使用Windows API,該進程所運行的用戶帳戶是否屬於Domain Admins組或BUILTIN\Administrators,或者不是?

這不是一個安全問題,因爲除非應用程序以管理員身份運行,否則該應用程序實際上無法執行任何有用的操作,這僅僅是爲了提高可靠性。

+2

在這種情況下,正確的解決方案是使用'/ MANIFESTUAC:level = requireAdministrator'鏈接器選項,或者如果您已經有一個清單,請添加一個'requestedExecutionLevel'條目,其中'level =「requireAdministrator」'[如此處所述](https://www.codeproject.com/articles/17968/making-your-application-uac-aware)。 –

+1

如果因爲某些其他原因需要檢索組信息,請參閱http://stackoverflow.com/questions/10450998/need-to-retrieve-all-groups-a-user-belongs-to-in-c。但在這種情況下,我同意@HarryJohnston。 – gnud

回答

3

在這種情況下,正確的解決方案是設置/MANIFESTUAC:level=requireAdministrator鏈接器選項,或者如果您已經有清單,請添加requestedExecutionLevel條目as described here

這樣,Windows將拒絕在沒有提升特權的情況下運行該程序,並且您不需要在代碼中執行任何操作。這也將使用戶更容易,因爲他們不必顯式運行提升的代碼以使其工作; Windows會根據需要提示他們。

但是,如果你真的想要以編程方式執行,see the documentation for the CheckTokenMembership function,它甚至有示例代碼,完全符合你的要求。 :-)

相關問題