次の方法で共有


IADsOpenDSObject::OpenDSObject メソッド (iads.h)

IADsOpenDSObject::OpenDSObject メソッドは、指定された資格情報を使用して ADSI オブジェクトにバインドし、指定したオブジェクトへの IDispatch ポインターを取得します。

重要 WinNT プロバイダーでこの方法を使用することはお勧めしません。 詳細については、サポート技術情報の記事 218497、Active Directory サービス インターフェイス WinNT プロバイダーでのユーザー認証の問題 を参照してください。
 

構文

HRESULT OpenDSObject(
  [in]  BSTR      lpszDNName,
  [in]  BSTR      lpszUserName,
  [in]  BSTR      lpszPassword,
  [in]  long      lnReserved,
  [out] IDispatch **ppOleDsObj
);

パラメーター

[in] lpszDNName

ADSI オブジェクトの ADsPath を指定する null で終わる Unicode 文字列。 このパラメーターのバインド文字列の詳細と例については、LDAP ADsPathを参照してください。 特定のサーバー名を含む ADsPath で LDAP プロバイダーを使用する場合、lnReserved パラメーターに ADS_SERVER_BIND フラグを含める必要があります。

[in] lpszUserName

名前空間サーバーからのアクセス許可をセキュリティで保護するために使用するユーザー名を指定する、null で終わる Unicode 文字列。 詳細については、次の「解説」セクションを参照してください。

[in] lpszPassword

名前空間サーバーからアクセス許可を取得するために使用するパスワードを指定する、null で終わる Unicode 文字列。

[in] lnReserved

バインド オプションを定義するために使用される認証フラグ。 詳細については、ADS_AUTHENTICATION_ENUMを参照してください。

[out] ppOleDsObj

要求されたオブジェクトの IDispatch インターフェイスへのポインター。

戻り値

このメソッドは、IDispatch インターフェイスがこれらの資格情報を使用して正常に取得されたときの S_OK など、標準の戻り値をサポートします。

詳細については、「ADSI エラー コードの」を参照してください。

備考

このメソッドは、ユーザーの資格情報を検証するためだけに使用しないでください。

lnReserved 設定されている場合、OpenDSObject の動作は、接続先のプロバイダーによって異なります。 高セキュリティ名前空間では、これらのフラグが無視され、常に認証が必要になる場合があります。

IADsOpenDSObject::OpenDSObject メソッドは、認証および暗号化されたユーザー資格情報をキャッシュに保持します。 キャッシュされた資格情報は、後続の操作で他のディレクトリ オブジェクトにバインドするために使用できます。 ADSI クライアント アプリケーションは、ユーザーから提供された資格情報をキャッシュしないでください。 代わりに、キャッシュを実行するために ADSI インフラストラクチャに依存する必要があります。 キャッシュされた資格情報を使用するには、lpszPassword を し、lpszUserName OpenDSObjectの後続の呼び出しで変更しない必要があります。 次のコード例は、この操作を示しています。

Dim dso As IADsOpenDSObject
Dim obj1, obj2 As IADs
Dim szUsername As String
Dim szPassword As String

Set dso = GetObject("LDAP:")

' Insert code securely.

' Supply full credentials to initiate a server connection.
Set obj1 = dso.OpenDSObject( _
    "LDAP://server1/CN=Dept1,DC=Fabrikam,DC=com", _
    szUsername, _
    szPassword, _
    ADS_SECURE_AUTHENTICATION + ADS_SERVER_BIND)

' Perform an operation with the bound object, obj1
MsgBox obj1.Class

' Bind to another object with the cached user credential.
Set obj2 = dso.OpenDSObject( _
    "LDAP://server1/CN=Dept2,DC=Fabrikam,DC=com", _
    szUsername, _
    szPassword, _
    ADS_SECURE_AUTHENTICATION + ADS_SERVER_BIND)

MsgBox obj2.Class

IADsOpenDSObject::OpenDSObject 関数に渡される資格情報は、呼び出し元スレッドのセキュリティ コンテキストに影響を与えない特定のオブジェクトでのみ使用されます。 つまり、次のコード例では、IADsOpenDSObject::OpenDSObject を 呼び出すと、GetObjectの呼び出しとは異なる資格情報 使用されます。

Dim dso As IADsOpenDSObject
Dim obj1, obj2 As IADs
Dim szUsername As String
Dim szPassword As String

Set dso = GetObject("LDAP:")

' Insert code securely.

' Bind using full credentials.
Set obj1 = dso.OpenDSObject( _
    "LDAP://server1/CN=Dept1,DC=Fabrikam,DC=com", _
    szUsername, _
    szPassword, _
    ADS_SECURE_AUTHENTICATION + ADS_SERVER_BIND)

' Bind to another object with the default credentials.
Set obj2 = GetObject("LDAP://server1/CN=Dept2,DC=Fabrikam,DC=com")

サーバーレス バインディングでは、サーバー名 "server1" は明示的に指定されません。 代わりに、既定のサーバーが使用されます。 LDAP プロバイダーのみがサーバーレス バインディングをサポートします。 この機能を使用するには、クライアント コンピューターが Active Directory ドメイン上にある必要があります。 コンピューターからサーバーレス バインドを試行するには、ドメイン ユーザーとしてバインドする必要があります。

資格情報のキャッシュが正常に機能するためには、キャッシュ ハンドルを維持するためにオブジェクト参照を未処理のままにしておくことが重要です。 上記の例では、"obj1" を解放した後に "obj2" を開こうとすると、認証エラーが発生します。

IADsOpenDSObject メソッドは、lpszUserName を し、lpszPassword NULLを する場合に、既定の資格情報を使用します。

LDAP プロバイダーを使用して特定のディレクトリ要求を正常に完了するために Kerberos 認証が必要な場合、lpszDNName バインディング文字列では、"LDAP://CN=Jeff Smith,CN=admin,DC=Fabrikam,DC=com" などのサーバーレス ADsPath を使用するか、"LDAP://central3.corp.Fabrikam.com/CN=Jeff Smith,CN=admin,DC=Fabrikam,DC=com"。 フラット NETBIOS 名または短い DNS 名を使用してサーバーにバインドします。たとえば、"central3.corp.Fabrikam.com" ではなく短い名前 "central3" を使用すると、Kerberos 認証が生成される場合と、生成されない場合があります。

ADsOpenObject ヘルパー関数は、IADsOpenDSObject::OpenDSObject メソッドと同じ機能を提供します。

Active Directory の LDAP プロバイダーを使用すると、lpszUserName 次のいずれかの文字列として渡すことができます。

  • ユーザー アカウントの名前 ("jeffsmith" など)。 ユーザー名を単独で使用するには、lnReserved パラメーターに ADS_SECURE_AUTHENTICATION フラグのみを設定する必要があります。
  • 以前のバージョンの Windows からのユーザー パス ("Fabrikam\jeffsmith" など)。
  • "CN=Jeff Smith,OU=Sales,DC=Fabrikam,DC=Com" などの識別名。 DN を使用するには、lnReserved パラメーターを 0 にするか、ADS_USE_SSL フラグを含める必要があります
  • "jeffsmith@Fabrikam.com" などのユーザー プリンシパル名 (UPN)。 UPN を使用するには、ターゲット ユーザー オブジェクトの userPrincipalName 属性に適切な UPN 値を割り当てる必要があります。

次のコード例は、IADsOpenDSObject を使用して、LDAP プロバイダーを介してセキュリティで保護された認証を使用して "Fabrikam" で "Administrator" ユーザー オブジェクトを開く方法を示しています。

Dim dso As IADsOpenDSObject
Dim domain As IADsDomain
Dim szUsername As String
Dim szPassword As String

On Error GoTo Cleanup

' Insert code to securely retrieve the user name and password.
 
Set dso = GetObject("LDAP:")
Set domain = dso.OpenDSObject("LDAP://Fabrikam", szUsername, _
                              szPassword, _
                              ADS_SECURE_AUTHENTICATION)

Cleanup:
    If (Err.Number <> 0 ) Then
        MsgBox("An error has occurred. " & Err.Number)
    End If
    Set dso = Nothing
    Set domain = Nothing

次のコード例では、IADsOpenDSObject を使用して、LDAP プロバイダーを介して Active Directory オブジェクトを開きます。

IADsOpenDSObject *pDSO = NULL;
HRESULT hr = S_OK;
 
hr = ADsGetObject(L"LDAP:", IID_IADsOpenDSObject, (void**) &pDSO);
if (SUCCEEDED(hr))
{
    IDispatch *pDisp;
    hr = pDSO->OpenDSObject(CComBSTR("LDAP://DC=Fabrikam, DC=com"), 
                       CComBSTR("jeffsmith@Fabrikam.com"),
                       CComBSTR("passwordhere"),
                       ADS_SECURE_AUTHENTICATION, 
                       &pDisp);
    pDSO->Release();
    if (SUCCEEDED(hr))
    {
        IADs *pADs;
        hr = pDisp->QueryInterface(IID_IADs, (void**) &pADs);
        pDisp->Release();
        if (SUCCEEDED(hr))
        {
        // Perform an object manipulation here.
            pADs->Release();
        }
    }
}

必要条件

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

関連項目

ADSI エラー コード

ADS_AUTHENTICATION_ENUM

ADsOpenObject の

バインド の

GetObject の

IADsOpenDSObject

IDispatch の

LDAP ADsPath を する

WNetAddConnetion2 の