Bagikan melalui


Mengikat ke Objek Menggunakan SID

Di Windows Server 2003, dimungkinkan untuk mengikat objek menggunakan pengidentifikasi keamanan (SID) objek serta GUID. SID objek disimpan dalam atribut objectSID . Pengikatan ke SID tidak berfungsi pada Windows 2000.

Penyedia LDAP untuk Active Directory Domain Services menyediakan metode untuk mengikat objek menggunakan objek SID. Format string pengikatan adalah:

LDAP://servername/<SID=XXXXX>

Dalam contoh ini, "nama server" adalah nama server direktori dan "XXXXX" adalah representasi string dari nilai heksadesimal SID. "nama server" bersifat opsional. String SID ditentukan dalam bentuk di mana setiap karakter dalam string adalah representasi heksadesimal dari setiap byte SID. Misalnya, jika array adalah:

0xAB 0x14 0xE2

string pengikatan SID adalah "<SID=AB14E2>". Fungsi ADsEncodeBinaryData tidak boleh digunakan untuk mengonversi array SID menjadi string karena mendahului setiap karakter byte dengan garis miring terbalik, yang bukan format string ikat yang valid.

String SID juga dapat mengambil formulir "SID=S-X-X-XX-XXXXXXXXXXX-XXXXXXXXXX-XXXXXXXXXXXXXXXXXX", di mana bagian "S-X-X-XXXXXXXXXXXX-XXXXXXXXX-XXXXXXX-XXX" sama dengan string yang dikembalikan oleh fungsi ConvertSidToStringSid.><

Saat mengikat menggunakan objek SID, beberapa IAD dan metode dan properti IADsContainer tidak didukung. Properti IAD berikut ini tidak didukung oleh objek yang diperoleh dengan mengikat menggunakan objek SID:

Metode IADsContainer berikut tidak didukung oleh objek yang diperoleh dengan mengikat menggunakan objek SID:

Untuk menggunakan metode dan properti ini setelah mengikat ke objek menggunakan objek SID, gunakan metode IADs.Get untuk mengambil nama khusus objek dan kemudian menggunakan nama khusus untuk mengikat objek lagi.

Contoh kode berikut menunjukkan cara mengonversi objectSid menjadi string yang dapat diikat.

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;
}