我需要一种方法来确定运行我的程序的计算机是否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环境变量将为空或不可用。 但是你应该考虑一些注意事项。
优点:
缺点:
避免LSA这是一个错误的方法。 你必须使用DS api(2行代码)
那么从电脑的名字呢?
编辑:这是从回来的一个crapy“答案”。 我的意思是计算机名称中的表单domain\name
cheching。 这当然意味着你知道域的名称,它不能解决只是知道计算机是否在任何域的问题。