【发布时间】:2017-02-02 17:24:17
【问题描述】:
我目前正在尝试编写一个函数,该函数允许我为 Active Directory 用户获取许多附加属性。为了获得这些属性,我使用了System.DirectoryServices.DirectorySearcher,它确实适用于postalCode 或physicalDeliveryOfficeName 等某些属性,但不适用于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();
}
}
}
如果我调试该代码,我可以看到 postalCode 和 profilePath 都添加到应加载的属性列表中,但结果 user 只有来自 additionalAttributes 字符串的 postalCode。即使我将* 添加到应该加载的属性中,profilePath 也会丢失。那么我可以尝试做些什么来找出属性缺失的原因呢?
我尝试过的其他事情:
- 使用以下凭据检查属性是否可见(它们是可见的):
- AD 用户和计算机 MMC
- LDP
- 将
Get-ADUser <user> -Properties *返回的属性数与以这种方式返回的属性数进行比较。结果是 cmdlet 返回更多属性(约 2 倍)。因为其中一些肯定是计算出来的(例如AccountExpirationDate和AccoutnExpires),所以我不确定它是否是一个好的指标。 - 验证属性是否实际分配了值。
【问题讨论】:
标签: c# active-directory