次の方法で共有


DsGetDcNameW 関数 (dsgetdc.h)

DsGetDcName 関数は、指定したドメイン内のドメイン コントローラーの名前を返します。 この関数は、特定の特性を持つドメイン コントローラーの優先設定を示す追加のドメイン コントローラー選択条件を受け入れます。

構文

DSGETDCAPI DWORD DsGetDcNameW(
  [in]  LPCWSTR                  ComputerName,
  [in]  LPCWSTR                  DomainName,
  [in]  GUID                     *DomainGuid,
  [in]  LPCWSTR                  SiteName,
  [in]  ULONG                    Flags,
  [out] PDOMAIN_CONTROLLER_INFOW *DomainControllerInfo
);

パラメーター

[in] ComputerName

この関数を処理するサーバーの名前を指定する null で終わる文字列へのポインター。 通常、このパラメーターは NULLされ、ローカル コンピューターが使用されていることを示します。

[in] DomainName

クエリを実行するドメインまたはアプリケーション パーティションの名前を指定する null で終わる文字列へのポインター。 この名前には、DNS スタイル名 (fabrikam.com など) またはフラット スタイルの名前 (Fabrikam など) を指定できます。 DNS スタイル名が指定されている場合、名前は末尾のピリオドの有無にかかわらず指定できます。

Flags パラメーターに DS_GC_SERVER_REQUIRED フラグが含まれている場合は、DomainName フォレストの名前にする必要があります。 この場合、ドメイン名 フォレスト ルートではない名前 指定した場合、DsGetDcName は失敗します。

Flags パラメーターに DS_GC_SERVER_REQUIRED フラグが含まれ、DomainName が NULL場合 、dsGetDcName は、ComputerNameで識別されるコンピューターのフォレスト内のグローバル カタログを検索しようとします。これは、ComputerName が NULL場合にローカル コンピューターです。

DomainName が NULL であり、Flags パラメーターに DS_GC_SERVER_REQUIRED フラグが含まれていない場合、ComputerName は、ComputerNameによって識別されるコンピューターのプライマリ ドメインの既定のドメイン名に設定されます。

[in] DomainGuid

クエリされるドメインの GUID を指定する GUID 構造体へのポインター。 DomainGuid が NULL されず、DomainName または ComputerName で指定されたドメインが見つからない場合、DsGetDcName は、DomainGuidで指定された GUID を持つドメイン内のドメイン コントローラー 検索しようとします。

[in] SiteName

返されるドメイン コントローラーが物理的に存在するサイトの名前を指定する null で終わる文字列へのポインター。 このパラメーターが NULL場合、DsGetDcName は、ComputerNameで指定されたコンピューターのサイトに最も近いサイト内のドメイン コントローラー 返そうとします。 このパラメーターは、既定で NULLする必要があります。

[in] Flags

要求の処理に使用される追加のデータを提供するフラグのセットが含まれています。 このパラメーターには、次の値の組み合わせを指定できます。

DS_AVOID_SELF

ドメイン コントローラーから呼び出された場合、返されるドメイン コントローラー名を現在のコンピューターにしないことを指定します。 現在のコンピューターがドメイン コントローラーでない場合、このフラグは無視されます。 このフラグを使用して、ドメイン内の別のドメイン コントローラーの名前を取得できます。

DS_BACKGROUND_ONLY

DS_FORCE_REDISCOVERY フラグが指定されていない場合、この関数はキャッシュされたドメイン コントローラー データを使用します。 キャッシュされたデータが 15 分を超える場合は、ドメイン コントローラーに ping を実行してキャッシュが更新されます。 このフラグを指定すると、キャッシュされたデータの有効期限が切れた場合でも、この更新は回避されます。 このフラグは、DsGetDcName 関数が定期的に呼び出される場合に使用する必要があります。

DS_DIRECTORY_SERVICE_PREFERRED

DsGetDcName は、ディレクトリ サービス関数をサポートするドメイン コントローラーの検索を試みます。 ディレクトリ サービスをサポートするドメイン コントローラーを使用できない場合、DsGetDcName はディレクトリ以外のサービス ドメイン コントローラーの名前を返します。 ただし、DsGetDcName は、ディレクトリ サービス ドメイン コントローラーの検索がタイムアウトした後にのみ、ディレクトリ 以外のサービス ドメイン コントローラーを返します。

DS_DIRECTORY_SERVICE_REQUIRED

返されるドメイン コントローラーがディレクトリ サービスをサポートしている必要があります。

DS_DIRECTORY_SERVICE_6_REQUIRED

返されたドメイン コントローラーが Windows Server 2008 以降を実行している必要があります。

DS_DIRECTORY_SERVICE_8_REQUIRED

返されたドメイン コントローラーが Windows Server 2012 以降を実行している必要があります。

DS_FORCE_REDISCOVERY

キャッシュされたドメイン コントローラー データを強制的に無視します。 DS_FORCE_REDISCOVERY フラグが指定されていない場合、dsGetDcName キャッシュされたドメイン コントローラー データが返されることがあります。 このフラグが指定されている場合、dsGetDcName はキャッシュされた情報 (存在する場合) を使用しませんが、代わりに新しいドメイン コントローラーの検出を実行します。

キャッシュされたドメイン コントローラー情報のパフォーマンス特性が向上し、すべてのアプリケーションで同じドメイン コントローラーが一貫して使用されるようにするため、このフラグは通常の条件下では使用しないでください。 このフラグは、DsGetDcName によって返されたドメイン コントローラー (このフラグなしで呼び出された場合) にアクセスできないことがアプリケーションによって判断された後にのみ使用する必要があります。 その場合、アプリケーションは、DsGetDcName 呼び出しをこのフラグで繰り返して、未使用のキャッシュされた情報 (存在する場合) が無視され、到達可能なドメイン コントローラーが検出されるようにする必要があります。

DS_GC_SERVER_REQUIRED

返されるドメイン コントローラーが、このドメインをルートとして持つドメインのフォレストのグローバル カタログ サーバーである必要があります。 このフラグが設定されていて、DomainName パラメーターが NULLでない場合は、DomainName フォレスト名を指定する必要があります。 このフラグを DS_PDC_REQUIRED フラグまたは DS_KDC_REQUIRED フラグと組み合わせることはできません。

DS_GOOD_TIMESERV_PREFERRED

DsGetDcName は、信頼できるタイム サーバーであるドメイン コントローラーの検索を試みます。 Windows タイム サービスは、1 つ以上のドメイン コントローラーを信頼できるタイム サーバーとして宣言するように構成できます。 詳細については、Windows タイム サービスの ドキュメントを参照してください。 このフラグは、Windows タイム サービスでのみ使用することを目的としています。

DS_IP_REQUIRED

このパラメーターは、ドメイン コントローラーに IP アドレスが必要であることを示します。 その場合、DsGetDcName は、ドメイン コントローラーのインターネット プロトコル アドレスを、domainControllerInfoの DomainControllerAddress メンバー 配置します。

DS_IS_DNS_NAME

DomainName パラメーターが DNS 名であることを指定します。 このフラグを DS_IS_FLAT_NAME フラグと組み合わせることはできません。

DS_IS_DNS_NAME または DS_IS_FLAT_NAMEを指定します。 どちらのフラグも指定しない場合は、ドメイン コントローラー DNS スタイルとフラット名の両方を検索する必要があるため、DsGetDcName の検索に時間がかかる場合があります。

DS_IS_FLAT_NAME

DomainName パラメーターがフラット名であることを指定します。 このフラグを DS_IS_DNS_NAME フラグと組み合わせることはできません。

DS_KDC_REQUIRED

返されたドメイン コントローラーが現在 Kerberos キー配布センター サービスを実行している必要があります。 このフラグを DS_PDC_REQUIRED フラグまたは DS_GC_SERVER_REQUIRED フラグと組み合わせることはできません。

DS_ONLY_LDAP_NEEDED

返されるサーバーが LDAP サーバーであることを指定します。 返されるサーバーが必ずしもドメイン コントローラーであるとは限りません。 他のサービスはサーバーに存在しません。 返されるサーバーには、コンテナー 書き込み可能な 構成も、コンテナー 書き込み可能な スキーマもありません。 返されるサーバーは、必ずしもセキュリティ原則の作成または変更に使用されるとは限りません。 このフラグを DS_GC_SERVER_REQUIRED フラグと共に使用して、グローバル カタログ サーバーもホストする LDAP サーバーを返すこともできます。 返されるグローバル カタログ サーバーは、必ずしもドメイン コントローラーであるとは限りません。 他のサービスはサーバーに存在しません。 このフラグを指定すると、DS_PDC_REQUIREDDS_TIMESERV_REQUIREDDS_GOOD_TIMESERV_PREFERREDDS_DIRECTORY_SERVICES_PREFEREDDS_DIRECTORY_SERVICES_REQUIRED、および DS_KDC_REQUIRED フラグは無視されます。

DS_PDC_REQUIRED

返されたドメイン コントローラーがドメインのプライマリ ドメイン コントローラーである必要があります。 このフラグを DS_KDC_REQUIRED フラグまたは DS_GC_SERVER_REQUIRED フラグと組み合わせることはできません。

DS_RETURN_DNS_NAME

DomainControllerName および DomainName メンバーで返される名前 DomainControllerInfo DNS 名にする必要があることを指定します。 DNS 名を使用できない場合は、エラーが返されます。 このフラグは、DS_RETURN_FLAT_NAME フラグでは指定できません。 このフラグは、DS_IP_REQUIRED フラグを意味します。

DS_RETURN_FLAT_NAME

DomainControllerInfo の DomainControllerName および DomainName メンバーで返される名前 フラット名にする必要があることを指定します。 フラット名を使用できない場合は、エラーが返されます。 このフラグは、DS_RETURN_DNS_NAME フラグでは指定できません。

DS_TIMESERV_REQUIRED

返されたドメイン コントローラーが現在 Windows タイム サービスを実行している必要があります。

DS_TRY_NEXTCLOSEST_SITE

このフラグを指定すると、DsGetDcName は、呼び出し元と同じサイト内のドメイン コントローラーの検索を試みます。 このようなドメイン コントローラーが見つからない場合は、トポロジ情報を提供し、dsBindToISTG 呼び出してバインド ハンドルを取得できるドメイン コントローラーを見つけ、UDP 経由 DsQuerySitesByCost を呼び出して"次に最も近いサイト" を特定し、最後に見つかったサイトの名前をキャッシュします。 そのサイトにドメイン コントローラーが見つからない場合、DsGetDcName は、ドメイン コントローラーを検索する既定の方法にフォールバックします。

このフラグが、SiteNameの入力パラメーターで NULL 以外の値と組み合わせて使用 場合は、ERROR_INVALID_FLAGS がスローされます。

また、DS_TRY_NEXT_CLOSEST_SITE で使用される検索の種類はサイト固有であるため、DS_PDC_REQUIREDと組み合わせて使用する場合、このフラグは無視されます。 最後に、netBIOS を使用して名前を解決するため、DS_RETURN_FLAT_NAME と組み合わせて使用する場合、DS_TRY_NEXTCLOSEST_SITE は無視されますが、見つかったドメイン コントローラーのドメインは、クライアントが参加しているドメインと必ずしも一致しません。

このフラグ グループ ポリシーが有効になっていることに注意してください。 [Next Closest Site]\(次に最も近いサイト\) ポリシー設定を有効にした場合、使用可能で構成されていないすべてのネットワーク アダプターで、コンピューターの [Next Closest Site DC Location]\(次に最も近いサイト DC の場所\) がオンになります。 ポリシー設定を無効にした場合、使用可能で構成されていないすべてのネットワーク アダプターで、コンピューターに対して [Next Closest Site DC Location]\(次に最も近いサイト DC の場所\) は既定では使用されません。 ただし、DS_TRY_NEXTCLOSEST_SITE フラグを明示的に使用して DC ロケーター呼び出しが行われた場合、DsGetDcName は次に最も近いサイトの動作を受け入れられます。 このポリシー設定を構成しない場合、次に最も近いサイト DC の場所は、使用可能で構成されていないすべてのネットワーク アダプターにわたって、コンピューターに既定では使用されません。 DS_TRY_NEXTCLOSEST_SITE フラグが明示的に使用されている場合は、次に最も近いサイトの動作が使用されます。
 

DS_WRITABLE_REQUIRED

返されたドメイン コントローラーを書き込み可能にする必要があります。つまり、ディレクトリ サービスの書き込み可能なコピーをホストします。

DS_WEB_SERVICE_REQUIRED

返されたドメイン コントローラーが現在 Active Directory Web サービスを実行している必要があります。

[out] DomainControllerInfo

選択したドメイン コントローラーに関するデータを含む DOMAIN_CONTROLLER_INFO 構造体へのポインターを受け取る PDOMAIN_CONTROLLER_INFO 値へのポインター。 この構造体は、DsGetDcNameによって割り当てられます。 呼び出し元は、不要になったら、NetApiBufferFree 関数を使用して構造体を解放する必要があります。

戻り値

関数がドメイン コントローラー データを返す場合、戻り値は ERROR_SUCCESS

関数が失敗した場合、戻り値は次のいずれかのエラー コードになります。

備考

DsGetDcName 関数は、ComputerNameで指定されたリモート コンピューターの Netlogon サービス 送信されます。 ComputerName が NULL場合、関数はローカル コンピューターで処理されます。

DsGetDcName 、返されるドメイン コントローラー名が実際のドメイン コントローラーまたはグローバル カタログの名前であることを確認しません。 相互認証が必要な場合、呼び出し元は認証を実行する必要があります。

DsGetDcName では、指定されたドメインへの特定のアクセスは必要ありません。 既定では、この関数では、返されたドメイン コントローラーが現在使用できることを保証しません。 代わりに、呼び出し元は、返されたドメイン コントローラーの使用を試みる必要があります。 ドメイン コントローラーが使用できない場合、呼び出し元は、DS_FORCE_REDISCOVERY フラグを指定して、DsGetDcName 関数を再度呼び出す必要があります。

応答時間

DsGetDcName 使用する場合は、次のタイミングの詳細に注意してください。
  • DsGetDcName はネットワーク呼び出しを行い、ネットワーク トラフィック、トポロジ、DC 負荷などによっては、数秒から 1 分かかる場合があります。
  • UI またはその他のタイミング クリティカル スレッドから dsGetDcName 呼び出すのはお勧めしません。
  • DC ロケーターでは、最適化されたロジックを使用して、DC 情報を可能な限り迅速に提供します。 また、サイトのキャッシュされた情報を使用して、最も近い DC に接続します。

ドメイン コントローラーの持続性に関する ノート

Active Directory Domain Services では、ドメイン コントローラー ロケーター関数は、クライアントが優先ドメイン コントローラーを見つけたら、そのドメイン コントローラーが応答を停止するか、クライアントが再起動されない限り、別のドメイン コントローラーを検索しないように設計されています。 これは"ドメイン コントローラーの持続性" と呼ばれます。 ワークステーションは通常、何か月も問題なく動作するか再起動するので、この動作の意図しない結果の 1 つは、特定のドメイン コントローラーがメンテナンスのために停止した場合、接続されているすべてのクライアントが別のドメイン コントローラーに接続を移行することです。 ただし、ドメイン コントローラーがバックアップされると、クライアントは頻繁に再起動しないため、クライアントは再接続しません。 これにより、負荷分散の問題が発生する可能性があります。

以前は、この問題の最も一般的な解決策は、DS_FORCE_REDISCOVERY フラグを使用して、DsGetDcName を定期的に呼び出すスクリプトを各クライアント コンピューターにデプロイすることです。 これはやや面倒なソリューションであるため、Windows Server 2008 と Windows Vista では、ドメイン コントローラーの持続性に関する問題を引き起こした新しいメカニズムが導入されました。

DsGetDcName がキャッシュからドメイン コントローラー名を取得するたびに、このキャッシュされたエントリの有効期限が切れているかどうかを確認し、有効期限が切れている場合は、そのドメイン コントローラー名を破棄し、ドメイン コントローラー名の再検出を試みます。 キャッシュされたエントリの有効期間は、次のレジストリ キーの値によって制御されます

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Netlogon\Parameters\ForceRediscoveryInterval

そして

HKEY_LOCAL_MACHINE\ソフトウェア\ポリシー\Microsoft\Netlogon\Parameters\ForceRediscoveryInterval

これらのレジストリ キーの値は、REG_DWORD型です。 DsGetDcName ドメイン コントローラー名の再検出を試行するまでの長さを秒単位で指定します。 既定値は 43200 秒 (12 時間) です。 ForceRediscoveryInterval レジストリ エントリの値が 0 に設定されている場合、クライアントは常に再情報開示を実行します。 値が 4294967295 に設定されている場合、キャッシュの有効期限が切れることはなく、キャッシュされたドメイン コントローラーは引き続き使用されます。 ForceRediscoveryInterval レジストリ エントリを 3,600 秒 (60 分) 未満の値に設定しないことをお勧めします。

ForceRediscoveryInterval のレジストリ設定 グループ ポリシーが有効になっています。 ポリシー設定を無効にした場合、12 時間間隔ごとにマシンに対して既定で [再情報開示の強制] が使用されます。 このポリシー設定を構成しない場合、レジストリのローカル コンピューター設定が異なる値でない限り、12 時間間隔ごとにマシンに対して既定で Force Rediscovery が使用されます。
 
DS_BACKGROUND_ONLY フラグが指定されている場合、DsGetDcName はドメイン コントローラー名の再検出を試みることはありません。これは、そのフラグのポイントは、有効期限が切れた場合でも、DsGetDcName にキャッシュされたドメイン コントローラー名の使用を強制するためです。

DsGetDcName での ETW トレースの

DsGetDcNameの ETW トレース 有効にするには、次のレジストリ キーを作成します。

HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\DCLocator\Tracing

キーの構造は次のとおりです。

String ProcessName
  DWORD  PID <optional>

ProcessName は、トレース情報を取得するプロセスの拡張子を含む完全な名前である必要があります。 PID は、同じ名前の複数のプロセスが存在する場合にのみ必要です。 定義されている場合、その PID を持つプロセスのみがトレースに対して有効になります。 同じ名前の 3 つ (またはそれ以上) のプロセスのうち 2 つだけをトレースすることはできません。 1 つのインスタンスまたはすべてのインスタンスを有効にすることができます (同じプロセス名を持つ複数のインスタンスが存在し、PID が指定されていない場合、すべてのインスタンスでトレースが有効になります)。

たとえば、これは App1.exe と App2.exeのすべてのインスタンスをトレースしますが、PID が 999 の App3.exe のインスタンスのみがトレースされます。

App1.exe 
App2.exe
App3.exe
     PID 999

次のコマンドを実行して、トレース セッションを開始します。

tracelog.exe -start <sessionname> -guid #cfaa5446-c6c4-4f5c-866f-31c9b55b962d -f <ファイル名> -flag <traceFlags>

sessionname は、トレース セッションに指定された名前です。 DCLocator トレース プロバイダーの guid は"cfaa5446-c6c4-4f5c-866f-31c9b55b962d" です。 ファイル名 は、イベントが書き込まれるログ ファイルの名前です。 traceFlags は、トレースする領域を示す次のフラグの 1 つ以上です。

16 進値 形容
DCLOCATOR_MISC 0x00000002 その他のデバッグ
DCLOCATOR_MAILSLOT 0x00000010 Mailslot メッセージ
DCLOCATOR_SITE 0x00000020 サイト
DCLOCATOR_CRITICAL 0x00000100 重要なエラー
DCLOCATOR_SESSION_SETUP 0x00000200 信頼されたドメインのメンテナンス
DCLOCATOR_DNS 0x00004000 名前の登録
DCLOCATOR_DNS_MORE 0x00020000 詳細な名前の登録
DCLOCATOR_MAILBOX_TEXT 0x02000000 詳細なメールボックス メッセージ
DCLOCATOR_SITE_MORE 0x08000000 詳細サイト
 

トレース セッションを停止するには、次のコマンドを実行します。

tracelog.exe -stop <sessionname>

sessionname は、セッションの開始時に使用した名前と同じ名前です。

トレースするプロセスのレジストリ キーは、トレース セッションの開始時にレジストリに存在する必要があります。 セッションが開始されると、プロセスは(そのプロセス名とオプションの PID のレジストリ キーの有無に基づいて) トレース メッセージを生成する必要があるかどうかを確認します。 このプロセスでは、セッションの開始時にのみレジストリがチェックされます。 その後に発生するレジストリの変更は、トレースには影響しません。
 

手記

dsgetdc.h ヘッダーは、Unicode プリプロセッサ定数の定義に基づいて、この関数の ANSI または Unicode バージョンを自動的に選択するエイリアスとして DsGetDcName を定義します。 エンコードに依存しないエイリアスをエンコードに依存しないコードと組み合わせて使用すると、コンパイルエラーやランタイム エラーが発生する不一致が発生する可能性があります。 詳細については、「関数プロトタイプの 規則」を参照してください。

必要条件

要件 価値
サポートされる最小クライアント Windows Vista
サポートされる最小サーバー Windows Server 2008
ターゲット プラットフォーム の ウィンドウズ
ヘッダー dsgetdc.h
ライブラリ NetApi32.lib
DLL NetApi32.dll

関連項目

DOMAIN_CONTROLLER_INFO

Directory Service Functions

DsGetSiteName

DsValidateSubnetName の

GUID

NetApiBufferFree を する

Windows タイム サービス の