我的问题
我正在使用PInvoked Windows API函数来验证用户是否属于本地管理员组。我正在使用GetCurrentProcess
,OpenProcessToken
,GetTokenInformation
和LookupAccountSid
来验证用户是否是本地管理员。
GetTokenInformation
返回一个TOKEN_GROUPS
结构,其中包含SID_AND_ATTRIBUTES
个结构数组。我遍历集合并比较LookupAccountSid
返回的用户名。
我的问题是,在本地(或更常见地在我们的内部域),这可以按预期工作。内置\ Administrators位于当前进程令牌的组成员身份中,我的方法返回true。在另一个开发人员的另一个域上,该函数返回false。
LookupAccountSid
在TOKEN_GROUPS
结构的前2次迭代中正常运行,返回None和Everyone,然后粗暴地抱怨“A参数不正确”。
什么会导致只有两个群组正常工作?
TOKEN_GROUPS
结构表示有14个组。我假设它是无效的SID。
我所拥有的所有内容我都是从PInvoke website上的一个例子中得到的。唯一的区别是使用LookupAccountSid
我已将Sid
参数从byte[]
更改为IntPtr
,因为SID_AND_ATTRIBUTES
也定义为{{1} }}。这是正确的,因为IntPtr
是用PSID定义的吗?
LookupAccountSid PInvoke
LookupAccountSid
代码落在哪处
[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);
如果需要更多代码,请与我们联系。任何帮助将不胜感激。
答案 0 :(得分:2)
听起来您正在尝试复制NetUserGetLocalGroups
的功能。您还可以使用信息级别为1的NetUserGetInfo
,并在usri1_priv
USER_PRIV_ADMIN
中查看{{1}}的值。
答案 1 :(得分:2)
我不确定NetUserGetLocalGroups是否知道拒绝SID(如果您需要验证当前进程(不是用户帐户!)是否在管理组中,则必须处理拒绝SID)
如果您只需要支持2000及更高版本,PInvoke CheckTokenMembership(该MSDN页面具有IsUserAdmin示例函数)
在NT4上,您需要从GetTokenInformation获取TokenGroups数组,但是您不需要调用LookupAccountSid,只需在每个项目上调用EqualSid,并将其与您使用AllocateAndInitializeSid创建的管理组SID(...,SECURITY_BUILTIN_DOMAIN_RID,。 ..)