3

我是 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,

我真的需要这里的指导。

更新

我使用下面的代码来获取域:

    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

现在问题有两个方面。首先,域名不一致。假设我的 DC 的 DNS 名称是prod.domain.com,并且预期的域名是例如dev, domain, etc。相反,我得到dev.domain.org, domain.org, etc. 一些出现在windows登录对话框中的名字,在被查询时,会出现后缀domain.org;有些有后缀.org

第二个问题不是所有域名(出现在 Windows 登录对话框中,第 3 个下拉菜单中)都出现了。想知道为什么会这样?

更新

认为其他域(未出现)可能是另一个域控制器服务器的一部分,或者我需要使用适当的凭据访问 dc。

4

3 回答 3

2

RootDSE 在LDAP 词汇表中定义。在您的情况下,根 DSE 可能是LDAP://<domain_name>/dc=<domain>,dc=org.

如果您的 AD 服务器定义了 rootDomainNamingContext,您应该能够使用其他 Stack Overflow 问题上的代码获取域。由于您似乎没有该属性,因此您需要遍历记录以找到合适的属性。我建议您通过物理或远程桌面访问域控制器,然后打开 AD 目录并查找条目及其属性,以便更好地了解您需要从 VB 查询的内容。如果您无法访问,请询问您的系统管理员。

于 2010-07-30T09:42:36.167 回答
1

看来我为你找到了解决方案,伙计!我尝试为 Interop.ActiveDs.dll(Active DS 类型库)导入 COM 引用,然后我们可以将这些名称转换为您喜欢的名称。

这是我的代码。

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/

于 2010-08-06T03:38:05.753 回答
0

@Raymund 使用一点 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";
        }
    }
于 2010-08-09T13:36:30.930 回答