LDAP - получить список всех атрибутов / значений? - PullRequest
14 голосов
/ 13 июля 2011

Можно ли получить список всех атрибутов / значений из LDAP без указания, если да, то как это возможно?

Ответы [ 7 ]

25 голосов
/ 17 апреля 2013

Я получаю список всех параметров моего объекта класса DirectoryEntry.Я надеюсь, что это поможет:

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 = spam@kwiatek.org
nTSecurityDescriptor = System.__ComObject

И здесь у вас есть код:

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();
15 голосов
/ 13 июля 2011

Укажите «*» в качестве единственного значения в списке возвращаемых атрибутов.

Если вам нужны также операционные атрибуты, добавьте «+» в список.

5 голосов
/ 07 июня 2014
    // 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());
    }
3 голосов
/ 13 июля 2011

Что ж, «извлечение всех атрибутов» само по себе, поскольку справочник является проблемой, не имеет смысла.Вы имеете в виду:

  1. Все возможные атрибуты пользователя, как они описаны в СХЕМЕ
  2. Все значения атрибутов пользователя
  3. Все атрибуты пользователя и операции

И я не забочусь о том, что некоторые атрибуты пользователей могут быть доступны только для чтения, а другие - только с определенными значениями.Я добавляю способ получения контента.

@ Ghostfire дает решение для получения всех пользовательских атрибутов и операционных атрибутов.

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

Но помните, что при поиске в LDAP лучшийспособ дать атрибуты, которые вы хотите получить:

/* 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();
2 голосов
/ 13 июля 2011

Вы можете использовать DirectoryEntry для генерации списка свойств, вам, конечно, придется использовать a для каждого, чтобы просмотреть список свойств.

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

однако вы всегда можете обратиться к http://www.codeproject.com/KB/system/everythingInAD.aspx, когда речь идет о C # и Active Directory.

ОБНОВЛЕНИЕ: http://www.codeproject.com/Articles/18102/Howto-Almost-Everything-In-Active-Directory-via-C

0 голосов
/ 06 ноября 2018

ADSI Edit - отличный инструмент, который поможет вам разобраться. В этом случае вы после данных схемы. Когда вы открываете ADSI Edit, вы выбираете «Connect to ...», а затем для хорошо известного контекста именования вы выбираете «Schema» ... теперь вы можете взглянуть на различные классы схемы: (subSchema, classSchema, attributeSchema) ...

Хитрость в том, что вам нужно выбрать classSchema, затем получить его "schemaIDGUID" ... затем выполнить поиск по всем attributeSchema и отфильтровать по "schemaIDGUID"

Ex. Если вы решите посмотреть «CN = User», вы заметите schemaIDGUID == bf967aba-0de6-11d0-a285-00aa003049e2

Тогда, если вы решите посмотреть "CN = Pwd-Last-Set", вы заметите совпадения schemaIDGUID ....

С учетом всего вышесказанного, вероятно, гораздо проще использовать ActiveDirectorySchemaClass (как ответил Дэвид), но мне хотелось поделиться некоторыми знаниями.

0 голосов
/ 10 декабря 2014

Для получения списка всех возможных свойств, вы должны посмотреть на запрос схемы для данного objectClass.

...