다음을 통해 공유


ADsOpenObject 및 IADsOpenDSObject::OpenDSObject를 사용하여 바인딩

대체 자격 증명을 지정해야 하고 데이터 암호화가 필요한 경우 ADsOpenObject 함수 및 IADsOpenDSObject::OpenDSObject 메서드를 사용하여 디렉터리 서비스 개체에 바인딩합니다.

가능한 경우 호출 스레드의 자격 증명을 사용해야 합니다. 그러나 대체 자격 증명을 사용해야 하는 경우 ADsOpenObject 함수 또는 IADsOpenDSObject::OpenDSObject 메서드를 사용해야 합니다. 대체 자격 증명을 사용하는 경우 암호를 캐시하지 않는 것이 중요합니다. 첫 번째 바인딩 작업의 사용자 이름 및 암호를 지정한 다음 후속 바인딩에서 사용자 이름만 지정하여 여러 바인딩 작업을 수행할 수 있습니다. 시스템은 첫 번째 호출에서 세션을 설정하고 다음 조건이 충족되는 한 후속 바인딩 호출에서 동일한 세션을 사용합니다.

  • 각 바인딩 작업에서 동일한 사용자 이름입니다.
  • 각 바인딩 작업에서 서버리스 바인딩을 구현하거나 동일한 서버에 바인딩합니다.
  • 바인딩 작업 중 하나에서 개체 참조를 유지하여 열린 세션을 유지합니다. 마지막 개체 참조가 해제되면 세션이 닫힙니다.

ADsOpenObjectIADsOpenDSObject::OpenDSObject는 Windows NT SSPI(보안 지원 공급자 인터페이스)를 사용하여 인증 옵션의 유연성을 허용합니다. 이러한 인터페이스를 사용할 때의 주요 이점은 Active Directory 클라이언트에 다양한 유형의 인증을 제공하고 세션을 암호화하는 것입니다. 현재 ADSI는 인증서 전달을 허용하지 않습니다. 따라서 dwReserved 매개 변수에서 플래그를 설정하는 방법에 따라 암호화 및 Kerberos, NTLM 또는 단순 인증에 SSL을 사용할 수 있습니다.

항상 가장 높은 기본 설정 프로토콜을 가져오더라도 ADSI에서 특정 SSPI 공급자를 요청할 수 없습니다. Windows 클라이언트가 Windows를 실행하는 컴퓨터에 바인딩하는 경우 프로토콜은 Kerberos입니다. 웹 페이지를 실행하기 전에 인증이 발생하므로 웹 페이지의 경우 인증에 인증서를 허용하지 않는 것이 허용됩니다.

열기 작업을 사용하면 사용자 및 암호를 지정할 수 있지만 그렇게 해서는 안 됩니다. 대신 자격 증명을 지정하지 말고 호출자의 보안 컨텍스트의 자격 증명을 암시적으로 사용합니다. 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();
}

추가 정보

ADS_AUTHENTICATION_ENUM 예제

IADsOpenDSObject

ADsOpenObject