プログラムを実行しているコンピューターがいずれかのドメインに参加しているかどうかを判断する方法が必要です。それがどの特定のドメインに属しているかは問題ではなく、何かに接続されているかどうかだけです。Win32 API に対して vc++ でコーディングしています。
7 に答える
マイクロソフトから直接:
Windows NT/Windows 2000 コンピュータがドメイン メンバかどうかを確認する方法
このアプローチでは、Windows API を使用します。記事の要約から:
この資料では、ローカル セキュリティ機関 API を使用して、Windows NT 4.0 または Windows 2000 を実行しているコンピュータがドメインのメンバであるか、ワークグループのメンバであるか、またはスタンドアロン コンピュータであるかを確認する方法について説明します。
この記事では、プログラムが実行されているコンピューターがドメインの一部、ワークグループの一部、またはスタンドアロン コンピューターのいずれであるかを出力する小さなプログラムのサンプル コードも提供します。
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 環境変数が空または使用不可になるという考えに基づいています。しかし、あなたが考えなければならないいくつかの警告があります。
長所:
- 実装は非常に簡単です。
- 99% 信頼できます。
短所:
- コンピューターがドメインに参加しているが、このコードを実行しているユーザーがローカル アカウントでそのコンピューターにログオンしている場合、失敗するか、誤った結果を返す可能性があります。
- コンピューターがドメインに参加しているが、ログオン/ユーザーがキャッシュされた資格情報でログオンしたときにドメインコントローラーへのネットワーク接続が利用できない場合、失敗するか、誤った結果を返す可能性があります。
「CachePrimaryDomain」の値については、レジストリ キー HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon を確認できます。
間違った方法である LSA は避けてください。DS API を使用する必要があります (2 行のコード)
コンピュータの名前からどうですか?
編集:これは昔からのくだらない「答え」でした。私が意味したのdomain\name
は、コンピューター名のフォームをチェックすることでした。もちろん、これはドメインの名前を知っていることを意味します。コンピューターがいずれかのドメインにあるかどうかを知るだけでは問題は解決しません。