代码之家  ›  专栏  ›  技术社区  ›  Tony Edgecombe

如何检查用户在win32中是否具有本地管理员权限

  •  7
  • Tony Edgecombe  · 技术社区  · 17 年前

    如何检查用户在Win32中有C++的本地管理员权限

    2 回复  |  直到 17 年前
        1
  •  9
  •   Community Mohan Dere    11 年前

    刚找到 IsUserAnAdmin() 在shlobj.h为我做这项工作。

        2
  •  4
  •   Len Holgate    17 年前

    你可能需要更多的东西来处理海拔等等。。。

    我是这样做的。。。。

    bool CProcessToken::IsUserAnAdmin() const
    {
    #if _WIN32_WINNT >= 0x0600 
    
       bool isAdmin = false;
    
       DWORD bytesUsed = 0;
    
       TOKEN_ELEVATION_TYPE tokenElevationType;
    
       if (!::GetTokenInformation(m_hToken, TokenElevationType, &tokenElevationType, sizeof(tokenElevationType), &bytesUsed))
       {
          const DWORD lastError = ::GetLastError();
    
          throw CWin32Exception(_T("CProcessToken::IsUserAnAdmin() - GetTokenInformation - TokenElevationType"), lastError);
       }
    
       if (tokenElevationType == TokenElevationTypeLimited)
       {
          CSmartHandle hUnfilteredToken;
    
          if (!::GetTokenInformation(m_hToken, TokenLinkedToken, reinterpret_cast<void *>(hUnfilteredToken.GetHandle()), sizeof(HANDLE), &bytesUsed))
          {
             const DWORD lastError = ::GetLastError();
    
             throw CWin32Exception(_T("CProcessToken::IsUserAnAdmin() - GetTokenInformation - TokenLinkedToken"), lastError);
          }
    
          BYTE adminSID[SECURITY_MAX_SID_SIZE];
    
          DWORD sidSize = sizeof(adminSID);
    
          if (!::CreateWellKnownSid(WinBuiltinAdministratorsSid, 0, &adminSID, &sidSize))
          {
             const DWORD lastError = ::GetLastError();
    
             throw CWin32Exception(_T("CProcessToken::IsUserAnAdmin() - CreateWellKnownSid"), lastError);
          }
    
          BOOL isMember = FALSE;
    
          if (::CheckTokenMembership(hUnfilteredToken, &adminSID, &isMember))
          {
             const DWORD lastError = ::GetLastError();
    
             throw CWin32Exception(_T("CProcessToken::IsUserAnAdmin() - CheckTokenMembership"), lastError);
          }
    
          isAdmin = (isMember != FALSE);
       }
       else
       {
          isAdmin = ToBool(::IsUserAnAdmin());         
       }
    
       return isAdmin;
    
    #else
       return ToBool(::IsUserAnAdmin());         
    #endif
    }