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 スタイル名が指定されている場合、名前は末尾のピリオドの有無にかかわらず指定できます。
[in] DomainGuid
クエリされるドメインの GUID を指定する GUID 構造体へのポインター。
[in] SiteName
返されるドメイン コントローラーが物理的に存在するサイトの名前を指定する null で終わる文字列へのポインター。 このパラメーターが NULL
[in] Flags
要求の処理に使用される追加のデータを提供するフラグのセットが含まれています。 このパラメーターには、次の値の組み合わせを指定できます。
DS_AVOID_SELF
ドメイン コントローラーから呼び出された場合、返されるドメイン コントローラー名を現在のコンピューターにしないことを指定します。 現在のコンピューターがドメイン コントローラーでない場合、このフラグは無視されます。 このフラグを使用して、ドメイン内の別のドメイン コントローラーの名前を取得できます。
DS_BACKGROUND_ONLY
DS_FORCE_REDISCOVERY フラグが指定されていない場合、この関数はキャッシュされたドメイン コントローラー データを使用します。 キャッシュされたデータが 15 分を超える場合は、ドメイン コントローラーに ping を実行してキャッシュが更新されます。 このフラグを指定すると、キャッシュされたデータの有効期限が切れた場合でも、この更新は回避されます。 このフラグは、DsGetDcName 関数が定期的に呼び出される場合に使用する必要があります。
DS_DIRECTORY_SERVICE_PREFERRED
DsGetDcName
DS_DIRECTORY_SERVICE_REQUIRED
返されるドメイン コントローラーがディレクトリ サービスをサポートしている必要があります。
DS_DIRECTORY_SERVICE_6_REQUIRED
返されたドメイン コントローラーが Windows Server 2008 以降を実行している必要があります。
DS_DIRECTORY_SERVICE_8_REQUIRED
返されたドメイン コントローラーが Windows Server 2012 以降を実行している必要があります。
DS_FORCE_REDISCOVERY
キャッシュされたドメイン コントローラー データを強制的に無視します。
キャッシュされたドメイン コントローラー情報のパフォーマンス特性が向上し、すべてのアプリケーションで同じドメイン コントローラーが一貫して使用されるようにするため、このフラグは通常の条件下では使用しないでください。 このフラグは、DsGetDcName によって返されたドメイン コントローラー (このフラグなしで呼び出された場合) にアクセスできないことがアプリケーションによって判断された後にのみ使用する必要があります。 その場合、アプリケーションは、DsGetDcName 呼び出しをこのフラグで繰り返して、未使用のキャッシュされた情報 (存在する場合) が無視され、到達可能なドメイン コントローラーが検出されるようにする必要があります。
DS_GC_SERVER_REQUIRED
返されるドメイン コントローラーが、このドメインをルートとして持つドメインのフォレストのグローバル カタログ サーバーである必要があります。 このフラグが設定されていて、
DS_GOOD_TIMESERV_PREFERRED
DsGetDcName は、信頼できるタイム サーバーであるドメイン コントローラーの検索を試みます。 Windows タイム サービスは、1 つ以上のドメイン コントローラーを信頼できるタイム サーバーとして宣言するように構成できます。 詳細については、Windows タイム サービスの ドキュメントを参照してください。 このフラグは、Windows タイム サービスでのみ使用することを目的としています。
DS_IP_REQUIRED
このパラメーターは、ドメイン コントローラーに IP アドレスが必要であることを示します。 その場合、
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_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 の
DS_TIMESERV_REQUIRED
返されたドメイン コントローラーが現在 Windows タイム サービスを実行している必要があります。
DS_TRY_NEXTCLOSEST_SITE
このフラグを指定すると、DsGetDcName は、呼び出し元と同じサイト内のドメイン コントローラーの検索を試みます。 このようなドメイン コントローラーが見つからない場合は、トポロジ情報を提供し、dsBindToISTG
このフラグが、SiteNameの入力パラメーターで NULL 以外の値と組み合わせて使用
また、DS_TRY_NEXT_CLOSEST_SITE で使用される検索の種類はサイト固有であるため、DS_PDC_REQUIREDと組み合わせて使用する場合、このフラグは無視されます。 最後に、netBIOS を使用して名前を解決するため、DS_RETURN_FLAT_NAME と組み合わせて使用する場合、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
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
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 は、セッションの開始時に使用した名前と同じ名前です。
手記
dsgetdc.h ヘッダーは、Unicode プリプロセッサ定数の定義に基づいて、この関数の ANSI または Unicode バージョンを自動的に選択するエイリアスとして DsGetDcName を定義します。 エンコードに依存しないエイリアスをエンコードに依存しないコードと組み合わせて使用すると、コンパイルエラーやランタイム エラーが発生する不一致が発生する可能性があります。 詳細については、「関数プロトタイプの 規則」を参照してください。
必要条件
要件 | 価値 |
---|---|
サポートされる最小クライアント | Windows Vista |
サポートされる最小サーバー | Windows Server 2008 |
ターゲット プラットフォーム の |
ウィンドウズ |
ヘッダー | dsgetdc.h |
ライブラリ | NetApi32.lib |
DLL | NetApi32.dll |
関連項目
DsValidateSubnetName の
NetApiBufferFree を
Windows タイム サービス の