Est-il possible de récupérer une liste de tous les attributs/valeurs à partir de LDAP sans spécifier, le cas échéant, comment cela peut-il être possible?
Je récupère la liste de tous les paramètres de mon objet de classe DirectoryEntry. J'espère que cela aidera:
objectClass = System.Object[]
cn = Administrator
sn = Kwiatek (Last name)
c = PL (Country Code)
l = Warszawa (City)
st = Mazowieckie (Voivodeship)
title = .NET Developer
description = Built-in account for administering the computer/domain
postalCode = 00-000
postOfficeBox = Warszawa Ursynów
physicalDeliveryOfficeName = Wojskowa Akademia Techniczna
givenName = Piotr (First name)
distinguishedName = CN=Administrator,CN=Users,DC=helpdesk,DC=wat,DC=edu
instanceType = 4
whenCreated = 2012-11-23 06:09:28
whenChanged = 2013-02-23 13:24:41
displayName = Piotr Kwiatek (Konto administratora)
uSNCreated = System.__ComObject
memberOf = System.Object[]
uSNChanged = System.__ComObject
co = Poland
company = HELPDESK
streetAddress = Kaliskiego 2
wWWHomePage = http://www.piotr.kwiatek.org
name = Administrator
objectGUID = System.Byte[]
userAccountControl = 512
badPwdCount = 0
codePage = 0
countryCode = 616
badPasswordTime = System.__ComObject
lastLogoff = System.__ComObject
lastLogon = System.__ComObject
logonHours = System.Byte[]
pwdLastSet = System.__ComObject
primaryGroupID = 513
objectSid = System.Byte[]
adminCount = 1
accountExpires = System.__ComObject
logonCount = 178
sAMAccountName = Administrator
sAMAccountType = 805306368
objectCategory = CN=Person,CN=Schema,CN=Configuration,DC=helpdesk,DC=wat,DC=edu
isCriticalSystemObject = True
dSCorePropagationData = System.Object[]
lastLogonTimestamp = System.__ComObject
mail = [email protected]
nTSecurityDescriptor = System.__ComObject
Et ici vous avez le code:
string currentUserSid = WindowsIdentity.GetCurrent().User.Value;
PrincipalContext ctx = new PrincipalContext(
ContextType.Domain,
"helpdesk.wat.edu");
UserPrincipal up = UserPrincipal.FindByIdentity(
ctx, IdentityType.Sid,
currentUserSid);
/*
*
*/
DirectoryEntry entry = up.GetUnderlyingObject() as DirectoryEntry;
PropertyCollection props = entry.Properties;
/*
*
*/
foreach (string propName in props.PropertyNames)
{
if (entry.Properties[propName].Value != null)
{
Console.WriteLine(propName + " = " + entry.Properties[propName].Value.ToString());
}
else
{
Console.WriteLine(propName + " = NULL");
}
}
Console.ReadKey();
Spécifiez "*" comme seule valeur dans la liste des attributs à renvoyer.
Si vous souhaitez également les attributs opérationnels, ajoutez "+" à la liste.
// 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());
}
Eh bien, "récupérer tous les attributs" seul, en ce qui concerne un annuaire n'a pas de sens . Voulez-vous dire:
Et je ne m'occupe pas du fait que certains attributs d'utilisateur peuvent être en lecture seule et d'autres être écrits uniquement avec des valeurs spécifiques. J'ajoute le moyen d'obtenir le contenu.
@Ghostfire fournit la solution permettant de récupérer tous les attributs utilisateur, ainsi que les attributs opérationnels.
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]);
}
Mais rappelez-vous que dans une recherche LDAP, le meilleur moyen est de donner les attributs que vous voulez récupérer:
/* 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();
Vous pouvez utiliser un DirectoryEntry pour générer une liste de propriétés, mais vous devrez bien sûr utiliser un pour que chacune d’elles passe dans la liste des propriétés.
DirectoryEntry objADAM = default(DirectoryEntry);
string properties = string.Empty;
foreach (string property in objADAM.Properties.PropertyNames)
{
properties += property + ", ";
}
vous pouvez toujours cependant faire référence à http://www.codeproject.com/KB/system/everythingInAD.aspx en ce qui concerne C # et Active Directory.
MISE À JOUR: http://www.codeproject.com/Articles/18102/Howto-Almost-Everything-In-Active-Directory-via-C
Pour obtenir une liste de toutes les propriétés possibles, vous devez interroger le schéma pour une classe d'objet donnée.
ADSI Edit est un excellent outil pour vous aider à comprendre. Dans ce cas, vous recherchez des données de schéma. Lorsque vous ouvrez ADSI Edit, vous choisissez "Connect to ..." puis, pour le contexte de nommage bien connu, vous sélectionnez "Schema" ... vous pouvez maintenant examiner les différentes classes de schéma: (subSchema, classSchema, attributeSchema) ...
La difficulté est de savoir que vous devez choisir un classSchema, puis obtenir son "schemaIDGUID" ... puis vous effectuez une recherche sur tout attributeSchema et filtrez sur "schemaIDGUID".
Ex. Si vous choisissez de regarder "CN = Utilisateur", vous remarquerez que schemaIDGUID == bf967aba-0de6-11d0-a285-00aa003049e2
Ensuite, si vous choisissez "CN = Pwd-Last-Set", vous remarquerez que le schéma IDGUID correspond ....
Cela dit, il est probablement beaucoup plus facile d’utiliser ActiveDirectorySchemaClass (comme David l’a répondu), mais j’avais envie de partager certaines connaissances.