セキュリティコンテキストとActive Directoryドメインサービス

アプリケーションがActive Directoryドメインコントローラー (DC) にバインドされるときは、セキュリティプリンシパルのセキュリティコンテキストでバインドが行われます。セキュリティプリンシパルは、ユーザー、またはコンピューターやシステムサービスなどのエンティティの場合があります。 セキュリティコンテキストは、スレッドがセキュリティ保護可能なオブジェクトにアクセスしようとしたときに、システムがセキュリティを適用するために使用するユーザーアカウントです。 このデータには、ユーザーセキュリティ識別子 (SID) 、グループメンバーシップ、および特権が含まれます。

ユーザーは、認証用の資格情報を提示することによってセキュリティコンテキストを確立します。 資格情報が認証されると、システムは、ユーザーアカウントに関連付けられているグループメンバーシップと特権を識別するアクセストークンを生成します。 ディレクトリオブジェクトにアクセスしようとすると、システムによってアクセストークンが検証されます。 アクセストークン内のデータが、オブジェクトのセキュリティ記述子によってアクセスが許可または拒否されたアカウントとグループと比較されます。

Active Directory DCにバインドするセキュリティコンテキストを制御するには、次のメソッドを使用します。

  • ADsOpenObject関数またはIADsOpenDSObject::OpenDSObjectメソッドでADS_SECURE_AUTHENTICATIONオプションを使用してバインドし、ユーザー名とパスワードを明示的に指定します。 システムはこれらの資格情報を認証し、そのバインドの間、アクセスの検証に使用するアクセストークンを生成します。 詳細については、認証に関するページをご覧ください。
  • 資格情報を指定せずにADS_SECURE_AUTHENTICATIONオプションを使用してバインドします。 ユーザーを偽装していない場合、システムはアプリケーションのプライマリセキュリティコンテキスト、つまりアプリケーションを起動したユーザーのセキュリティコンテキストを使用します。 システムサービスの場合、これはサービスアカウントまたはLocalSystemアカウントのセキュリティコンテキストです。
  • ユーザーを偽装し、資格情報を指定せずにADS_SECURE_AUTHENTICATIONを使用してバインドします。 この場合、システムは偽装されたクライアントのセキュリティコンテキストを使用します。 詳細については、 クライアントの偽装を参照してください。
  • ADS_NO_AUTHENTICATIONオプションを指定したADsOpenObjectまたはIADsOpenDSObject::OpenDSObjectを使用してバインドします。 このメソッドは認証なしでバインドし、セキュリティコンテキストとして"Everyone"になります。 このオプションをサポートしているのはLDAPプロバイダーだけです。

可能であれば、資格情報を指定せずにバインドします。 つまり、ログオンしているユーザーまたは権限を借用したクライアントのセキュリティコンテキストを使用します。 これにより、資格情報のキャッシュを回避できます。 代替ユーザーの資格情報を使用する必要がある場合は、資格情報の入力を求め、それらを使用してバインドしますが、それらをキャッシュしません。 複数のバインド操作で同じセキュリティコンテキストを使用するには、最初のバインド操作でユーザー名とパスワードを指定し、その後のバインドではユーザー名のみを指定します。 この手法の使用方法の詳細については、 認証 を参照してください。

一部のセキュリティコンテキストは、他のセキュリティコンテキストよりも強力です。 たとえば、ドメインコントローラー上のLocalSystemアカウントはActive Directory Domain Servicesへの完全なアクセス権を持ちますが、一般的なユーザーはディレクトリ内の一部のオブジェクトへのアクセスが制限されています。 一般に、アプリケーションは、LocalSystemなどの強力なセキュリティコンテキストで実行しないでください。強力でないセキュリティコンテキストでも操作を実行できます。 つまり、アプリケーションを個別のコンポーネントに分割し、それぞれが実行する操作に適したセキュリティコンテキストで実行することができます。 たとえば、アプリケーションのセットアップは次のように分割できます。

  • スキーマ管理者グループのメンバーであるユーザーのコンテキストでスキーマの変更と拡張を実行します。
  • エンタープライズ管理者グループのメンバーであるユーザーのコンテキストで構成コンテナーの変更を実行します。
  • ドメイン管理者グループのメンバーであるユーザーのコンテキストでドメインコンテナーの変更を実行します。