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

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

大事な WinNT プロバイダーでこの方法を使用することはお勧めしません。 詳細については、KB の記事「 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 インフラストラクチャに依存する必要があります。 キャッシュされた資格情報を使用するには、openDSObject の後続の呼び出しで lpszPasswordlpszUserName を変更しない必要があります。 次のコード例は、この操作を示しています。

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 メソッドは、lpszUserNamelpszPasswordNULL に設定されている場合に、既定の資格情報を使用します。

LDAP プロバイダーを使用して特定のディレクトリ要求を正常に完了するために Kerberos 認証が必要な場合、 lpszDNName バインド文字列では、"LDAP://CN=Jeff Smith,CN=admin,DC=Fabrikam,DC=com" などのサーバーレス ADsPath を使用するか、完全修飾 DNS サーバー名 ("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
対象プラットフォーム Windows
ヘッダー iads.h
[DLL] Activeds.dll

こちらもご覧ください

ADSI エラー コード

ADS_AUTHENTICATION_ENUM

ADsOpenObject

Binding

GetObject

IADsOpenDSObject

IDispatch

LDAP ADsPath

WNetAddConnetion2