我目前正在尝试编写一个允许我为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
只有postalCode
来自additionalAttributes
字符串。即使我将*
添加到应加载的属性profilePath
,也会丢失。那么我可以尝试做些什么来找出缺少属性的原因?
我尝试过的其他事情:
Get-ADUser <user> -Properties *
返回的属性数与此方式返回的属性数进行比较。结果是cmdlet返回更多属性(大约2倍)。由于其中一些肯定是经过计算的(例如AccountExpirationDate
和AccoutnExpires
),我不确定它是否是一个很好的指标。答案 0 :(得分:1)
如果其他人遇到同样的问题,您应该确保您的路径/连接字符串是正确的。在这种情况下(如GC://
所示)我绑定到全局编录和全局编录doesn't contain all attributes。如果您确实想查询LDAP,请使用LDAP://
provider ...