指定せずにLDAPからすべての属性/値のリストを取得することは可能ですか?
返す属性のリストで唯一の値として「*」を指定します。
操作属性も必要な場合は、リストに「+」を追加します。
// This will list ALL the properties from AD (between 200 and 800..or more)
// If someone has a solution for non AD servers please post it!
List<String> properties = new List<String>();
IPAddress[] ips = Dns.GetHostAddresses(Server).Where(w => w.AddressFamily == System.Net.Sockets.AddressFamily.InterNetwork).ToArray();
if (ips.Length > 0)
{
DirectoryContext directoryContext = new DirectoryContext(DirectoryContextType.DirectoryServer, ips[0].ToString() + ":389", Username, Password);
ActiveDirectorySchema adschema = ActiveDirectorySchema.GetSchema(directoryContext);
ActiveDirectorySchemaClass adschemaclass = adschema.FindClass("User");
// Read the OptionalProperties & MandatoryProperties
ReadOnlyActiveDirectorySchemaPropertyCollection propcol = adschemaclass.GetAllProperties();
foreach (ActiveDirectorySchemaProperty schemaProperty in propcol)
properties.Add(schemaProperty.Name.ToLower());
}
ディレクトリに関する限り、「すべての属性を取得する」だけでは意味がありません。もしかして:
また、一部のユーザー属性は読み取り専用になり、他のユーザー属性は特定の値でのみ書き込むことができるという事実は気にしません。コンテンツを取得する方法を追加します。
@Ghostfireは、価値のあるすべてのユーザー属性と操作属性を取得するためのソリューションを提供します。
DirectoryEntry deUser = new DirectoryEntry("LDAP://WM2008R2ENT:389/CN=AUser,OU=MonOu,DC=dom,DC=fr");
foreach (string property in deUser.Properties.PropertyNames)
{
Console.WriteLine("\t{0} : {1} ", property, deUser.Properties[property][0]);
}
しかし、LDAP検索では、取得したい属性を与えることが最善の方法であることを忘れないでください。
/* Connection to Active Directory
*/
DirectoryEntry deBase = new DirectoryEntry("LDAP://WM2008R2ENT:389/dc=dom,dc=fr");
/* Directory Search
*/
DirectorySearcher dsLookFor = new DirectorySearcher(deBase);
dsLookFor.Filter = "(sn=users)";
dsLookFor.SearchScope = SearchScope.Subtree;
dsLookFor.PropertiesToLoad.Add("cn");
dsLookFor.PropertiesToLoad.Add("givenName");
dsLookFor.PropertiesToLoad.Add("telephoneNumber");
dsLookFor.Sort = new SortOption("givenName", SortDirection.Descending);
dsLookFor.VirtualListView = new DirectoryVirtualListView(1, 0, 2);
SearchResultCollection srcUsers = dsLookFor.FindAll();
DirectoryEntryを使用してプロパティのリストを生成できますが、プロパティのリストを調べるには、もちろんfor eachを使用する必要があります。
DirectoryEntry objADAM = default(DirectoryEntry);
string properties = string.Empty;
foreach (string property in objADAM.Properties.PropertyNames)
{
properties += property + ", ";
}
ただし、常に参照できます http://www.codeproject.com/KB/system/everythingInAD.aspx C#とActive Directoryに関しては。
更新: http://www.codeproject.com/Articles/18102/Howto-Almost-Everything-In-Active-Directory-via-C
可能なすべてのプロパティのリストについては、特定のobjectClassのスキーマのクエリを参照する必要があります。
ADSI Editは、問題を把握するのに役立つ優れたツールです。この場合、スキーマデータの後になります。 ADSI Editを開くとき、[接続先...]を選択してから、よく知られている名前付けコンテキストで[スキーマ]を選択します...これで、さまざまなスキーマクラスを見ることができます:(subSchema、classSchema、attributeSchema) ...
トリッキーなのは、classSchemaを選択し、その「schemaIDGUID」を取得する必要があることを知っていることです...その後、すべてのattributeSchemaで検索を行い、「schemaIDGUID」でフィルター処理します
例「CN = User」を選択すると、schemaIDGUID == bf967aba-0de6-11d0-a285-00aa003049e2に気付くでしょう。
次に、「CN = Pwd-Last-Set」を選択すると、schemaIDGUIDが一致することがわかります。
これがすべて述べられているので、おそらくActiveDirectorySchemaClassを使用する方がはるかに簡単です(Davidが答えたように)が、いくつかの知識を共有したいと思いました。