【问题标题】:Using DirectorySearcher to retrieve certain properties doesn't return a value使用 DirectorySearcher 检索某些属性不会返回值
【发布时间】:2017-02-02 17:24:17
【问题描述】:

我目前正在尝试编写一个函数,该函数允许我为 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 只有来自 additionalAttributes 字符串的 postalCode。即使我将* 添加到应该加载的属性中,profilePath 也会丢失。那么我可以尝试做些什么来找出属性缺失的原因呢?

我尝试过的其他事情:

  • 使用以下凭据检查属性是否可见(它们是可见的):
    • AD 用户和计算机 MMC
    • LDP
  • Get-ADUser &lt;user&gt; -Properties * 返回的属性数与以这种方式返回的属性数进行比较。结果是 cmdlet 返回更多属性(约 2 倍)。因为其中一些肯定是计算出来的(例如AccountExpirationDateAccoutnExpires),所以我不确定它是否是一个好的指标。
  • 验证属性是否实际分配了值。

【问题讨论】:

    标签: c# active-directory


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-08-23
      • 1970-01-01
      • 2020-03-07
      • 1970-01-01
      • 1970-01-01
      • 2023-01-27
      相关资源
      最近更新 更多