我正在尝试使用目录服务查询到全局编录来获取有关用户组成员身份的详细信息。我不想使用GetAuthorizationGroups()
因为它是片状的。
有两个域:DomainA和DomainB。全局编录服务器是DomainB的域控制器。最后,有一个用户(UserA)是DomainA的一部分。
我在全局目录中找到UserA并查看tokenGroups
属性以获取UserA所属的所有组的SID。
令我惊讶的是,我发现列表中包含DomainB\Domain Users
。 为什么包含UserA,因为UserA不属于DomainB?
这是我正在运行的代码:
using (DirectoryEntry gc = new DirectoryEntry("GC:"))
{
string userPrincipalName = "UserA@DomainA.local";
DirectoryEntry searchRoot = null;
gc.AuthenticationType = System.DirectoryServices.AuthenticationTypes.Secure;
// There is only 1 child under "GC:".
foreach (DirectoryEntry de in gc.Children)
{
searchRoot = de;
break;
}
using (searchRoot)
{
SearchResult samResult;
using (var samSearcher = new DirectorySearcher())
{
// Find the user.
samSearcher.SearchRoot = searchRoot;
samSearcher.Filter = "(userPrincipalName=" + userPrincipalName + ")";
samSearcher.PropertiesToLoad.Add("distinguishedName");
samResult = samSearcher.FindOne();
}
List<byte[]> tokenGroups;
using (DirectoryEntry theUser = samResult.GetDirectoryEntry())
{
theUser.RefreshCache(new string[] { "tokenGroups" });
tokenGroups = theUser.Properties["tokenGroups"].Cast<byte[]>().ToList();
IdentityReferenceCollection irc = new IdentityReferenceCollection(tokenGroups.Count);
foreach (byte[] groupSidBytes in tokenGroups)
{
irc.Add(new SecurityIdentifier(groupSidBytes, 0));
}
List<string> groupNames =
irc.Translate(typeof(NTAccount), true)
.Cast<NTAccount>()
.Select(a => a.Value.ToString())
.ToList();
return groupNames;
}
}
}