我的问题

我正在使用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 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_privUSER_INFO_1USER_PRIV_ADMIN值。

10-04 21:17