在网络管理中,获取并显示所有域名称是一个常见的需求。通常,这些域名称以全限定域名(FQDN)的形式存在,例如yourdepartment.yourdomain.com。然而,可能需要以一种更友好的方式显示这些名称,类似于Windows登录界面上显示的格式。
为了实现这一目标,可以使用Active DS Library中的IADsNameTranslate接口。这个接口能够将不同的名称格式进行转换,包括将FQDN转换为更容易理解的格式。
首先,需要获取当前森林中的所有域。这可以通过获取Forest对象的DomainCollection属性来实现。然后,需要将这些域的FQDN格式转换为DN(Distinguished Name)格式,因为IADsNameTranslate接口只能处理DN格式。
以下是使用C#语言实现这一功能的示例代码:
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(GetName(oDomain.ToString()));
}
}
private string GetName(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.Replace(@"\", "");
}
catch
{
return "Access Denied";
}
}
在上述代码中,首先创建了一个DirectoryContext对象,用于连接到域。然后,获取当前域的Forest对象,并遍历其DomainCollection属性以获取所有域。对于每个域,调用GetName方法,该方法将FQDN转换为DN,然后使用IADsNameTranslate接口将其转换为更友好的格式。