2009-06-11 148 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; 
} 
相关问题