次の方法で共有


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 文字列は<、"S-X-X-XX-XXXXXXXXXX-XXXXXXXXX-XXXXXXXXX-XXX" >という形式にすることもできますが、"S-X-X-XX-XXXXXXXXXX-XXXXXXXXXX-XXXXXX-XXX" の部分は、 ConvertSidToStringSid 関数によって返される文字列と同じです。

オブジェクト SID を使用してバインドする場合、一部の IADsIADsContainer のメソッドとプロパティはサポートされません。 次の IADs プロパティは、オブジェクト 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;
}