Abrufen von Suchergebnissen
Jedes Ergebnis, das von DirectorySearcher zurückgegeben wird, kann als SearchResult-Objekt abgerufen werden. Jedes SearchResult-Objekt enthält ein einziges Ergebnis und die zugehörigen Eigenschaften.
Die in den einzelnen SearchResult-Objekten zurückgegebenen Eigenschaften sind in einem ResultPropertyCollection-Objekt enthalten. Die Werte dieser Eigenschaften sind im ResultPropertyValueCollection-Objekt enthalten.
Die FindOne-Methode gibt ein einzelnes SearchResult-Objekt zurück. Im folgenden Beispiel wird veranschaulicht, wie die FindOne-Methode zum Abrufen eines einzelnen SearchResult-Objekts und zum Abrufen der Werte für alle zugehörigen Eigenschaften aus der ResultPropertyValueCollection-Auflistung verwendet wird.
' Bind to a specific user.
Dim path As String
path = "LDAP://CN=User Name,CN=users, DC=fabrikam,DC=com"
Dim entry As New DirectoryEntry(path)
' Create a DirectorySearcher object.
Dim mySearcher As New DirectorySearcher(entry)
mySearcher.SearchScope = SearchScope.Base
' Use the FindOne method to find the user object.
Dim resEnt As SearchResult = mySearcher.FindOne()
Dim propKey As String
For Each propKey In resEnt.Properties.PropertyNames
' Display each of the values for the property
' identified by the property name.
Dim prop As Object
For Each prop In resEnt.Properties(propKey)
Console.WriteLine("{0}:{1}", propKey, [prop].ToString())
Next prop
Next propKey
// Bind to a specific user.
DirectoryEntry entry = new DirectoryEntry(
"LDAP://CN=User Name,CN=users,DC=fabrikam,DC=com");
// Create a DirectorySearcher object.
DirectorySearcher mySearcher = new DirectorySearcher(entry);
mySearcher.SearchScope = SearchScope.Base;
// Use the FindOne method to find the user object.
SearchResult resEnt = mySearcher.FindOne();
foreach(string propKey in resEnt.Properties.PropertyNames)
{
// Display each of the values for the property
// identified by the property name.
foreach (object property in resEnt.Properties[propKey])
{
Console.WriteLine("{0}:{1}", propKey, property.ToString());
}
}
Verwenden Sie die FindAll-Methode, wenn die Suche ein oder mehrere Ergebnisse abrufen soll. Diese Methode gibt eine Auflistung von SearchResult-Objekten zurück, die im SearchResultCollection-Objekt enthalten sind. Verwenden Sie eine foreach-Anweisung, um die SearchResultCollection-Auflistung zu durchlaufen und Daten aus den einzelnen SearchResult-Objekten abzurufen.
Im folgenden Beispiel werden ein Suchfilter mit Platzhalterzeichen und die FindAll-Methode verwendet, um alle Benutzer im Users-Container zu suchen, deren Benutzername mit "test" beginnt. Außerdem werden alle Eigenschaftenwerte der einzelnen Objekte im Resultset aus dem ResultPropertyValueCollection-Objekt abgerufen.
Dim results As SearchResultCollection = Nothing
Try
' Bind to the users container.
Dim path As String = "LDAP://CN=users,DC=fabrikam,DC=com"
path = "LDAP://CN=Users,DC=strohmadom,DC=nttest,DC=microsoft,DC=com"
Dim entry As New DirectoryEntry(path)
' Create a DirectorySearcher object.
Dim mySearcher As New DirectorySearcher(entry)
' Set a filter for users with the name test.
mySearcher.Filter = "(&(objectClass=user)(anr=test*))"
' Use the FindAll method to return objects to a SearchResultCollection.
results = mySearcher.FindAll()
' Iterate through each SearchResult in the SearchResultCollection.
Dim searchResult As SearchResult
For Each searchResult In results
' Display the path of the object found.
Console.WriteLine("Search properties for {0}", _
searchResult.Path)
' Iterate through each property name in each SearchResult.
Dim propertyKey As String
For Each propertyKey In searchResult.Properties.PropertyNames
' Retrieve the value assigned to that property name
' in the ResultPropertyValueCollection.
Dim valueCollection As ResultPropertyValueCollection = searchResult.Properties(propertyKey)
' Iterate through values for each property name in each SearchResult.
Dim propertyValue As Object
For Each propertyValue In valueCollection
' Handle results. Be aware that the following
' WriteLine() only returns readable results for
' properties that are strings.
Console.WriteLine("{0}:{1}", _
propertyKey, _
propertyValue.ToString())
Next propertyValue
Next propertyKey
Next searchResult
Finally
' To prevent memory leaks, always call
' SearchResultCollection.Dispose() manually.
If Not results Is Nothing Then
results.Dispose()
results = Nothing
End If
End Try
SearchResultCollection results = null;
try
{
// Bind to the users container.
string path = "LDAP://CN=users,DC=fabrikam,DC=com";
DirectoryEntry entry = new DirectoryEntry(path);
// Create a DirectorySearcher object.
DirectorySearcher mySearcher = new DirectorySearcher(entry);
// Set a filter for users with the name test.
mySearcher.Filter = "(&(objectClass=user)(anr=test*))";
// Use the FindAll method to return objects to a
// SearchResultCollection.
results = mySearcher.FindAll();
// Iterate through each SearchResult in the SearchResultCollection.
foreach (SearchResult searchResult in results)
{
// Display the path of the object found.
Console.WriteLine("Search properties for {0}", searchResult.Path);
// Iterate through each property name in each SearchResult.
foreach (string propertyKey in
searchResult.Properties.PropertyNames)
{
// Retrieve the value assigned to that property name
// in the ResultPropertyValueCollection.
ResultPropertyValueCollection valueCollection =
searchResult.Properties[propertyKey];
// Iterate through values for each property name in each
// SearchResult.
foreach (Object propertyValue in valueCollection)
{
// Handle results. Be aware that the following
// WriteLine only returns readable results for
// properties that are strings.
Console.WriteLine(
"{0}:{1}",
propertyKey,
propertyValue.ToString());
}
}
}
}
finally
{
// To prevent memory leaks, always call
// SearchResultCollection.Dispose() manually.
if (null != results)
{
results.Dispose();
results = null;
}
}
Um im obigen Codebeispiel lediglich bestimmte Eigenschaftenwerte für die im Resultset zurückgegebenen Objekte abzurufen, können Sie die beiden inneren foreach-Anweisungen durch Anweisungen ersetzen, die die Namen der gewünschten Eigenschaften angeben (siehe folgende Anweisungen).
Console.WriteLine(resEnt1.Properties("cn")(0))
Console.WriteLine(resEnt1.Properties("objectClass")(1))
Console.WriteLine(resEnt1.Properties["cn"][0]);
Console.WriteLine(resEnt1.Properties["objectClass"][1]);
In diesen Anweisungen wird die jeweilige Eigenschaft genannt und indiziert. Wenn die Eigenschaften mehrere Werte enthalten, müssen Sie die Werte auflisten. Weitere Informationen zum Auflisten von Werten für Eigenschaften finden Sie unter Lesen von Eigenschaften mit mehreren Werten.
Eine weitere Option, die das ResultPropertyValueCollection-Objekt bietet, ist die Item-Eigenschaft, die einen Wert an einer bestimmten Indexposition in Eigenschaften abruft, die mehrere Werte enthalten. In Visual Basic .NET wird das Schlüsselwort Item verwendet. In C# handelt es sich bei der Implementierung von Item jedoch um ein Array, das die Indexposition für den abzurufenden Wert enthält. Das folgende Beispiel veranschaulicht die Verwendung von Item.
' Bind to a specific user.
Dim path As String = "LDAP://CN=User Name,CN=users,DC=fabrikam,DC=com"
Dim entry As New DirectoryEntry(path)
' Create a DirectorySearcher object.
Dim searcher As New DirectorySearcher(entry)
' Use the FindOne method to find the object, which in this case, is the user
' indicated by User Name and assign it to a SearchResult.
Dim searchResult As SearchResult = searcher.FindOne()
' Create a ResultPropertyValueCollection object to get the values for the
' memberOf attribute for this user.
Dim propertyName As String = "memberOf"
Dim valueCollection As ResultPropertyValueCollection = searchResult.Properties(propertyName)
Try
' Write the value contained in index position 5 in the memberOf attribute.
Console.WriteLine(valueCollection(5).ToString())
Catch argumentEx As ArgumentOutOfRangeException
' The property contains no value in position 5.
Console.WriteLine("The {0} property contains no value at the specified index.", propertyName)
End Try
// Bind to a specific user.
string path = "LDAP://CN=User Name,CN=users,DC=fabrikam,DC=com";
DirectoryEntry entry = new DirectoryEntry(path);
// Create a DirectorySearcher object.
DirectorySearcher searcher = new DirectorySearcher(entry);
// Use the FindOne method to find the object, which in this case, is the user
// indicated by User Name, and assign it to a SearchResult.
SearchResult searchResult = searcher.FindOne();
// Create a ResultPropertyValueCollection object to get the values for the
// memberOf attribute for this user.
string propertyName = "memberOf";
ResultPropertyValueCollection valueCollection = searchResult.Properties[propertyName];
try
{
// Write the value contained in index position 5 in the memberOf attribute.
Console.WriteLine(valueCollection[5].ToString());
}
catch (ArgumentOutOfRangeException)
{
// The property contains no value in position 5.
Console.WriteLine(
"The {0} property contains no value at the specified index.",
propertyName);
}
Für Suchergebnisse unterstützt System.DirectoryServices nicht die folgenden Rückgabetypen:
- ADS_PROV_SPECIFIC
- ADSTYPE_CASEIGNORE_LIST
- ADSTYPE_OCTET_LIST
- ADSTYPE_PATH
- ADSTYPE_POSTALADDRESS
- ADSTYPE_TIMESTAMP
- ADSTYPE_NETADDRESS
- ADSTYPE_FAXNUMBER
- ADSTYPE_EMAIL
- ADSTYPE_BACKLINK
- ADSTYPE_HOLD
- ADSTYPE_TYPEDNAME
- ADSTYPE_REPLICAPOINTER
- ADSTYPE_UNKNOWN
- ADSTYPE_PROV_SPECIFIC
Siehe auch
Referenz
System.DirectoryServices
DirectorySearcher
SearchResult
SearchResultCollection
ResultPropertyCollection
ResultPropertyValueCollection
Konzepte
Durchsuchen von Verzeichnissen
Lesen von Eigenschaften mit mehreren Werten
Send comments about this topic to Microsoft.
Copyright © 2007 Microsoft Corporation. Alle Rechte vorbehalten.