【发布时间】:2010-09-17 09:31:25
【问题描述】:
我需要一种方法来确定运行我的程序的计算机是否加入了任何域。它属于哪个特定域并不重要,只要它是否连接到任何东西。我正在针对 Win32 API 使用 vc++ 进行编码。
【问题讨论】:
-
任何域,或特定域?可能你会想要 WMI...
-
与check for a particular domain(和C#)的相关问题。
我需要一种方法来确定运行我的程序的计算机是否加入了任何域。它属于哪个特定域并不重要,只要它是否连接到任何东西。我正在针对 Win32 API 使用 vc++ 进行编码。
【问题讨论】:
直接来自微软:
How To Determine If a Windows NT/Windows 2000 Computer Is a Domain Member
此方法使用 Windows API。来自文章摘要:
本文介绍了如何 确定计算机是否 运行 Windows NT 4.0 或 Windows 2000 是域的成员,是成员 属于一个工作组,或者是一个独立的 使用本地安全的计算机 授权 API。
本文还提供了一个小程序的示例代码,用于输出运行该程序的计算机是域的一部分、工作组的一部分还是独立计算机。
【讨论】:
我认为NetServerEnum 功能将帮助您实现您想要的;我会要求 servertype 参数使用 SV_TYPE_DOMAIN_CTRL 常量的主域控制器。如果您没有得到任何信息,那么您不在域中。
【讨论】:
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 环境变量将为空或不可用。但是您应该考虑一些注意事项。
优点:
缺点:
【讨论】:
您可以检查注册表项 HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon 的“CachePrimaryDomain”值。
【讨论】:
避免 LSA,这是一种错误的方法。 您必须使用 DS api(2 行代码)
【讨论】:
从计算机的名称来看呢?
编辑:这是一个很糟糕的“答案”。我的意思是检查计算机名称中的domain\name 形式。这当然意味着您确实知道域的名称,它并不能解决仅知道计算机是否在任何域中的问题。
【讨论】: