确定用户是否在本地管理员组中

时间:2010-06-17 17:54:06

标签: c# .net winapi pinvoke

我的问题

我正在使用PInvoked Windows API函数来验证用户是否属于本地管理员组。我正在使用GetCurrentProcessOpenProcessTokenGetTokenInformationLookupAccountSid来验证用户是否是本地管理员。

GetTokenInformation返回一个TOKEN_GROUPS结构,其中包含SID_AND_ATTRIBUTES个结构数组。我遍历集合并比较LookupAccountSid返回的用户名。

我的问题是,在本地(或更常见地在我们的内部域),这可以按预期工作。内置\ Administrators位于当前进程令牌的组成员身份中,我的方法返回true。在另一个开发人员的另一个域上,该函数返回false。

LookupAccountSidTOKEN_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);

如果需要更多代码,请与我们联系。任何帮助将不胜感激。

2 个答案:

答案 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,。 ..)