快速获取组员资格

我想弄清楚是否当前的Windows用户是本地pipe理员或可以使用UAC来“获得”该组成员。

我到目前为止所看到的是这样的:

var adminIdentifier = new SecurityIdentifier("S-1-5-32-544"); var current = WindowsIdentity.GetCurrent(); bool isAdmin = current.Groups.Contains(adminIdentifier); bool canBeAdmin = isAdmin; if (!isAdmin) { var adminGroupName = adminIdentifier.Translate(typeof(NTAccount)).Value; adminGroupName = adminGroupName.Substring(adminGroupName.LastIndexOf('\\')); string path = "WinNT://./" + adminGroupName + ",group"; using (DirectoryEntry groupEntry = new DirectoryEntry(path)) { foreach (object member in (IEnumerable)groupEntry.Invoke("Members")) { using (DirectoryEntry memberEntry = new DirectoryEntry(member)) { object obVal = memberEntry.Properties["objectSid"].Value; SecurityIdentifier sid = null; if (null != obVal) { sid = new SecurityIdentifier((Byte[])obVal,0); } canBeAdmin = Equals(current.User, sid); if (canBeAdmin) break; } } } } Console.WriteLine(canBeAdmin +" "+isAdmin); 

这个解决scheme需要几毫秒来计算。 比我以前尝试的基于System.DirectoryServices.AccountManagement的方法快得多。

尽pipe如此,还有最后一件事让我困扰。 我必须将pipe理员组的SecurityIdentifier转换为名称。 应该有一种方法可以直接使用SID来获取DirectoryEntry。 根据谷歌,这应该工作:

 string path = "LDAP://<SID=" + adminIdentifier.ToString() + ">"; 

但是,这似乎并不奏效。 任何想法的语法应该是什么样子?

你有没有尝试WindowsPrincipal.IsInRole ?

 WindowsPrincipal wp = new WindowsPrincipal(WindowsIdentity.GetCurrent()); wp.IsInRole(new SecurityIdentifier("S-1-5-32-544")); wp.IsInRole(WindowsBuiltInRole.Administrator); 

您是否尝试过使用与当前用户对应的UserPrincipal对象上的GetAuthorizationGroups? 如果GetAuthorizationGroups不包括机器本地组,则可能需要检查用户是否直接位于本地管理员组中,或者本地管理员组是否包含用户所在的任何授权组。 我还没有尝试过机器上下文,所以我不知道是否你还需要搜索后者匹配的域上下文,如果它不使用域/全局/通用组计算本地组成员使用机器上下文。

这应该是你想要的,除非我误解了:

 var groupName = adminIdentifier.Translate(typeof(NTAccount)).Value;