如何以编程方式确定Windows计算机是否是域的成员?

我需要一种方法来确定运行我的程序的计算机是否join到任何域。 它是什么特定的领域并不重要,只是它是否连接到任何东西。 我正在编写vc ++对Win32 API。

从微软直接:

如何确定Windows NT / Windows 2000计算机是否为域成员

这种方法使用Windows API。 从文章总结:

本文介绍如何确定运行Windows NT 4.0或Windows 2000的计算机是否是域成员,是工作组的成员,还是使用本地安全机构API的独立计算机。

本文还提供了一个小程序的示例代码,用于输出程序运行的计算机是域的一部分,是工作组的一部分还是独立的计算机。

我认为NetserverEnum函数将帮助你在你想要的东西; 我会要求具有SV_TYPE_DOMAIN_CTRL常量的主域控制器的servertype参数。 如果你没有得到任何,那么你不在一个域。

您可以检查注册表项HKEY_LOCAL_MACHINE \ SOFTWARE \微软\的Windows NT \ CurrentVersion \ Winlogon的'CachePrimaryDomain'的值。

MSDN示例中的代码有点过时了。 这是我想出的功能。

 bool ComputerBelongsToDomain() { bool ret = false; LSA_OBJECT_ATTRIBUTES objectAttributes; LSA_HANDLE policyHandle; NTSTATUS status; PPOLICY_PRIMARY_DOMAIN_INFO info; // Object attributes are reserved, so initialize to zeros. ZeroMemory(&objectAttributes, sizeof(objectAttributes)); status = LsaOpenPolicy(NULL, &objectAttributes, GENERIC_READ | POLICY_VIEW_LOCAL_INFORMATION, &policyHandle); if (!status) { status = LsaQueryInformationPolicy(policyHandle, PolicyPrimaryDomainInformation, (LPVOID*)&info); if (!status) { if (info->Sid) ret = true; LsaFreeMemory(info); } LsaClose(policyHandle); } return ret; } 

这是一个我没有看到提到的死简单的方法。

 TCHAR UserDnsDomain[128] = { 0 }; DWORD Result = 0; Result = GetEnvironmentVariable("USERDNSDOMAIN", UserDnsDomain, sizeof(UserDnsDomain)); if (Result == 0 || Result >= sizeof(UserDnsDomain) || GetLastError() == ERROR_ENVVAR_NOT_FOUND) { return(FALSE); // Not logged in to a domain } 

这是基于这样的想法:如果运行此代码的用户当前未登录到域,则USERDNSDOMAIN环境变量将为空或不可用。 但是你应该考虑一些注意事项。

优点:

  • 很容易实现。
  • 99%可靠。

缺点:

  • 如果计算机已加入域,则可能会失败或返回错误结果,但执行此代码的用户使用本地帐户登录到该计算机。
  • 如果计算机已加入域,则可能会失败或返回错误结果,但在登录/用户使用缓存的凭据登录时,到域控制器的网络连接不可用。

避免LSA这是一个错误的方法。 你必须使用DS api(2行代码)

那么从电脑的名字呢?

编辑:这是从回来的一个crapy“答案”。 我的意思是计算机名称中的表单domain\name cheching。 这当然意味着你知道域的名称,它不能解决只是知道计算机是否在任何域的问题。