it-swarm.com.de

LDAP - Liste aller Attribute/Werte abrufen?

Ist es möglich, eine Liste aller Attribute/Werte von LDAP abzurufen, ohne anzugeben, wenn ja, wie dies möglich ist?

13
Mike Anderson

Ich greife eine Liste aller Parameter meines DirectoryEntry-Klassenobjekts auf. Ich hoffe es wird helfen:

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

Und hier haben Sie 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();
23
Piotr Kwiatek

Geben Sie "*" als einzigen Wert in der Liste der zurückzugebenden Attribute an.

Wenn Sie auch die Betriebsattribute wünschen, fügen Sie der Liste "+" hinzu.

14
user207421
    // 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());
    }
5
David

Nun, "alle Attribute zurückzugewinnen", sofern ein Verzeichnis betroffen ist, macht keinen Sinn . Meinen Sie:

  1. Alle vom Benutzer möglichen Attribute, wie sie in der SCHEMA beschrieben sind
  2. Alle Benutzerattribute werden bewertet
  3. Alle Benutzer- und Betriebsattribute

Und ich kümmere mich nicht darum, dass manche Benutzerattribute schreibgeschützt sein können und andere nur mit bestimmten Werten geschrieben werden können. Ich füge den Weg hinzu, um den Inhalt zu erhalten.

@Ghostfire bietet die Lösung zum Abrufen aller bewerteten Benutzerattribute und Betriebsattribute.

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]);
}

Denken Sie jedoch daran, dass bei einer LDAP-Suche der beste Weg ist, die Attribute anzugeben, die Sie erhalten möchten:

/* 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();
3
JPBlanc

Sie können DirectoryEntry verwenden, um eine Liste von Eigenschaften zu generieren. Natürlich müssen Sie für jedes eine verwenden, um durch die Liste der Eigenschaften zu gehen. 

    DirectoryEntry objADAM = default(DirectoryEntry);
    string properties = string.Empty;
    foreach (string property in objADAM.Properties.PropertyNames)
    {
        properties += property + ", ";
    }

man könnte sich aber immer auf sie beziehen http://www.codeproject.com/KB/system/everythingInAD.aspx Wenn es um C # und Active Directory geht.

UPDATE: http://www.codeproject.com/Articles/18102/Howto-Almost-Alles-In-Active-Directory-via-C

2
Ghostfire

Eine Liste aller möglichen Eigenschaften finden Sie unter Abfragen des Schemas für eine bestimmte objectClass.

0
Jeff Patton

ADSI-Bearbeitung ist ein großartiges Werkzeug, das Ihnen hilft, Dinge herauszufinden. In diesem Fall stehen Sie hinter den Schemadaten. Wenn Sie ADSI Edit öffnen, wählen Sie "Connect to ..." und dann für den bekannten Namenskontext "Schema". Jetzt können Sie die verschiedenen Schemaklassen betrachten: (subSchema, classSchema, attributeSchema) ...

Das Schwierige ist, zu wissen, dass Sie ein classSchema auswählen und dann seine "schemaIDGUID" abrufen müssen. Dann durchsuchen Sie alle AttributeSchema und filtern nach "schemaIDGUID".

Ex. Wenn Sie sich für "CN = User" entscheiden, werden Sie das schemaIDGUID == bf967aba-0de6-11d0-a285-00aa003049e2 feststellen

Wenn Sie sich dann für "CN = Pwd-Last-Set" entscheiden, werden Sie feststellen, dass die schemaIDGUID übereinstimmt.

Trotz alledem ist es wahrscheinlich viel einfacher, ActiveDirectorySchemaClass zu verwenden (wie David geantwortet hat), aber ich wollte etwas Wissen teilen.

0
C Sharp Conner