Win32 API 日本語リファレンス
ホームNetworking.ActiveDirectory › IADsOpenDSObject

IADsOpenDSObject

COMIDispatch (デュアル)
IDispatch を実装(デュアルインターフェース)。HSP では comobj 経由でメソッド名による遅延バインド呼び出しができます(vtableインデックス不要)。
IIDddf2891e-0f9c-11d0-8ad4-00c04fd8d503継承元IDispatch呼び出し名前(IDispatch) または vtbl自前メソッド開始 vtbl7

公式ドキュメント

IADsOpenDSObject インターフェイスは、基盤となるディレクトリ ストア内のオブジェクトへのバインドに使用するセキュリティ コンテキストを提供するために設計されています。

メソッド 1

vtbl = vtable インデックス(0始まり)。IDispatch 実装のため HSP ではメソッド名でも呼べます(上記)。低レベルの index 呼び出し用に vtbl も掲載。0〜2 は IUnknown。

vtbl 7 HRESULT OpenDSObject(LPWSTR lpszDNName, LPWSTR lpszUserName, LPWSTR lpszPassword, INT lnReserved, IDispatch** ppOleDsObj)

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

lpszDNNameLPWSTRinADSI オブジェクトの ADsPath を指定する、null で終わる Unicode 文字列です。このパラメーターのバインド文字列の詳細と例については、LDAP ADsPath を参照してください。特定のサーバー名を含む ADsPath で LDAP プロバイダーを使用する場合は、lnReserved パラメーターに ADS_SERVER_BIND フラグを含める必要があります。
lpszUserNameLPWSTRin名前空間サーバーからアクセス許可を取得するために使用するユーザー名を指定する、null で終わる Unicode 文字列です。詳細については、後続の解説セクションを参照してください。
lpszPasswordLPWSTRin名前空間サーバーからアクセス許可を取得するために使用するパスワードを指定する、null で終わる Unicode 文字列です。
lnReservedINTinバインド オプションを定義するために使用する認証フラグです。詳細については、ADS_AUTHENTICATION_ENUM を参照してください。
ppOleDsObjIDispatch**out要求されたオブジェクト上の IDispatch インターフェイスへのポインターへのポインターです。

戻り値

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

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

解説(Remarks)

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

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:")

' 安全にコードを挿入します。

' サーバー接続を開始するために完全な資格情報を指定します。
Set obj1 = dso.OpenDSObject( _
    "LDAP://server1/CN=Dept1,DC=Fabrikam,DC=com", _
    szUsername, _
    szPassword, _
    ADS_SECURE_AUTHENTICATION + ADS_SERVER_BIND)

' バインドされたオブジェクト obj1 で操作を実行します。
MsgBox obj1.Class

' キャッシュされたユーザー資格情報を使用して別のオブジェクトにバインドします。
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:")

' 安全にコードを挿入します。

' 完全な資格情報を使用してバインドします。
Set obj1 = dso.OpenDSObject( _
    "LDAP://server1/CN=Dept1,DC=Fabrikam,DC=com", _
    szUsername, _
    szPassword, _
    ADS_SECURE_AUTHENTICATION + ADS_SERVER_BIND)

' 既定の資格情報を使用して別のオブジェクトにバインドします。
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 を使用するか、"LDAP://central3.corp.Fabrikam.com/CN=Jeff Smith,CN=admin,DC=Fabrikam,DC=com" のような完全修飾 DNS サーバー名を含む ADsPath を使用する必要があります。フラットな NETBIOS 名や短い DNS 名を使用してサーバーにバインドする場合、たとえば "central3.corp.Fabrikam.com" の代わりに短い名前 "central3" を使用した場合は、Kerberos 認証が得られることもあれば得られないこともあります。

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

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

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

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

On Error GoTo Cleanup

' ユーザー名とパスワードを安全に取得するコードを挿入します。
 
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

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

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))
        {
        // ここでオブジェクトの操作を実行します。
            pADs->Release();
        }
    }
}
出典・ライセンス: 上記「公式ドキュメント」の内容は Microsoft の Win32 API ドキュメント(MicrosoftDocs/sdk-api)を日本語に翻訳・改変したものです。© Microsoft Corporation. CC BY 4.0 で提供。
Microsoft 公式リファレンス: 英語 (en-us) · 日本語 (ja-jp) · 原文ソース (GitHub)

HSP用 COM定義

#usecom / #comfunc によるHSPのCOM呼び出し定義。数字は vtbl インデックス(0始まり)。クラスIDが無い場合 #usecom の末尾は "{}"、ある場合は "{CLSID}"

#define global IID_IADsOpenDSObject "{DDF2891E-0F9C-11D0-8AD4-00C04FD8D503}"
#usecom global IADsOpenDSObject IID_IADsOpenDSObject "{}"
#comfunc global IADsOpenDSObject_OpenDSObject  7 wstr,wstr,wstr,int,sptr
; ※数字は vtbl インデックス(0始まり)。0/1/2 は IUnknown(QueryInterface/AddRef/Release)。
; ※このインターフェースは直接 CoCreateInstance するクラスIDが無いため "{}"(他メソッド/アクティベーションで取得)。
; ※ハンドル/void*等の不透明ポインタは IronHSP では intptr 指定が可能。
; ※IDispatch 実装。HSP では comobj 経由でメソッド名による呼び出しも可能(vtbl 不要)。