使用DirectorySearcher检索某些属性不会返回值

时间:2017-02-01 14:17:25

标签: c# active-directory

我目前正在尝试编写一个允许我为Active Directory用户获取许多其他属性的函数。要使用System.DirectoryServices.DirectorySearcher来获取这些属性,它适用于某些属性,例如postalCodephysicalDeliveryOfficeName,但不适用于profilePath和我这样的其他属性困惑的原因。

我使用的代码与以下内容类似:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.DirectoryServices;

namespace ADReaderTest
{
    class Program
    {
        static void Main(string[] args)
        {
            string name = "doe";
            string additionalAttributes = "postalCode,profilePath";
            DirectoryEntry adConnection = 
              new DirectoryEntry("GC://DC=contoso,DC=local", "CONTOSO\\User", "Password");
            DirectorySearcher adSearch = new DirectorySearcher(adConnection);
            adSearch.PropertiesToLoad.Add("cn");
            adSearch.PropertiesToLoad.Add("SamAccountName");
            adSearch.PropertiesToLoad.Add("objectSID");

            foreach(string attribute in additionalAttributes.Split(',')){
                adSearch.PropertiesToLoad.Add(attribute);
            }

            adSearch.Filter = "(&(|((&objectCategory=person)(objectClass=user))(objectCategory=group))(cn=*" + name + "*))";

            SearchResultCollection adSearchResult = adSearch.FindAll();

            Console.WriteLine("There were " + adSearchResult.Count + " matches for *" + name + "*");
            foreach(SearchResult user in adSearchResult)
            {
                Console.WriteLine("Listing Properties for " + user.Path);
                foreach (string prop in user.Properties.PropertyNames) {
                    Console.WriteLine("Prop: " + prop);
                    for(int i = 0; i < user.Properties[prop].Count; i++){
                        Console.WriteLine("\t" + user.Properties[prop][i].ToString());
                    }
                }
            }

            Console.ReadLine();
        }
    }
}

如果我调试该代码,我可以看到postalCodeprofilePath都被添加到应加载的属性列表中,但结果user只有postalCode来自additionalAttributes字符串。即使我将*添加到应加载的属性profilePath,也会丢失。那么我可以尝试做些什么来找出缺少属性的原因?

我尝试过的其他事情:

  • 使用凭据使用以下内容检查属性是否可见(它们是)
    • AD用户和计算机MMC
    • LDP
  • Get-ADUser <user> -Properties *返回的属性数与此方式返回的属性数进行比较。结果是cmdlet返回更多属性(大约2倍)。由于其中一些肯定是经过计算的(例如AccountExpirationDateAccoutnExpires),我不确定它是否是一个很好的指标。
  • 验证属性是否实际分配了值。

1 个答案:

答案 0 :(得分:1)

如果其他人遇到同样的问题,您应该确保您的路径/连接字符串是正确的。在这种情况下(如GC://所示)我绑定到全局编录和全局编录doesn't contain all attributes。如果您确实想查询LDAP,请使用LDAP:// provider ...