次の方法で共有


DsGetSpnA 関数 (ntdsapi.h)

DsGetSpn 関数は、1 つ以上のサービス プリンシパル名 (SPN) の配列を構築します。 配列内の各名前は、サービスのインスタンスを識別します。 これらの SPN は、DsWriteAccountSpn 関数を使用してディレクトリ サービス (DS) に登録できます。

構文

NTDSAPI DWORD DsGetSpnA(
  [in]           DS_SPN_NAME_TYPE ServiceType,
  [in]           LPCSTR           ServiceClass,
  [in, optional] LPCSTR           ServiceName,
  [in]           USHORT           InstancePort,
  [in]           USHORT           cInstanceNames,
  [in, optional] LPCSTR           *pInstanceNames,
  [in, optional] const USHORT     *pInstancePorts,
  [out]          DWORD            *pcSpn,
  [out]          LPSTR            **prpszSpn
);

パラメーター

[in] ServiceType

作成する SPN の形式を識別します。 ServiceType パラメーターには、次のいずれかの値を指定できます。

DS_SPN_DNS_HOST、DS_SPN_DN_HOST、DS_SPN_NB_HOST

SPN の形式は次のとおりです。

ServiceClass/ InstanceName: InstancePort

ServiceName パラメーターは、NULLする必要があります。 これは、ホスト ベースのサービスの SPN 形式であり、ホスト コンピューターで識別されるサービスを提供します。 InstancePort コンポーネントは省略可能です。

DS_SPN_DOMAIN、DS_SPN_NB_DOMAIN

SPN の形式は次のとおりです。

ServiceClass/ InstanceName: InstancePort/ ServiceName

ServiceName パラメーターは、ドメインの DNS 名または DN である必要があります。 この形式は、指定されたドメインにサービスを提供するレプリケート可能なサービスに使用されます。

DS_SPN_SERVICE

SPN の形式は次のとおりです。

ServiceClass/ InstanceName: InstancePort/ ServiceName

ServiceName パラメーターは、サービスのインスタンスを識別する正規の DN または DNS 名である必要があります。 たとえば、SRV レコードの DNS 名や、このサービス インスタンスのサービス接続ポイントの識別名を指定できます。

[in] ServiceClass

サービスのクラスを指定する、null で終わる定数文字列へのポインター。たとえば、http です。 通常、これはサービスに固有の任意の文字列にすることができます。

[in, optional] ServiceName

サービスの DNS 名または識別名 (DN) を指定する、null で終わる定数文字列へのポインター。 ServiceName は、ホスト ベースのサービスには必要ありません。 詳細については、ServiceNameの使用可能な値の ServiceType パラメーター 説明を参照してください。

[in] InstancePort

サービス インスタンスのポート番号を指定します。 この値が 0 の場合、SPN にはポート番号は含まれません。

[in] cInstanceNames

pInstanceNames および pInstancePorts 配列内の要素の数を指定します。 この値が 0 でない場合、pInstanceNamescInstanceNames 文字列の配列を指す必要があります。pInstancePorts は、null を するか、cInstanceNames ポート番号の配列へのポインターにすることができます。 この値が 0 の場合、DsGetSpn は、prpszSpn 配列内の 1 つの SPN のみを返し、pInstanceNames と pInstancePorts は無視されます。

[in, optional] pInstanceNames

余分なインスタンス名を指定する null で終わる文字列の配列へのポインター (ホスト名には使用されません)。 cInstanceNames が 0 の場合、このパラメーターは無視されます。 その場合、SPN の InstanceName コンポーネントは、既定でローカル コンピューターの完全修飾 DNS 名、または DS_SPN_NB_HOST または DS_SPN_NB_DOMAIN が指定されている場合は NetBIOS 名に設定されます。

[in, optional] pInstancePorts

追加のインスタンス ポートの配列へのポインター。 この値が null以外の場合は、cInstanceNames ポート番号の配列を指す必要があります。 この値が NULL場合、SPN にはポート番号は含まれません。 cInstanceNames が 0 の場合、このパラメーターは無視されます。

[out] pcSpn

prpszSpnに含まれる SPN の数 受け取る変数へのポインター。

[out] prpszSpn

SPN の配列へのポインターを受け取る変数へのポインター。 この配列は、DsFreeSpnArrayで解放する必要があります。

戻り値

関数が SPN の配列を返す場合、戻り値は ERROR_SUCCESS

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

備考

複数のホスト コンピューターで実行されているレプリケートされたサービスの複数のインスタンスの SPN を作成するには、

  1. cInstanceNames インスタンスの数に設定します。
  2. pInstanceNames 配列内のホスト コンピューターの名前を指定します。

同じホスト コンピューター で実行されているサービスの複数のインスタンスの SPN を作成するには

  1. cInstanceNames をインスタンスの数に設定します。
  2. pInstanceNames 配列内の各エントリをホスト コンピューターの DNS 名に設定します。
  3. pInstancePorts パラメーターを使用して、インスタンスごとに一意のポート番号の配列を指定し、SPN のあいまいさを解消します。
文字列パラメーターには、SPN のコンポーネントを区切るために使用されるスラッシュ (/) を含めることはできません。

適切な特権を持つアプリケーション (通常はドメイン管理者の特権) は、DsWriteAccountSpn 関数を呼び出して、サービスが実行されているユーザーまたはコンピューター アカウントに 1 つ以上の SPN を登録できます。 その後、クライアントは SPN を使用してサービスを認証できます。

手記

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

必要条件

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

関連項目

ドメイン コントローラーとレプリケーション管理機能の

DsFreeSpnArray の

dsWriteAccountSpn を する