从完全限定的Active Directory域名中获取NETBIOS域名有时是一项繁琐的任务。我找到了一个很好的答案here。
但是,在具有多个林的环境中,如果PC不在您要查询的林中,则此方法将不起作用。这是因为LDAP://RootDSE
将查询计算机域的信息。
有人可能会问:为什么这么复杂?只需在第一个点检索之前使用该名称即可:
ActiveDirectory.Domain.GetComputerDomain().Name;
或者只是获取用户的域名:
Environment.GetEnvironmentVariable("USERDOMAIN");
要么
Environment.UserDomainName;
但是NETBIOS域名可以完全不同,您或您的计算机可能位于不同的域或林中!因此,此方法仅在简单的环境中可用。
DJ KRAZE’s解决方案仅需进行少量修改即可允许跨域查询。这假定了信任关系!
private string GetNetbiosDomainName(string dnsDomainName)
{
string netbiosDomainName = string.Empty;
DirectoryEntry rootDSE = new DirectoryEntry(string.Format("LDAP://{0}/RootDSE",dnsDomainName));
string configurationNamingContext = rootDSE.Properties["configurationNamingContext"][0].ToString();
DirectoryEntry searchRoot = new DirectoryEntry("LDAP://cn=Partitions," + configurationNamingContext);
DirectorySearcher searcher = new DirectorySearcher(searchRoot);
searcher.SearchScope = SearchScope.OneLevel;
searcher.PropertiesToLoad.Add("netbiosname");
searcher.Filter = string.Format("(&(objectcategory=Crossref)(dnsRoot={0})(netBIOSName=*))", dnsDomainName);
SearchResult result = searcher.FindOne();
if (result != null)
{
netbiosDomainName = result.Properties["netbiosname"][0].ToString();
}
return netbiosDomainName;
}
最佳答案
您还可以使用DsGetDcName API,它将为您完成所有工作。如果您查询的域是本地计算机,它还将缓存 call ,甚至不会打入网络。
如果您对
使用:
internal static string GetNetbiosNameForDomain(string dns)
{
IntPtr pDomainInfo;
int result = DsGetDcName(null, dns, IntPtr.Zero, null,
DSGETDCNAME_FLAGS.DS_IS_DNS_NAME | DSGETDCNAME_FLAGS.DS_RETURN_FLAT_NAME,
out pDomainInfo);
try
{
if (result != ERROR_SUCCESS)
throw new Win32Exception(result);
var dcinfo = new DomainControllerInfo();
Marshal.PtrToStructure(pDomainInfo, dcinfo);
return dcinfo.DomainName;
}
finally
{
if (pDomainInfo != IntPtr.Zero)
NetApiBufferFree(pDomainInfo);
}
}
P /调用:
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
private class DomainControllerInfo
{
public string DomainControllerName;
public string DomainControllerAddress;
public int DomainControllerAddressType;
public Guid DomainGuid;
public string DomainName;
public string DnsForestName;
public int Flags;
public string DcSiteName;
public string ClientSiteName;
}
[Flags]
private enum DSGETDCNAME_FLAGS : uint
{
DS_FORCE_REDISCOVERY = 0x00000001,
DS_DIRECTORY_SERVICE_REQUIRED = 0x00000010,
DS_DIRECTORY_SERVICE_PREFERRED = 0x00000020,
DS_GC_SERVER_REQUIRED = 0x00000040,
DS_PDC_REQUIRED = 0x00000080,
DS_BACKGROUND_ONLY = 0x00000100,
DS_IP_REQUIRED = 0x00000200,
DS_KDC_REQUIRED = 0x00000400,
DS_TIMESERV_REQUIRED = 0x00000800,
DS_WRITABLE_REQUIRED = 0x00001000,
DS_GOOD_TIMESERV_PREFERRED = 0x00002000,
DS_AVOID_SELF = 0x00004000,
DS_ONLY_LDAP_NEEDED = 0x00008000,
DS_IS_FLAT_NAME = 0x00010000,
DS_IS_DNS_NAME = 0x00020000,
DS_RETURN_DNS_NAME = 0x40000000,
DS_RETURN_FLAT_NAME = 0x80000000
}
[DllImport("Netapi32.dll", CallingConvention = CallingConvention.StdCall, EntryPoint = "DsGetDcNameW", CharSet = CharSet.Unicode)]
private static extern int DsGetDcName(
[In] string computerName,
[In] string domainName,
[In] IntPtr domainGuid,
[In] string siteName,
[In] DSGETDCNAME_FLAGS flags,
[Out] out IntPtr domainControllerInfo);
[DllImport("Netapi32.dll")]
private static extern int NetApiBufferFree(
[In] IntPtr buffer);
private const int ERROR_SUCCESS = 0;
关于c# - 如何在复杂环境中使用FQDN获取NETBIOS域名,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/14119753/