GetObjectとADsGetObjectでのバインド

GetObject関数とADsGetObject関数は、認証なしでディレクトリサービスオブジェクトにバインドするために使用されます。 アプリケーションは、ディレクトリサービスデータにアクセスするときに資格情報を提供する必要はありません。 ADSIは、呼び出し元スレッドのセキュリティコンテキストを使用します。 ただし、セキュリティで保護された認証が失敗した場合、ADSIはnullユーザー名とnullパスワードを使用して単純なバインドを実行しようとします。 単純なバインドが成功すると、バインドのユーザーコンテキストはGuestになります。 単純なバインドでは、プレーンテキスト認証が使用されます。 ユーザー名やパスワードはネットワーク経由で送信されないため、これはセキュリティ上の問題ではありません。

GetObject関数は、Visual Basicなど、オートメーションをサポートする言語でディレクトリサービスオブジェクトにバインドするために使用されます。 GetObject関数には、モニカー文字列が必要です。 ADSIでは、バインド文字列はモニカー文字列です。

CやC++など、オートメーションを直接サポートしない言語では、ADSIにはディレクトリサービスオブジェクトにバインドするためのADsGetObject関数が用意されています。 または、MkParseDisplayName関数とMkParseDisplayNameEx関数を使用して、GetObjectと同じ結果を得ることもできます。

LocalSystemアカウントで実行されているサービスの場合、GetObjectとADsGetObjectによって使用されるセキュリティコンテキストは、サービスが実行されているコンピューターによって異なります。 サービスがドメインコントローラーでLocalSystemとして実行されている場合、サービスにはActive Directoryへのシステムレベルのフルアクセス権があります。 サービスがDCで実行されていない場合、サービスには、サービスが実行されているコンピューターのコンピューターアカウントに付与されたアクセス権と特権があります。これは、システムレベルのアクセスよりも大幅に機能が低下します。

次のVisual Basicコード例は、GetObject関数を使用してオブジェクトにバインドする方法を示しています。

Dim myUser as IADs
Set myUser = GetObject("LDAP://CN=jeffsmith,DC=fabrikam,DC=com")

次のC++コード例は、ADsGetObject関数を使用してオブジェクトにバインドする方法を示しています。

IADs *pObject;
HRESULT hr;

// Initialize COM.
CoInitialize(NULL);

hr = ADsGetObject(L"LDAP://CN=jeffsmith,DC=fabrikam,DC=com", 
        IID_IADs,
        (void**) &pObject);

if(SUCCEEDED(hr))
{
    // Use the object.

    // Release the object.
    pObject->Release()
}

// Uninitialize COM.
CoUninitialize();