IADsOpenDSObject::OpenDSObject メソッド (iads.h)
IADsOpenDSObject::OpenDSObject メソッドは、指定された資格情報を使用して ADSI オブジェクトにバインドし、指定されたオブジェクトへの IDispatch ポインターを取得します。
構文
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 の後続の呼び出しで lpszPassword と lpszUserName を変更しない必要があります。 次のコード例は、この操作を示しています。
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 を使用するか、完全修飾 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 |