如何获得Windows域名?

时间:2012-03-20 18:01:57

标签: c++ windows dns

如何获取机器的域名(如果机器实际上已加入域名)?

当然,如果机器未加入域,则函数应返回

  • null
  • 空字符串,或
  • 机器的名称,或
  • "."

备注

  • NetGetJoinInformation Win32函数返回域的旧NetBIOS名称(例如AVATOPIA),而不是域名(例如avatopia.local

    < / LI>
  • USERDOMAIN环境变量返回登录用户的域,该域可以与计算机不同;并返回域的旧NetBIOS名称(例如AVATOPIA

  • USERDNSDOMAIN环境变量返回登录用户的域名,该域名可以与计算机不同

Microsoft有一篇知识库文章How to retrieve current user and domain names on Windows NT, Windows 2000, or Windows XP,它依赖于获取用户的安全令牌并调用LookupAccountSid。

  • LookupAccountSid Win32函数返回域的旧NetBIOS名称(例如AVATOPIA);并且还返回登录用户的域,该域可以与计算机不同

更新一个

我也尝试使用ADs对象绑定到域的IADs接口:

IADs domain;
ADsGetObject("LDAP://rootDES", IDs, out domain);

这种方法的问题是:

  • 您无法获取域名(仅限专有名称
  • 如果用户无权查询AD
  • ,则无效
  • 如果用户不是活动目录中的有效用户,则无效。
  • 它仅适用于Active Directory域

更新两个

要清楚我想要的是:

enter image description here

奖金阅读

3 个答案:

答案 0 :(得分:13)

你走了:

#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);
    }

    return 0;
}

在生产中使用DsRoleGetPrimaryDomainInformation的任何人都应该考虑在不再需要信息时调用DsRoleFreeMemory释放内存块(根据评论中的讨论)。

该函数返回three different domain names,例如:

  • 域名林名称:例如: stackoverflow.com
  • 域名DNS :例如: stackoverflow.com
  • 域名NetBIOS名称:例如STACKOVERFLOW

如果计算机未加入域,则 Forest dns 都是空白的,只有NetBios名称填充了工作组的名称,例如:< / p>

  • 域名林名称null
  • 域名DNS :例如: null
  • 域名NetBIOS名称:例如WORKGROUP

该函数还返回一个标志,指示机器是否已加入域:

  • DsRole_RoleMemberWorkstation:作为域成员的工作站
  • DsRole_RoleMemberServer:属于域
  • 的服务器
  • DsRole_RolePrimaryDomainController:主域控制器
  • DsRole_RoleBackupDomainController:备份域控制器

与否:

  • DsRole_RoleStandaloneWorkstation:不是域成员的工作站
  • DsRole_RoleStandaloneServer:不是域成员的服务器

答案 1 :(得分:5)

使用GetComputerNameEx,您可以获取计算机名称和域名。

示例:

TCHAR local[100];
DWORD hstSize = sizeof(local);
GetComputerNameEx(ComputerNameDnsDomain, local, &hstSize);

注意:ComputerNameDnsDomain提供域名,ComputerNameNetBIOS提供本地工作组(计算机)名称。

答案 2 :(得分:0)

您可以使用Win32_NTDomain类通过WMI获取域名。该链接包含有关如何与WMI交互的示例的其他链接。