Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
Dieses Thema enthält ein Codebeispiel, das eine objectSid- in eine bindungsfähige Zeichenfolge konvertiert, um ein Mitglied hinzuzufügen, das zu einer Gruppe auf oberster Ebene gehört.
Das folgende C++-Codebeispiel zeigt, wie sie eine objectSid- in eine bindbare Zeichenfolge konvertieren.
HRESULT VariantArrayToBytes(VARIANT Variant,
LPBYTE *ppBytes,
DWORD *pdwBytes);
/********************************************************************
GetLDAPSidBindStringFromVariantSID()
Converts a SID in VARIANT form, such as an objectSid value,
and converts it into a bindale string in the form:
LDAP://<SID=xxxxxxx...>
The returned string is allocated with AllocADsMem and must
be freed by the caller with FreADsMem.
*******************************************************************/
LPWSTR GetLDAPSidBindStringFromVariantSID(VARIANT vSID)
{
LPWSTR pwszReturn = NULL;
if(vSID.vt != VT_EMPTY)
{
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;
}