这个广告查询代码有什么差距?

时间:2018-04-23 19:56:27

标签: c# .net active-directory

我正在使用ETL将AD用户存储在本地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));
}

问题是,对于这些用户中的大约一半,上面填充到groupUsers列表中的用户guid与用户DisplayName直接AD查询返回的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 user2 = allUsers.Where(x => 
            x.DisplayName == groupUser.Item3 + ", " + groupUser.Item2).FirstOrDefault();        
    }

知道问题可能是什么?我需要根据AD用户的Guid的db查找返回每个用户的数据库表示。

  • 两个代码块始终为相应代码块中的同一用户返回相同的guid
  • 第一个代码块中返回的大约1/2个用户guids与第二个代码块中返回的用户guid相匹配
  • 第一个代码块中返回的大约一半的用户guid 与第二个代码块中返回的用户guid不匹配

知道可能导致这种差异的原因吗?

1 个答案:

答案 0 :(得分:0)

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

对于快速测试,您可以修改第二个代码块,以便在找到多个帐户时抛出异常。如果您遇到异常,那么您就知道问题所在:

std::getline()