如何检查用户是不是在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 - 检查用户是不是具有管理员权限(基于令牌的身份验证)