Comment puis-je faire une boucle à travers une collecte PropertyCollection
est-ce que quelqu'un peut fournir un exemple de boucle à travers un système?DirectoryServices.PropertyCollection et sortie du nom et de la valeur de la propriété?
j'utilise C#.
@JaredPar-la collection PropertyCollection n'a pas de propriété Nom/Valeur. Il a un PropertyNames et des valeurs, type Système.Collection.ICollection. Je ne connais pas le type d'objet basline qui constitue L'objet PropertyCollection.
@JaredPar à nouveau - j'ai à l'origine mal étiqueté le question avec le mauvais type. C'était mon mauvais.
mise à Jour: basé sur L'entrée de Zhaph - Ben Duguid, j'ai pu développer le code suivant.
using System.Collections;
using System.DirectoryServices;
public void DisplayValue(DirectoryEntry de)
{
if(de.Children != null)
{
foreach(DirectoryEntry child in de.Children)
{
PropertyCollection pc = child.Properties;
IDictionaryEnumerator ide = pc.GetEnumerator();
ide.Reset();
while(ide.MoveNext())
{
PropertyValueCollection pvc = ide.Entry.Value as PropertyValueCollection;
Console.WriteLine(string.Format("Name: {0}", ide.Entry.Key.ToString()));
Console.WriteLine(string.Format("Value: {0}", pvc.Value));
}
}
}
}
10 réponses
la collection PropertyCollection a une collection PropertyName - qui est une collection de chaînes (voir PropertyCollection.Contient et PropertyCollection.L'élément tous deux prendre une corde).
habituellement, Vous pouvez appeler GetEnumerator pour vous permettre d'énumérer au - dessus de la collection, en utilisant les méthodes habituelles d'énumération-dans ce cas, vous obtiendriez un Idicule contenant la clé de chaîne, puis un objet pour chaque item/valeurs.
voir la valeur de PropertyValueCollection à l'exécution dans la fenêtre watch pour identifier les types d'éléments, il contient et vous pouvez l'étendre pour voir plus loin quelle propriété possède chacun des éléments.
Ajout au code de @JaredPar
PropertyCollection collection = GetTheCollection();
foreach ( PropertyValueCollection value in collection ) {
// Do something with the value
Console.WriteLine(value.PropertyName);
Console.WriteLine(value.Value);
Console.WriteLine(value.Count);
}
EDIT: PropertyCollection est composé de Proprietyvaluecollection
usr = result.GetDirectoryEntry();
foreach (string strProperty in usr.Properties.PropertyNames)
{
Console.WriteLine("{0}:{1}" ,strProperty, usr.Properties[strProperty].Value);
}
foreach(var k in collection.Keys)
{
string name = k;
string value = collection[k];
}
EDIT j'ai mal interprété L'OP comme ayant dit que la perception de la valeur de la propriété n'était pas une perception correcte. Quitter post up parce que d'autres postes le référencent.
Je ne suis pas sûr de comprendre ce que vous demandez voulez-vous simplement faire le tour de chaque valeur de la collection? Si ce code fonctionne
PropertyValueCollection collection = GetTheCollection();
foreach ( object value in collection ) {
// Do something with the value
}
imprimer le nom / la valeur
Console.WriteLine(collection.Name);
Console.WriteLine(collection.Value);
Vous n'avez vraiment pas à faire quelque chose de magique si vous voulez juste quelques articles...
Utilisation Des Déclarations: Système, Système.DirectoryServices, et du Système.AccountManagement
public void GetUserDetail(string username, string password)
{
UserDetail userDetail = new UserDetail();
try
{
PrincipalContext principalContext = new PrincipalContext(ContextType.Domain, "mydomain.com", username, password);
//Authenticate against Active Directory
if (!principalContext.ValidateCredentials(username, password))
{
//Username or Password were incorrect or user doesn't exist
return userDetail;
}
//Get the details of the user passed in
UserPrincipal userPrincipal = UserPrincipal.FindByIdentity(principalContext, principalContext.UserName);
//get the properties of the user passed in
DirectoryEntry directoryEntry = userPrincipal.GetUnderlyingObject() as DirectoryEntry;
userDetail.FirstName = directoryEntry.Properties["givenname"].Value.ToString();
userDetail.LastName = directoryEntry.Properties["sn"].Value.ToString();
}
catch (Exception ex)
{
//Catch your Excption
}
return userDetail;
}
j'ai posté ma réponse sur un autre fil, puis trouvé ce fil de poser une question similaire.
j'ai essayé les méthodes suggérées, mais j'obtiens toujours une exception de cast invalide en casting à DictionaryEntry. Et avec un dictionnaire, les choses comme FirstOrDefault sont funky. Donc, j'ai simplement faire ceci:
var directoryEntry = adUser.GetUnderlyingObject() as DirectoryEntry;
directoryEntry.RefreshCache();
var propNames = directoryEntry.Properties.PropertyNames.Cast<string>();
var props = propNames
.Select(x => new { Key = x, Value = directoryEntry.Properties[x].Value.ToString() })
.ToList();
avec cela en place, je peux alors facilement rechercher n'importe quelle propriété directement par clé. L'utilisation des opérateurs de coalesce et de la navigation sûre permet de une corde vide ou autre..
var myProp = props.FirstOrDefault(x => x.Key == "someKey"))?.Value ?? string.Empty;
et si je voulais regarder tous les accessoires, c'est un avant-bras similaire.
foreach (var prop in props)
{
Console.WriteLine($"{prop.Key} - {prop.Value}");
}
notez que l'objet" adUser " est L'objet UserPrincipal.
public string GetValue(string propertyName, SearchResult result)
{
foreach (var property in result.Properties)
{
if (((DictionaryEntry)property).Key.ToString() == propertyName)
{
return ((ResultPropertyValueCollection)((DictionaryEntry)property).Value)[0].ToString();
}
}
return null;
}
je ne sais pas pourquoi c'était si dur de trouver une réponse, mais avec le code ci-dessous je peux parcourir l'ensemble des propriétés et tirez celui que je veux et réutiliser le code pour n'importe quelle propriété. Vous pouvez gérer l'entrée de répertoire partie différemment si vous voulez
getAnyProperty("[servername]", @"CN=[cn name]", "description");
public List<string> getAnyProperty(string originatingServer, string distinguishedName, string propertyToSearchFor)
{
string path = "LDAP://" + originatingServer + @"/" + distinguishedName;
DirectoryEntry objRootDSE = new DirectoryEntry(path, [Username], [Password]);
// DirectoryEntry objRootDSE = new DirectoryEntry();
List<string> returnValue = new List<string>();
System.DirectoryServices.PropertyCollection properties = objRootDSE.Properties;
foreach (string propertyName in properties.PropertyNames)
{
PropertyValueCollection propertyValues = properties[propertyName];
if (propertyName == propertyToSearchFor)
{
foreach (string propertyValue in propertyValues)
{
returnValue.Add(propertyValue);
}
}
}
return returnValue;
}