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

Posted

技术标签:

【中文标题】如何检查用户是不是在win32中具有本地管理员权限【英文标题】:How do I check if a user has local admin privileges in win32如何检查用户是否在win32中具有本地管理员权限 【发布时间】:2009-02-24 10:16:05 【问题描述】:

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

【问题讨论】:

欺骗? ***.com/questions/560366/…答案指向win32 api解决方案。 与Vista下的UAC不完全相同。 “以管理员权限运行”现在意味着用户具有管理员权限并在启动进程时使用它们。 【参考方案1】:

刚刚在 shlobj.h 中找到了 IsUserAnAdmin(),它为我完成了这项工作。

【讨论】:

成为管理员并不意味着当前进程以提升的权限运行 警告:IsUserAnAdmin() 已被弃用:“它可能在后续版本中被更改或不可用。”最后支持的客户端版本:Windows Vista! oli 幸运的是,我只需要它来支持 XP,Vista 和更高版本我可以检查提升。 仅适用于 XP 和 Vista,不适用于 Windows 7 8 或 10【参考方案2】:

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

我就是这样做的……

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

我不记得我从哪里得到信息来编写那段代码......

【讨论】:

幸运的是,当我在清单中请求提升时,我现在可以忽略提升,这仅适用于 Vista 之前的安装。 @Len Holgate 你知道这是否也适用于域管理员的成员(不仅仅是本地机器管理员,我验证它工作正常) m_hToken 未定义,CWin32Exception 未定义,CSmartHandle 未定义,ToBool() 未定义。因此,此代码仅在 _WIN32_WINNT 它不应该是可编译的,它只是显示要进行的 API 调用 - 自己填写详细信息。

以上是关于如何检查用户是不是在win32中具有本地管理员权限的主要内容,如果未能解决你的问题,请参考以下文章

Nodejs/mongodb - 检查用户是不是具有管理员权限(基于令牌的身份验证)

win10怎么获取system权限

win32 检查账户是不是登录

如何确定用户是不是具有管理员权限?

GitLab CE API:检查使用的令牌是不是具有管理员权限

检查其他用户是不是对 linux 上的文件具有读/写权限