我的问题
我正在使用PInvoked Windows API函数来验证用户是否属于本地管理员组。我正在使用GetCurrentProcess
,OpenProcessToken
,GetTokenInformation
和LookupAccountSid
来验证用户是否是本地管理员。GetTokenInformation
返回具有TOKEN_GROUPS
结构数组的SID_AND_ATTRIBUTES
结构。我遍历集合并比较LookupAccountSid
返回的用户名。
我的问题是,在本地(或更普遍地说,在我们内部的域中),这按预期工作。 Builtin \ Administrators位于当前流程令牌的组成员身份内,并且我的方法返回true。在另一个开发人员的另一个域上,该函数返回false。LookupAccountSid
在TOKEN_GROUPS
结构的前2次迭代中正常运行,返回None和Everyone,然后抱怨说“参数错误”。
是什么导致仅两个组正常工作?TOKEN_GROUPS
结构指示有14个组。我假设这是无效的SID。
我已经调用了PInvoke website上的示例的所有内容。唯一的区别是使用LookupAccountSid
我将Sid
参数从byte[]
更改为IntPtr
,因为SID_AND_ATTRIBUTES
也是用IntPtr
定义的。因为LookupAccountSid
是用PSID定义的,可以吗?
LookupAccountSid PInvoke
[DllImport("advapi32.dll", CharSet = CharSet.Auto, SetLastError = true)]
static extern bool LookupAccountSid(
string lpSystemName,
IntPtr Sid,
StringBuilder lpName,
ref uint cchName,
StringBuilder ReferencedDomainName,
ref uint cchReferencedDomainName,
out SID_NAME_USE peUse);
代码落在哪里
for (int i = 0; i < usize; i++)
{
accountCount = 0;
domainCount = 0;
//Get Sizes
LookupAccountSid(null, tokenGroups.Groups[i].SID, null, ref accountCount, null,
ref domainCount, out snu);
accountName2.EnsureCapacity((int) accountCount);
domainName.EnsureCapacity((int) domainCount);
if (!LookupAccountSid(null, tokenGroups.Groups[i].SID, accountName2, ref accountCount, domainName,
ref domainCount, out snu))
{
//Finds its way here after 2 iterations
//But only in a different developers domain
var error = Marshal.GetLastWin32Error();
_log.InfoFormat("Failed to look up SID's account name. {0}", new Win32Exception(error).Message);
continue;
}
如果需要更多代码,请告诉我。任何帮助将不胜感激。
最佳答案
听起来您正在尝试复制NetUserGetLocalGroups
的功能。您还可以使用信息级别为1的NetUserGetInfo
,并检查usri1_priv
中USER_INFO_1
的USER_PRIV_ADMIN
值。