繁体   English   中英

识别用户是否在本地管理员组中

[英]Identifying if a user is in the local administrators group

我的问题

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

GetTokenInformation返回带有TOKEN_GROUPS结构数组的SID_AND_ATTRIBUTES结构。 我遍历集合并比较LookupAccountSid返回的用户名。

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

LookupAccountSidTOKEN_GROUPS结构的前2次迭代中正常运行,返回None和Everyone,然后抱怨“参数不正确”。

是什么导致仅两个组正常工作?

TOKEN_GROUPS结构指示有14个组。 我假设这是无效的SID。

我已经调用了PInvoke 网站上的所有示例。 唯一的区别是,通过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 ,并在USER_INFO_1USER_PRIV_ADMIN检查usri1_priv的值。

我不确定NetUserGetLocalGroups是否了解拒绝SID(如果您需要验证当前进程(不是用户帐户!)是否在admin组中,则必须处理拒绝SID。

如果只需要支持2000及更高版本,则可以使用PInvoke CheckTokenMembership (该MSDN页面具有IsUserAdmin示例功能)

在NT4上,您需要从GetTokenInformation获取TokenGroups数组,但不调用LookupAccountSid,您只需在每个项目上调用EqualSid,然后将其与使用AllocateAndInitializeSid(...,SECURITY_BUILTIN_DOMAIN_RID,...)创建的管理组SID进行比较。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM