DsGetDcNameA 関数 (dsgetdc.h)

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

構文

DSGETDCAPI DWORD DsGetDcNameA(
  [in]  LPCSTR                   ComputerName,
  [in]  LPCSTR                   DomainName,
  [in]  GUID                     *DomainGuid,
  [in]  LPCSTR                   SiteName,
  [in]  ULONG                    Flags,
  [out] PDOMAIN_CONTROLLER_INFOA *DomainControllerInfo
);

パラメーター

[in] ComputerName

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

[in] DomainName

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

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

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

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

[in] DomainGuid

クエリ対象のドメインの GUID を指定する GUID 構造体へのポインター。 DomainGuidNULL ではなく、DomainName または ComputerName で指定されたドメインが見つからない場合、DsGetDcNameDomainGuid で指定された 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 はドメイン コントローラーのインターネット プロトコル アドレスを DomainControllerInfoDomainControllerAddress メンバーに配置します。

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 サーバーであることを指定します。 返されるサーバーは、必ずしもドメイン コントローラーであるとは限りません。 サーバーに他のサービスが存在することは暗黙的に示されていません。 返されるサーバーには、必ずしも書き込み可能な 構成 コンテナーも書き込み可能な スキーマ コンテナーもありません。 返されるサーバーは、必ずしもセキュリティ原則を作成または変更するために使用されるとは限りません。 このフラグは 、グローバル カタログ サーバーもホストする LDAP サーバーを返すために、DS_GC_SERVER_REQUIRED フラグと共に使用できます。 返されるグローバル カタログ サーバーは、必ずしもドメイン コントローラーであるとは限りません。 サーバーに他のサービスが存在することは暗黙的に示されていません。 このフラグを指定すると、 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

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

DS_RETURN_FLAT_NAME

DomainControllerInfoDomainControllerName メンバーと 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]\(次に最も近いサイト\) ポリシー設定を有効にした場合、次に最も近いサイト DC の場所は、使用可能で構成されていないすべてのネットワーク アダプターにわたってマシンに対して有効になります。 ポリシー設定を無効にした場合、使用可能で構成されていないすべてのネットワーク アダプターにわたって、コンピューターに対して [Next Closest Site DC Location]\(次に最も近いサイト DC の場所\) は既定では使用されません。 ただし、 DS_TRY_NEXTCLOSEST_SITE フラグを明示的に使用して DC ロケーター呼び出しが行われた場合、 DsGetDcName は次に最も近いサイトの動作を受け入ります。 このポリシー設定を構成しない場合、使用可能で構成されていないすべてのネットワーク アダプターにわたって、コンピューターに対して [Next Closest Site DC Location]\(次に最も近いサイト 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 サービスに送信されます。 ComputerNameNULL の場合、関数はローカル コンピューターで処理されます。

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

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

応答時間

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

ドメイン コントローラーの持続性に関する注意事項

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

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

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

Hkey_local_machine\システム\CurrentControlSet\サービス\Netlogon\パラメーター\ForceRediscoveryInterval

および

Hkey_local_machine\ソフトウェア\ポリシー\マイクロソフト\Netlogon\パラメーター\ForceRediscoveryInterval

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

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

DsGetDcName での ETW トレース

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

Hkey_local_machine\システム\CurrentControlSet\サービス\DCLocator\トレース

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

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 <filename> -flag <traceFlags>

sessionname は、トレース セッションに指定された名前です。 DCLocator トレース プロバイダーの guid は"cfaa5446-c6c4-4f5c-866f-31c9b55b962d" です。 filename は、イベントが書き込まれるログ ファイルの名前です。 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 を定義します。 encoding-neutral エイリアスの使用を encoding-neutral ではないコードと混在すると、コンパイル エラーまたはランタイム エラーが発生する不一致が発生する可能性があります。 詳細については、「 関数プロトタイプの規則」を参照してください。

要件

要件
サポートされている最小のクライアント Windows Vista
サポートされている最小のサーバー Windows Server 2008
対象プラットフォーム Windows
ヘッダー dsgetdc.h
Library NetApi32.lib
[DLL] NetApi32.dll

こちらもご覧ください

DOMAIN_CONTROLLER_INFO

ディレクトリ サービス関数

DsGetSiteName

DsValidateSubnetName

GUID

NetApiBufferFree

Windows タイム サービス