概述:windows 操作系统下获取主机域名|获取域名|获取域中域控制器名称
API 1 DsRoleGetPrimaryDomainInformation
主要调用 DsRoleGetPrimaryDomainInformation 这个函数。
// GetDominName.cpp : 获取主机域名
//
#include <Windows.h>
#include <DSRole.h>
#pragma comment(lib, "netapi32.lib")
#include <stdio.h>
int main(int argc, char ** argv)
{
DSROLE_PRIMARY_DOMAIN_INFO_BASIC * info;
DWORD dw;
dw = DsRoleGetPrimaryDomainInformation(NULL,
DsRolePrimaryDomainInfoBasic,
(PBYTE *)&info);
if (dw != ERROR_SUCCESS)
{
wprintf(L"DsRoleGetPrimaryDomainInformation: %u\n", dw);
return dw;
}
if (info->DomainNameDns == NULL)
{
wprintf(L"DomainNameDns is NULL\n");
}
else
{
wprintf(L"DomainNameDns: %s\n", info->DomainNameDns);
}
system("pause");
return 0;
}
输出示例:

API 2 LsaQueryInformationPolicy
BOOL kull_m_net_getCurrentDomainInfo(PPOLICY_DNS_DOMAIN_INFO * pDomainInfo)
{
BOOL status = FALSE;
LSA_HANDLE hLSA;
LSA_OBJECT_ATTRIBUTES oaLsa = {0};
if(NT_SUCCESS(LsaOpenPolicy(NULL, &oaLsa, POLICY_VIEW_LOCAL_INFORMATION, &hLSA)))
{
status = NT_SUCCESS(LsaQueryInformationPolicy(hLSA, PolicyDnsDomainInformation, (PVOID *) pDomainInfo));
LsaClose(hLSA);
}
return status;
}获取域控制器名称
调用 API 为 DsGetDcName
BOOL kull_m_net_getDC(LPCWSTR fullDomainName, DWORD altFlags, LPWSTR * fullDCName)
{
BOOL status = FALSE;
DWORD ret, size;
PDOMAIN_CONTROLLER_INFO cInfo = NULL;
ret = DsGetDcName(NULL, fullDomainName, NULL, NULL, altFlags | DS_IS_DNS_NAME | DS_RETURN_DNS_NAME, &cInfo);
if(ret == ERROR_SUCCESS)
{
size = (DWORD) (wcslen(cInfo->DomainControllerName + 2) + 1) * sizeof(wchar_t);
if(*fullDCName = (wchar_t *) LocalAlloc(LPTR, size))
{
status = TRUE;
RtlCopyMemory(*fullDCName, cInfo->DomainControllerName + 2, size);
}
NetApiBufferFree(cInfo);
}
else PRINT_ERROR(L"DsGetDcName: %u\n", ret);
return status;
}
// 使用示例
LPWSTR szDc = NULL;
LPCWSTR szDomain = NULL;
if(kull_m_net_getDC("test.com", DS_DIRECTORY_SERVICE_REQUIRED, &szTmpDc))
szDc = szTmpDc;