C# 什么';与此广告查找代码的差距是多少?

C# 什么';与此广告查找代码的差距是多少?,c#,.net,active-directory,C#,.net,Active Directory,我正在使用ETL将广告用户存储在本地SQL Server数据库中。以下AD查找代码填充属于特定组的所有AD用户的Guid、FirstName和LastName: var adPrincipalContext = new PrincipalContext(ContextType.Domain, domainName); var group = GroupPrincipal.FindByIdentity(adPrincipalContext, groupName); var members = gr

我正在使用ETL将广告用户存储在本地SQL Server数据库中。以下AD查找代码填充属于特定组的所有AD用户的Guid、FirstName和LastName:

var adPrincipalContext = new PrincipalContext(ContextType.Domain, domainName);
var group = GroupPrincipal.FindByIdentity(adPrincipalContext, groupName);
var members = group.GetMembers();
var groupUsers = new List<Tuple<Guid, string, string>>();

var enumerator = members.GetEnumerator();
while (enumerator.MoveNext())
{
    var user = enumerator.Current as UserPrincipal;
    groupUsers.Add(new Tuple <Guid, string, string>( 
        (Guid)user.Guid, user.GivenName, user.Surname));
}
知道问题出在哪里吗?我需要根据AD用户Guid的db查找返回每个用户的数据库表示形式

  • 两个代码块在各自的代码块中一致地为同一用户返回相同的guid
  • 第一个代码块中返回的用户guid大约有1/2与第二个代码块中返回的用户guid匹配
  • 第一个代码块中返回的用户GUID中约有1/2与第二个代码块中返回的用户GUID不匹配

知道是什么导致了这种差异吗?

显示名称不必是唯一的。您可能有多个具有相同显示名称的帐户

为了进行快速测试,您可以修改第二个代码块,以便在发现多个帐户时引发异常。如果出现异常,则您知道这就是问题所在:

using (var context = new PrincipalContext(ContextType.Domain, domainName))
{
    // init vars
    var up = new UserPrincipal(context);
    var ps = new PrincipalSearcher(up);
    var allUsers = ps.FindAll().ToList();
    var users = allUsers.Where(x => 
        x.DisplayName == groupUser.Item3 + ", " + groupUser.Item2).ToList();

    if (users.Count > 1) {
        throw new Exception("More than one account found for: " + groupUser.Item3 + ", " + groupUser.Item2)
    }

    var user2 = users.FirstOrDefault();
}
using (var context = new PrincipalContext(ContextType.Domain, domainName))
{
    // init vars
    var up = new UserPrincipal(context);
    var ps = new PrincipalSearcher(up);
    var allUsers = ps.FindAll().ToList();
    var users = allUsers.Where(x => 
        x.DisplayName == groupUser.Item3 + ", " + groupUser.Item2).ToList();

    if (users.Count > 1) {
        throw new Exception("More than one account found for: " + groupUser.Item3 + ", " + groupUser.Item2)
    }

    var user2 = users.FirstOrDefault();
}