IADsOpenDSObject
COMIDispatch (デュアル)comobj 経由でメソッド名による遅延バインド呼び出しができます(vtableインデックス不要)。公式ドキュメント
IADsOpenDSObject インターフェイスは、基盤となるディレクトリ ストア内のオブジェクトへのバインドに使用するセキュリティ コンテキストを提供するために設計されています。
メソッド 1
vtbl = vtable インデックス(0始まり)。IDispatch 実装のため HSP ではメソッド名でも呼べます(上記)。低レベルの index 呼び出し用に vtbl も掲載。0〜2 は IUnknown。
指定された資格情報を使用して ADSI オブジェクトにバインドし、指定されたオブジェクトへの IDispatch ポインターを取得します。
| lpszDNName | LPWSTR | in | ADSI オブジェクトの ADsPath を指定する、null で終わる Unicode 文字列です。このパラメーターのバインド文字列の詳細と例については、LDAP ADsPath を参照してください。特定のサーバー名を含む ADsPath で LDAP プロバイダーを使用する場合は、lnReserved パラメーターに ADS_SERVER_BIND フラグを含める必要があります。 |
| lpszUserName | LPWSTR | in | 名前空間サーバーからアクセス許可を取得するために使用するユーザー名を指定する、null で終わる Unicode 文字列です。詳細については、後続の解説セクションを参照してください。 |
| lpszPassword | LPWSTR | in | 名前空間サーバーからアクセス許可を取得するために使用するパスワードを指定する、null で終わる Unicode 文字列です。 |
| lnReserved | INT | in | バインド オプションを定義するために使用する認証フラグです。詳細については、ADS_AUTHENTICATION_ENUM を参照してください。 |
| ppOleDsObj | IDispatch** | out | 要求されたオブジェクト上の IDispatch インターフェイスへのポインターへのポインターです。 |
戻り値
このメソッドは標準の戻り値をサポートします。これには、これらの資格情報を使用して IDispatch インターフェイスが正常に取得された場合の S_OK が含まれます。
詳細については、ADSI エラー コード を参照してください。
解説(Remarks)
このメソッドは、ユーザーの資格情報を検証するためだけに使用しないでください。
lnReserved が設定されている場合、OpenDSObject の動作は接続先のプロバイダーによって異なります。セキュリティの高い名前空間では、これらのフラグが無視され、常に認証が要求されることがあります。
IADsOpenDSObject::OpenDSObject メソッドは、認証および暗号化されたユーザー資格情報をキャッシュ内に保持します。キャッシュされた資格情報は、他の任意のディレクトリ オブジェクトへのバインドを行う後続の操作で使用できます。ADSI クライアント アプリケーションは、ユーザーから提供された資格情報をキャッシュすべきではありません。代わりに、キャッシュの実行を ADSI インフラストラクチャに任せる必要があります。キャッシュされた資格情報を使用するには、OpenDSObject の後続の呼び出しで lpszPassword と lpszUserName を変更せずに保つ必要があります。次のコード例は、この操作を示しています。
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 メソッドは、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" のような完全修飾 DNS サーバー名を含む ADsPath を使用する必要があります。フラットな NETBIOS 名や短い DNS 名を使用してサーバーにバインドする場合、たとえば "central3.corp.Fabrikam.com" の代わりに短い名前 "central3" を使用した場合は、Kerberos 認証が得られることもあれば得られないこともあります。
ADsOpenObject ヘルパー関数は、IADsOpenDSObject::OpenDSObject メソッドと同じ機能を提供します。
Active Directory 用の LDAP プロバイダーでは、lpszUserName に次のいずれかの文字列を渡すことができます。
- "jeffsmith" のようなユーザー アカウント名。ユーザー名のみを使用するには、lnReserved パラメーターに ADS_SECURE_AUTHENTICATION フラグのみを設定する必要があります。
- "Fabrikam\jeffsmith" のような、以前のバージョンの Windows のユーザー パス。
- "CN=Jeff Smith,OU=Sales,DC=Fabrikam,DC=Com" のような識別名 (DN)。DN を使用するには、lnReserved パラメーターを 0 にするか、ADS_USE_SSL フラグを含める必要があります。
- "jeffsmith@Fabrikam.com" のようなユーザー プリンシパル名 (UPN)。UPN を使用するには、対象のユーザー オブジェクトの userPrincipalName 属性に適切な UPN 値を割り当てる必要があります。
例
次のコード例は、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 公式リファレンス: 英語 (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 不要)。