다음을 통해 공유


SID를 사용하여 개체에 바인딩

Windows Server 2003에서는 개체 SID(보안 식별자)와 GUID를 사용하여 개체에 바인딩할 수 있습니다. 개체 SID는 objectSID 특성에 저장됩니다. SID에 대한 바인딩은 Windows 2000에서 작동하지 않습니다.

Active Directory Domain Services 대한 LDAP 공급자는 개체 SID를 사용하여 개체에 바인딩하는 메서드를 제공합니다. 바인딩 문자열 형식은 다음과 같습니다.

LDAP://servername/<SID=XXXXX>

이 예제에서 "servername"은 디렉터리 서버의 이름이고 "XXXXX"는 SID의 16진수 값에 대한 문자열 표현입니다. "servername"은 선택 사항입니다. SID 문자열은 문자열의 각 문자가 SID의 각 바이트의 16진수 표현인 형식으로 지정됩니다. 예를 들어 배열이 다음과 같은 경우입니다.

0xAB 0x14 0xE2

SID 바인딩 문자열은 "<SID=AB14E2>"입니다. ADsEncodeBinaryData 함수는 유효한 바인딩 문자열 형식이 아닌 백슬래시를 사용하여 각 바이트 문자 앞에 있기 때문에 SID 배열을 문자열로 변환하는 데 사용하면 안 됩니다.

SID 문자열은 "<SID=S-X-X-XX-XXXXXXXXXX-XXXXXXXXXX-XXXXXXXXX-XXX>"형식을 사용할 수도 있습니다. 여기서 "S-X-X-XX-XXXXXXXX-XXXXXXXXXX-XXXXXXXXX-XXXXXXXXX" 부분은 ConvertSidToStringSid 함수에서 반환하는 문자열과 동일합니다.

개체 SID를 사용하여 바인딩하는 경우 일부 IAD 및IADsContainer 메서드 및 속성은 지원되지 않습니다. 다음 IAD 속성 은 개체 SID를 사용하여 바인딩하여 가져온 개체에서 지원되지 않습니다.

다음 IADsContainer 메서드는 개체 SID를 사용하여 바인딩하여 가져온 개체에서 지원되지 않습니다.

개체 SID를 사용하여 개체에 바인딩한 후 이러한 메서드와 속성을 사용하려면 IADs.Get 메서드를 사용하여 개체 고유 이름을 검색한 다음 고유 이름을 사용하여 개체에 다시 바인딩합니다.

다음 코드 예제에서는 objectSid 를 바인딩 가능한 문자열로 변환하는 방법을 보여 줍니다.

HRESULT VariantArrayToBytes(VARIANT Variant, 
    LPBYTE *ppBytes, 
    DWORD *pdwBytes);

/********

    GetSIDBindStringFromVariant()

    Converts a SID in VARIANT form, such as an objectSid value, and 
    converts it into a bindable string in the form:

    LDAP://<SID=xxxxxxx...>

    The returned string is allocated with AllocADsMem and must be 
    freed by the caller with FreeADsMem.

*********/

LPWSTR GetSIDBindStringFromVariant(VARIANT vSID)
{
    LPWSTR pwszReturn = NULL;

    if(VT_ARRAY & vSID.vt) 
    {
        HRESULT hr;
        LPBYTE pByte;
        DWORD dwBytes = 0;

        hr = VariantArrayToBytes(vSID, &pByte, &dwBytes);
        if(S_OK == hr)
        {
            // Convert the BYTE array into a string of hex 
            // characters.
            CComBSTR sbstrTemp = "LDAP://<SID=";

            for(DWORD i = 0; i < dwBytes; i++)
            {
                WCHAR wszByte[3];

                swprintf_s(wszByte, L"%02x", pByte[i]);
                sbstrTemp += wszByte;
            }

            sbstrTemp += ">";
            pwszReturn = 
               (LPWSTR)AllocADsMem((sbstrTemp.Length() + 1) * 
                sizeof(WCHAR));
            if(pwszReturn)
            {
                wcscpy_s(pwszReturn, sbstrTemp.m_str);
            }

            FreeADsMem(pByte);
        }
    }

    return pwszReturn;
}

/*********

    VariantArrayToBytes()

    This function converts a VARIANT array into an array of BYTES. 
    This function allocates the buffer using AllocADsMem. The 
    caller must free this memory with FreeADsMem when it is no 
    longer required.

**********/

HRESULT VariantArrayToBytes(VARIANT Variant, 
    LPBYTE *ppBytes, 
    DWORD *pdwBytes)
{
    if(!(Variant.vt & VT_ARRAY) ||
        !Variant.parray ||
        !ppBytes ||
        !pdwBytes)
    {
        return E_INVALIDARG;
    }

    *ppBytes = NULL;
    *pdwBytes = 0;

    HRESULT hr = E_FAIL;
    SAFEARRAY *pArrayVal = NULL;
    CHAR HUGEP *pArray = NULL;
    
    // Retrieve the safe array.
    pArrayVal = Variant.parray;
    DWORD dwBytes = pArrayVal->rgsabound[0].cElements;
    *ppBytes = (LPBYTE)AllocADsMem(dwBytes);
    if(NULL == *ppBytes) 
    {
        return E_OUTOFMEMORY;
    }

    hr = SafeArrayAccessData(pArrayVal, (void HUGEP * FAR *) &pArray);
    if(SUCCEEDED(hr))
    {
        // Copy the bytes to the safe array.
        CopyMemory(*ppBytes, pArray, dwBytes);
        SafeArrayUnaccessData( pArrayVal );
        *pdwBytes = dwBytes;
    }
    
    return hr;
}