Windowsコンピューターがドメインのメンバーであるかどうかをプログラムでどのように判断しますか?
質問
プログラムを実行しているコンピューターがドメインに参加しているかどうかを判断する方法が必要です。どの特定のドメインに属しているかは関係なく、何かに接続されているかどうかだけです。 Win32 APIに対してvc ++でコーディングしています。
解決
Microsoftのストレート:
Windows NT / Windows 2000コンピューターがドメインメンバーであるかどうかを判断する方法
このアプローチでは、Windows APIを使用します。記事の要約から:
この記事では、 コンピュータが Windows NT 4.0またはWindows 2000を実行している ドメインのメンバーであり、メンバーである ワークグループの、またはスタンドアロンです ローカルセキュリティを使用するコンピューター Authority API。
この記事では、プログラムが実行されているコンピューターがドメインの一部であるか、ワークグループの一部であるか、スタンドアロンコンピューターであるかを出力する小さなプログラムのサンプルコードも提供しています。
他のヒント
NetServerEnum 関数あなたが望むものであなたを助けます; servertype パラメーターの SV_TYPE_DOMAIN_CTRL
定数を使用してプライマリドメインコントローラーを要求します。取得できない場合は、ドメインに属していません。
「CachePrimaryDomain」の値については、レジストリキーHKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ Windows NT \ CurrentVersion \ Winlogonを確認できます。
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行のコード)を使用する必要があります
コンピューターの名前はどうですか?
編集:これは昔からのくだらない「答え」でした。私が意図したのは、コンピューター名の domain \ name
の形式をチェックすることでした。もちろん、これはドメインの名前を知っていることを意味します。コンピューターがいずれかのドメインに属しているかどうかを知るだけの問題は解決しません。