ADsOpenObjectとIADsOpenDSObject :: OpenDSObjectを使用したバインド
ADsOpenObject関数とIADsOpenDSObject :: OpenDSObjectメソッドは、代替の資格情報を指定する必要がある場合やデータの暗号化が必要な場合に、ディレクトリサービスオブジェクトにバインドするために使用されます。
可能な場合は、呼び出し元スレッドの資格情報を使用する必要があります。 ただし、代替の資格情報を使用する必要がある場合は、ADsOpenObject関数またはIADsOpenDSObject :: OpenDSObjectメソッドを使用する必要があります。 代替の資格情報を使用する場合は、パスワードをキャッシュしないことが重要です。 最初のバインド操作にユーザー名とパスワードを指定し、後続のバインドでユーザー名のみを指定することで、複数のバインド操作を実行できます。 システムは最初の呼び出しでセッションを設定し、次の条件が満たされている限り、後続のバインド呼び出しで同じセッションを使用します。
- 各バインド操作で同じユーザー名。
- サーバーレスバインドを実装するか、各バインド操作で同じサーバーにバインドします。
- いずれかのバインド操作からのオブジェクト参照を保持して、開いているセッションを維持します。 最後のオブジェクト参照が解放されると、セッションは閉じられます。
ADsOpenObjectとIADsOpenDSObject :: OpenDSObjectは、Windows NTセキュリティサポートプロバイダーインターフェイス (SSPI) を使用して、認証オプションの柔軟性を確保します。 これらのインターフェイスを使用する主な利点は、Active Directoryクライアントにさまざまな種類の認証を提供し、セッションを暗号化することです。 現時点では、ADSIでは証明書を渡すことはできません。 そのため、dwReservedパラメーターでのフラグの設定方法に応じて、暗号化にSSLを使用し、Kerberos、NTLM、または単純な認証を使用できます。
ADSIでは特定のSSPIプロバイダーを要求することはできませんが、常に最優先プロトコルが取得されます。 Windowsを実行しているコンピューターにバインドするWindowsクライアントの場合、プロトコルはKerberosです。 Webページの場合は、Webページを実行する前に認証が行われるため、認証用の証明書を許可しないことができます。
Open操作ではユーザーとパスワードを指定できますが、これは行わないでください。 代わりに、資格情報を指定せず、呼び出し元のセキュリティコンテキストの資格情報を暗黙的に使用します。 ADsOpenObjectまたはIADsOpenDSObject :: OpenDSObjectで呼び出し元の資格情報を使用してディレクトリオブジェクトにバインドするには、ユーザー名とパスワードの両方にNULL
を指定します。
最後に、認証なしでバインドするには、ADS_NO_AUTHENTICATIONフラグを使用します。 認証なしは、ADSIが匿名ユーザーとしてターゲットオブジェクトにバインドしようとし、認証を実行しないことを示します。 これは、LDAPで匿名バインドを要求することと同じであり、すべてのユーザーがセキュリティコンテキストに含まれていることを示します。
認証フラグが0に設定されている場合、ADSIはプレーンテキストとして送信される単純なバインドを実行します。
注意
認証フラグを指定せずにユーザー名とパスワードを指定した場合、ユーザー名とパスワードはプレーンテキストでネットワーク経由で送信されます。これは、セキュリティ上のリスクです。 認証フラグを指定せずにユーザー名とパスワードを指定しないでください。
例
次のVisual Basicコード例は、IADsOpenDSObject :: OpenDSObjectメソッドの使用方法を示しています。
Const ADS_SECURE_AUTHENTICATION = 1
Dim openDS As IADsOpenDSObject
Dim usr As IADsUser
Set openDS = GetObject("LDAP:")
openDS.OpenDSObject("LDAP://CN=jeffsmith,DC=fabrikam,DC=com",
vbNullString,
vbNullString,
ADS_SECURE_AUTHENTICATION)
次C++のコード例は、ADsOpenObject関数の使用方法を示しています。
IADs *pObject;
HRESULT hr;
hr = ADsOpenObject(L"LDAP://CN=jeffsmith,DC=fabrikam,DC=com",
NULL,
NULL,
ADS_SECURE_AUTHENTICATION,
IID_IADs,
(void**)&pObject);
if(SUCCEEDED(hr))
{
// Use the object.
// Release the object.
pObject->Release()
}
IADsOpenDSObjectインターフェイスはC++でも使用できますが、ADsOpenObject関数と重複しています。
次C++のコード例は、IADsOpenDSObjectインターフェイスを使用して、上記のコード例と同じバインド操作を実行する方法を示しています。
IADsOpenDSObject *pDSO;
HRESULT hr;
hr = ADsGetObject(L"LDAP:", IID_IADsOpenDSObject, (void**)&pDSO);
if(SUCCEEDED(hr))
{
IDispatch *pDisp;
hr = pDSO->OpenDSObject(CComBSTR("LDAP://CN=jeffsmith,DC=fabrikam,DC=com"),
NULL,
NULL,
ADS_SECURE_AUTHENTICATION,
&pDisp);
if(SUCCEEDED(hr))
{
IADs *pObject;
hr = pDisp->QueryInterface(IID_IADs, (void**) &pObject);
if(SUCCEEDED(hr))
{
// Use the object.
// Release the object.
pObject->Release();
}
pDisp->Release();
}
pDSO->Release();
}