ldap: как получить список всех доменных имен - PullRequest
3 голосов
/ 30 июля 2010

Я новичок в LDAP. Я пытаюсь перечислить все доменные имена NT. Под доменными именами NT я имею в виду имена доменов, которые вы найдете в сети LAN. Вы можете наблюдать это на компьютерах с Windows XP, когда вы пытаетесь войти в систему на этом компьютере (то есть диалог входа в систему, который вы получаете после нажатия ctrl + alt + del). Обычно мы выбираем имя домена в последнем раскрывающемся списке после ввода учетных данных.

Я посмотрел на этот пост и не смог ничего с этим поделать. Я не знаю, что такое rootDSE. Код, приведенный в посте, делает это с rootdse. Тем не менее, у меня есть конкретный сервер для поиска и запроса, и я думаю, что это контроллер домена. (Я могу ошибаться в этом). Мы пишем что-то вроде

LDAP://<domain_name>/dc=<domain>,dc=org

Как указано в посте, я попытался найти свойство с именем rootDomainNamingContext. Но я не мог найти это. Тогда я попробовал следующий код:

Sub Main()
        Dim oRoot As DirectoryEntry = Nothing
        'Dim oSearcher As DirectorySearcher
        'Dim oResults As SearchResultCollection

        Try

            oRoot = New DirectoryEntry("LDAP://<domain_name>/dc=<domain>,dc=org")
            For Each obj As String In oRoot.Properties.PropertyNames
                Console.Write(obj + ", ")
            Next
        Catch ex As Exception
            Console.Write(ex.Message)
        Finally
            oRoot.Dispose()
        End Try

        Console.Read()
    End Sub

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

objectClass, description, distinguishedName, instanceType, whenCreated, whenChan
ged, subRefs, uSNCreated, dSASignature, repsTo, repsFrom, uSNChanged, name, obje
ctGUID, replUpToDateVector, creationTime, forceLogoff, lockoutDuration, lockOutO
bservationWindow, lockoutThreshold, maxPwdAge, minPwdAge, minPwdLength, modified
CountAtLastProm, nextRid, pwdProperties, pwdHistoryLength, objectSid, uASCompat,
 modifiedCount, auditingPolicy, nTMixedDomain, rIDManagerReference, fSMORoleOwne
r, systemFlags, wellKnownObjects, objectCategory, isCriticalSystemObject, gPLink
, gPOptions, masteredBy, ms-DS-MachineAccountQuota, msDS-Behavior-Version, msDS-
PerUserTrustQuota, msDS-AllUsersTrustQuota, msDS-PerUserTrustTombstonesQuota, ms
Ds-masteredBy, dc, nTSecurityDescriptor,

Мне действительно нужно руководство.

UPDATE

Я использовал приведенный ниже код для получения доменов:

    Dim dc As New DirectoryContext(DirectoryContextType.DirectoryServer, DcIpAddr)
    Dim domc As DomainController = DomainController.GetDomainController(dc)
    For Each dmn As Domain In domc.Forest.Domains
        Console.WriteLine(dmn.Name)
    Next

Теперь проблема в два раза. Во-первых, несоответствие в доменных именах. Предположим, что DNS-имя моего DC составляет prod.domain.com, и ожидаемые доменные имена относятся, например, к. dev, domain, etc. Вместо этого я получаю dev.domain.org, domain.org, etc. Некоторые имена, которые появляются в диалоге входа в Windows, при запросе отображаются с суффиксом domain.org; некоторые имеют суффикс .org.

2-й вопрос - не все доменные имена (которые появляются в диалоге входа в Windows, 3-й выпадающий) появляются. Интересно, почему это так?

UPDATE

Рисунок, что другие домены (которые не появляются) могут быть частью другого сервера контроллера домена, или мне нужен доступ к dc с соответствующими учетными данными.

Ответы [ 3 ]

2 голосов
/ 30 июля 2010

RootDSE определяется в LDAP clossary . корневой DSE может быть, в вашем случае, LDAP://<domain_name>/dc=<domain>,dc=org.

Вы должны иметь возможность получать домены, используя код из другого вопроса переполнения стека, если на вашем сервере AD определен rootDomainNamingContext. Поскольку, похоже, у вас нет этого свойства, вам нужно будет перебирать записи, чтобы найти правильное свойство. Я бы посоветовал вам обратиться к контроллеру домена, физически или через удаленный рабочий стол, и открыть каталог AD, и найти записи и их свойства, чтобы получить хорошее представление о том, что вам нужно запросить из VB. Если вы не можете получить доступ, спросите своего системного администратора.

1 голос
/ 06 августа 2010

Похоже, я нашел решение для тебя, чувак! Я попытался импортировать ссылку COM для Interop.ActiveDs.dll (Active DS Type Library), после чего мы можем перевести эти имена в то, что вы предпочитали.

А вот и мои коды.

using System.DirectoryServices.ActiveDirectory;
using ActiveDs;

private void ListDomains()
{
    string sUserName = "xxxx";
    string sPassword = "xxxx";

    DirectoryContext oDirectoryContext = new DirectoryContext(DirectoryContextType.Domain, sUserName, sPassword);

    Domain oCurrentDomain = Domain.GetDomain(oDirectoryContext);
    Forest oForest = oCurrentDomain.Forest;
    DomainCollection oAddDomainsInForest = oForest.Domains;

    foreach (Domain oDomain in oAddDomainsInForest)
    {
        Console.WriteLine(GetFriendlyName(oDomain.ToString()));
    }           
}

private string GetFriendlyName(string sDomainName)
{
    try
    {
        IADsADSystemInfo oSysInfo = new ADSystemInfoClass();
        IADsNameTranslate oNameTranslate = new NameTranslateClass();
        oNameTranslate.Init((int)ADS_NAME_INITTYPE_ENUM.ADS_NAME_INITTYPE_DOMAIN, sDomainName);

        string[] aSplitDN = sDomainName.Split(new Char[] { '.' });
        string sDistinguishedName = "";

        //Convert Domain Name to Distinguished Name
        foreach (string sDomainPart in aSplitDN)
        {
            sDistinguishedName = sDistinguishedName + "DC=" + sDomainPart + ",";
        }

        oNameTranslate.Set((int)ADS_NAME_TYPE_ENUM.ADS_NAME_TYPE_UNKNOWN, sDistinguishedName.Remove(sDistinguishedName.Length - 1));//Remove the last comma
        string sFriendlyName = oNameTranslate.Get((int)ADS_NAME_TYPE_ENUM.ADS_NAME_TYPE_NT4);
        return sFriendlyName(@"\", "");
    }
    catch
    {
        return "Access Denied";
    }
}

Для более подробного объяснения вы можете посмотреть мою статью здесь. http://anyrest.wordpress.com/2010/08/06/how-to-get-domain-name-pre-windows-2000-from-fqdn-fully-qualified-domain-name-using-c/

0 голосов
/ 09 августа 2010

@ код Рэймунда, использующий немного LINQ:

    private static string GetFriendlyName(string names)
    {
        try
        {
            string[] arr = names.Split('.');
            //Convert Domain Name to Distinguished Name
            string distinguishedName = String.Join(",", arr.Select(d => "DC=" + d));

            IADsADSystemInfo info = new ADSystemInfo();
            IADsNameTranslate nameTranslate = new NameTranslate();
            nameTranslate.Init((int)ADS_NAME_INITTYPE_ENUM.ADS_NAME_INITTYPE_DOMAIN, names);
            nameTranslate.Set((int)ADS_NAME_TYPE_ENUM.ADS_NAME_TYPE_UNKNOWN, distinguishedName);

            string friendlyName = nameTranslate.Get((int)ADS_NAME_TYPE_ENUM.ADS_NAME_TYPE_DOMAIN_SIMPLE);
            return friendlyName.Replace("\\", String.Empty);
        }
        catch
        {
            return "Access Denied";
        }
    }
...