Est-ce possible? L'exemple de code serait Nice.
En fait, la question était de savoir comment obtenir deux des propriétés d'un .NET 3.5 (System.DirectoryServices.AccountManagement.)UserPrincipal
- objet ne recevant pas userPrincipalName
.
Voici comment faire cela avec une méthode d'extension :
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.DirectoryServices;
using System.DirectoryServices.AccountManagement;
namespace MyExtensions
{
public static class AccountManagementExtensions
{
public static String GetProperty(this Principal principal, String property)
{
DirectoryEntry directoryEntry = principal.GetUnderlyingObject() as DirectoryEntry;
if (directoryEntry.Properties.Contains(property))
return directoryEntry.Properties[property].Value.ToString();
else
return String.Empty;
}
public static String GetCompany(this Principal principal)
{
return principal.GetProperty("company");
}
public static String GetDepartment(this Principal principal)
{
return principal.GetProperty("department");
}
}
}
Le code ci-dessus fonctionnera dans la plupart des cas (c'est-à-dire qu'il fonctionnera pour les attributs Active Directory à valeur unique texte/chaîne standard). Vous devrez modifier le code et ajouter plus de code de gestion des erreurs pour votre environnement.
Vous l'utilisez en ajoutant la "Classe d'extension" à votre projet et vous pouvez ensuite faire ceci:
PrincipalContext domain = new PrincipalContext(ContextType.Domain);
UserPrincipal userPrincipal = UserPrincipal.FindByIdentity(domain, "youruser");
Console.WriteLine(userPrincipal.GetCompany());
Console.WriteLine(userPrincipal.GetDepartment());
Console.WriteLine(userPrincipal.GetProperty("userAccountControl"));
(BTW; cela aurait été très utile pour les propriétés d'extension - dommage qu'il ne soit pas non plus en C # 4 .)
Quelque chose comme ça devrait le faire si les propriétés du département et de l'entreprise existent pour l'utilisateur.
DirectoryEntry de = new DirectoryEntry();
de.Path = "LDAP://dnsNameOfYourDC.my.company.com";
DirectorySearcher deSearch = new DirectorySearcher(de);
deSearch.PropertiesToLoad.Add("department");
deSearch.PropertiesToLoad.Add("company");
deSearch.SearchScope = SearchScope.Subtree;
deSearch.Filter = "(&(objectClass=User)(userPrincipalName=MyPrincipalName))";
SearchResultCollection results = deSearch.FindAll():
foreach (SearchResult result in results)
{
ResultPropertyCollection props = result.Properties;
foreach (string propName in props.PropertyNames)
{
//Loop properties and pick out company,department
string tmp = (string)props[propName][0];
}
}