我想获取进程的用户名并检查它是否是本地管理员。或直接检查当前处方用户是否为本地管理员
答案 0 :(得分:3)
使用 GetUserName()获取当前用户名,然后使用服务器名称(本地为NULL)和您刚刚获得的用户名调用NetUserGetInfo()。传递USER_INFO_1结构,然后访问结构中的 usri1_priv 。如果值为 USER_PRIV_ADMIN ,那么您将知道用户名是管理员。
答案 1 :(得分:2)
使用管理员用户和非管理员用户在Windows XP SP3,Windows 7 32位和64位上进行测试。 代码从等效的C#移植并使用ATL窗口安全包装类。
#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;
}
答案 2 :(得分:0)
假设你在Window OS上有一个shell函数: IsUserAnAdmin
请参阅MSDN article
本文建议滚动您自己的功能,使用 CheckTokenMembership 。甚至还有一个代码示例可以帮助您。