다음을 통해 공유


IADsOpenDSObject::OpenDSObject 메서드(iads.h)

IADsOpenDSObject::OpenDSObject 메서드는 지정된 자격 증명을 사용하여 ADSI 개체에 바인딩하고 지정된 개체에 대한 IDispatch 포인터를 검색합니다.

중요 WinNT 공급자와 함께 이 메서드를 사용하지 않는 것이 좋습니다. 자세한 내용은 Active Directory 서비스 인터페이스 WinNT 공급자에 대한 KB 문서 218497 사용자 인증 문제를 참조하세요.
 

구문

HRESULT OpenDSObject(
  [in]  BSTR      lpszDNName,
  [in]  BSTR      lpszUserName,
  [in]  BSTR      lpszPassword,
  [in]  long      lnReserved,
  [out] IDispatch **ppOleDsObj
);

매개 변수

[in] lpszDNName

ADSI 개체의 ADsPath를 지정하는 null로 끝나는 유니코드 문자열입니다. 이 매개 변수에 대한 바인딩 문자열의 자세한 내용과 예제는 LDAP ADsPath를 참조하세요. 특정 서버 이름을 포함하는 ADsPath와 함께 LDAP 공급자를 사용하는 경우 lnReserved 매개 변수에는 ADS_SERVER_BIND 플래그가 포함되어야 합니다.

[in] lpszUserName

네임스페이스 서버에서 사용 권한을 보호하는 데 사용할 사용자 이름을 지정하는 null로 끝나는 유니코드 문자열입니다. 자세한 내용은 아래 설명 부분을 참조하십시오.

[in] lpszPassword

네임스페이스 서버에서 사용 권한을 얻는 데 사용할 암호를 지정하는 null로 끝나는 유니코드 문자열입니다.

[in] lnReserved

바인딩 옵션을 정의하는 데 사용되는 인증 플래그입니다. 자세한 내용은 ADS_AUTHENTICATION_ENUM.

[out] ppOleDsObj

요청된 개체의 IDispatch 인터페이스에 대한 포인터에 대한 포인터입니다.

반환 값

이 메서드는 이러한 자격 증명을 사용하여 IDispatch 인터페이스를 성공적으로 검색한 S_OK 포함하여 표준 반환 값을 지원합니다.

자세한 내용은 ADSI 오류 코드를 참조하세요.

설명

이 메서드는 사용자 자격 증명의 유효성을 검사하는 데만 사용하면 안 됩니다.

lnReserved가 설정되면 OpenDSObject의 동작은 연결하는 공급자에 따라 달라집니다. 높은 보안 네임스페이스는 이러한 플래그를 무시하고 항상 인증이 필요할 수 있습니다.

IADsOpenDSObject::OpenDSObject 메서드는 캐시에서 인증되고 암호화된 사용자 자격 증명을 유지 관리합니다. 캐시된 자격 증명은 다른 디렉터리 개체에 바인딩하기 위해 후속 작업에서 사용할 수 있습니다. ADSI 클라이언트 애플리케이션은 사용자가 제공한 자격 증명을 캐시해서는 안 됩니다. 대신 ADSI 인프라를 사용하여 캐싱을 수행해야 합니다. 캐시된 자격 증명을 사용하려면 lpszPasswordlpszUserNameOpenDSObject의 후속 호출에서 변경되지 않은 상태로 유지되어야 합니다. 다음 코드 예제에서는 이 작업을 보여줍니다.

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"를 열려고 하면 인증 실패가 발생합니다.

lpszUserNamelpszPasswordNULL로 설정된 경우 IADsOpenDSObject 메서드는 기본 자격 증명을 사용합니다.

LDAP 공급자를 사용하여 특정 디렉터리 요청을 성공적으로 완료하기 위해 Kerberos 인증이 필요한 경우 lpszDNName 바인딩 문자열은 서버리스 ADsPath(예: "LDAP://CN=Jeff Smith,CN=admin,DC=Fabrikam,DC=com")를 사용해야 합니다. 또는 "LDAP://central3.corp.Fabrikam.com/CN=Jeff Smith"와 같은 정규화된 DNS 서버 이름과 함께 ADsPath를 사용해야 합니다. 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 플래그를 포함해야 합니다.
  • UPN(사용자 계정 이름)(예: "jeffsmith@Fabrikam.com") UPN을 사용하려면 대상 사용자 개체의 userPrincipalName 특성에 적절한 UPN 값을 할당해야 합니다.

예제

다음 코드 예제에서는 IADsOpenDSObject 를 사용하여 LDAP 공급자를 통해 보안 인증을 사용하여 "Fabrikam"에서 "관리자" 사용자 개체를 여는 방법을 보여 줍니다.

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

추가 정보

ADSI 오류 코드

ADS_AUTHENTICATION_ENUM

ADsOpenObject

바인딩

GetObject

IADsOpenDSObject

IDispatch

LDAP ADsPath

WNetAddConnetion2