Active Directory サービス インターフェイス WinNT プロバイダーに関するユーザー認証の問題

この記事では、Active Directory サービス インターフェイス (ADSI) WinNT プロバイダーに関するユーザー認証の問題について説明します。

適用対象: Windows 10 - すべてのエディション
元の KB 番号: 218497

概要

ADSI OpenDsObject メソッドまたは ADsOpenDsObject C ヘルパー関数を使用すると、オブジェクトを開くときにディレクトリ サーバーに認証資格情報を提供できます。 Active Directory サービス インターフェイス WinNT プロバイダーでこの手法を使用する場合に注意する必要がある問題がいくつかあります。

詳細

Active Directory サービス インターフェイス WinNT プロバイダーは 、WNetAddConnection2 関数を使用して\\servername\IPC$ に接続して、リモート サーバーでこれらの資格情報を確立します。 この方法は、NT クライアントに特別な特権を必要とせず、Windows で動作し、信頼されていないドメイン間での認証をサポートするため便利です。

残念ながら、 WNetAddConnection2 関数にはいくつかの欠点があり、次のようになります。

  • クライアント コンピューターで実行されている任意のプロセスによってターゲット サーバーへの接続が既に確立されている場合、 WNetAddConnection2 関数は、既存の接続に使用される資格情報以外の資格情報で新しい接続を作成できません。

    新しいアカウントを認証しようとすると、競合する資格情報エラーが発生します。 既存のアカウントを認証しようとすると、任意のパスワードが機能します (有効かどうか)。 これは、多くのシステム プロセスがドメイン コントローラーへの接続を確立するドメイン コントローラーからオブジェクトを取得する場合に特に問題になります。

  • 対象のコンピューターでゲスト アカウントが有効になっている場合は、無効なユーザー名とパスワードの両方を渡し、接続を作成できます。

  • システムはカウント接続を参照しないため、Active Directory サービス インターフェイス クライアント プロセスを含むプロセスが接続を削除した場合は、その接続を使用するすべてのプロセスを書き込んで、削除された場合に再確立する必要があります。

WinNT プロバイダーを使用する場合は、Active Directory サービス インターフェイス コードを実行する前に、適切な資格情報でドメイン アカウントにログオンするか、 LogonUser 関数 (昇格された特権が必要) を使用して、ターゲット サーバーで認証することをお勧めします。 また、Active Directory サービス インターフェイス OpenDsObject メソッドを使用して、クライアント コンピューターによって信頼されている任意のドメインでユーザーの資格情報を検証しないことをお勧めします。

信頼されていないドメインのアカウントを検証する場合は、上記の問題を念頭に置き、暗号化されていないパスワードをネットワーク経由で送信することを理解しながら、Active Directory サービス インターフェイス OpenDsObject メソッドを使用します。 これらの制限を克服するには、SSL (または HTTPS) 接続を使用して暗号化を提供する信頼されていないドメインの各セット内の少なくとも 1 つのサーバーでサービスとして検証コードを実行します。 これを実現するには、信頼されていないドメインの各セット内の IIS サーバー上の検証.asp ファイルを使用し、基本認証を使用して HTTPS 経由で接続します。

Active Directory サービス インターフェイス OpenDsObject メソッドは、ログオンしているユーザーの資格情報を使用して IIS にアクセスします。 パラメーターとして指定されたユーザー名とパスワードは無視されます。 次のエラー メッセージが表示されます。

アクセスが拒否されました。

ただし、クライアントのログオン ユーザーがサーバーの Administrators グループに追加された後に機能します。

また、次のスクリプト コードを使用する場合にも機能します。

Set objLogon = CreateObject("LoginAdmin.ImpersonateUser")  
objLogon.Logon "Administrator", "AdminPassword", "Machinename"  
Set oNS = GetObject("IIS:")
Set oRoot = oNS.OpenDSObject("IIS://SERVER/SHARE", "Mordor\administrator", "Gollum", 1)'User credentials are ignored  
objLogon.Logoff
Set objLogon = Nothing