繁体   English   中英

如何获得Windows域名?

[英]How to get Windows domain name?

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

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

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

备注

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

  • USERDOMAIN环境变量返回登录用户的域,该域可以与机器不同; 并返回域的传统NetBIOS名称(例如AVATOPIA

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

Microsoft有一篇知识库文章如何在Windows NT,Windows 2000或Windows XP上检索当前用户和域名 ,这些文章依赖于获取用户的安全令牌并调用LookupAccountSid。

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

更新一

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

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

这种方法的问题是:

  • 你无法获得域名(只有专有名称
  • 如果用户没有查询AD的权限,它将不起作用
  • 如果用户不是活动目录中的有效用户,则它不起作用
  • 它仅适用于Active Directory域

更新二

只是为了清楚我想要的是:

在此输入图像描述

奖金阅读

干得好:

#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来释放内存块(根据评论中的讨论)。

该函数返回三个不同的域名 ,例如:

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

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

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

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

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

或不:

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

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

例:

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM