2009-06-11 95 views
1

我想獲取進程的用戶名並檢查它是否是本地管理員。或者直接檢查當前procees用戶是本地管理員檢查進程用戶是否爲管理員C++

+2

哪個操作系統?這可能會有所作爲... – crashmstr 2009-06-11 13:46:13

+1

「本地管理員」很可能在Windows上。 – sharptooth 2009-06-11 13:54:40

回答

0

假設你是在一個窗口OS有一個殼功能:IsUserAnAdmin

MSDN article

本文不建議使用您自己的功能儘管如此,使用CheckTokenMembership。甚至有一個代碼示例可以幫助你。

3

獲取當前用戶名和GetUserName(),然後調用NetUserGetInfo()與服務器名稱(NULL爲本地)和您剛剛得到的用戶名。將其傳遞給USER_INFO_1結構,然後在結構中訪問usri1_priv。如果值爲 USER_PRIV_ADMIN,那麼您將知道用戶名是管理員。

2

使用管理員用戶和非管理員用戶在Windows XP SP3,Windows 7 32位和64位上進行測試。 代碼從等效的C#移植並使用ATL Windows安全包裝類。

#include <atlbase.h> 
#include <atlsecurity.h> 

// The function returns true if the user who is running the 
// application is a member of the Administrators group, 
// which does not necessarily mean the process has admin privileges. 
bool IsAdministrator(HRESULT &rHr) 
{ 
    bool bIsAdmin = false; 

    try 
    { 
     // Open the access token of the current process. 
     ATL::CAccessToken aToken; 
     if (!aToken.GetProcessToken(TOKEN_QUERY)) 
     { 
      throw MAKE_SCODE(SEVERITY_ERROR, FACILITY_WIN32, 
       ::GetLastError()); 
     } 


     // Query for the access token's group information. 
     ATL::CTokenGroups groups; 
     if (!aToken.GetGroups(&groups)) 
     { 
      throw MAKE_SCODE(SEVERITY_ERROR, FACILITY_WIN32, 
       ::GetLastError()); 
     } 

     // Iterate through the access token's groups 
     // looking for a match against the builtin admins group. 
     ATL::CSid::CSidArray groupSids; 
     ATL::CAtlArray<DWORD> groupAttribs; 
     groups.GetSidsAndAttributes(&groupSids, &groupAttribs); 
     for (UINT i = 0; !bIsAdmin && i < groupSids.GetCount(); ++i) 
     { 
      bIsAdmin = groupSids.GetAt(i) == ATL::Sids::Admins(); 
     } 
     rHr = S_OK; 
    } 
    catch (HRESULT hr) 
    { 
     rHr = hr; 
    } 

    return bIsAdmin; 
} 
相關問題