Uso de IDirectoryObject para obtener un descriptor de seguridad
En este tema se incluye un ejemplo de código que se usa para obtener un descriptor de seguridad.
El siguiente ejemplo de código de C++:
- Crea un búfer.
- Usa la interfaz IDirectoryObject para obtener el descriptor de seguridad del objeto especificado.
- Copia el descriptor de seguridad en el búfer.
- Devuelve un puntero a una estructura SECURITY_DESCRIPTOR que contiene los datos del descriptor de seguridad.
HRESULT GetSDFromIDirectoryObject(
IDirectoryObject *pObject,
PSECURITY_DESCRIPTOR *pSecurityDescriptor)
{
HRESULT hr = E_FAIL;
PADS_ATTR_INFO pAttrInfo;
DWORD dwReturn= 0;
LPWSTR pAttrName= L"nTSecurityDescriptor";
PSECURITY_DESCRIPTOR pSD = NULL;
if(!pObject || !pSecurityDescriptor)
{
return E_INVALIDARG;
}
// Get the nTSecurityDescriptor.
hr = pObject->GetObjectAttributes( &pAttrName,
1,
&pAttrInfo,
&dwReturn );
if((FAILED(hr)) || (dwReturn != 1))
{
wprintf(L" failed: 0x%x\n", hr);
return hr;
}
// Check the attribute name and type.
if((_wcsicmp(pAttrInfo->pszAttrName,L"nTSecurityDescriptor") == 0) &&
(pAttrInfo->dwADsType==ADSTYPE_NT_SECURITY_DESCRIPTOR))
{
// Get a pointer to the security descriptor.
pSD = (PSECURITY_DESCRIPTOR)(pAttrInfo->pADsValues->SecurityDescriptor.lpValue);
DWORD SDSize = pAttrInfo->pADsValues->SecurityDescriptor.dwLength;
// Allocate memory for the buffer and copy the security descriptor to the buffer.
*pSecurityDescriptor = (PSECURITY_DESCRIPTOR)CoTaskMemAlloc(SDSize);
if (*pSecurityDescriptor)
{
CopyMemory((PVOID)*pSecurityDescriptor, (PVOID)pSD, SDSize);
}
else
{
hr = E_FAIL;
}
// Caller must free the memory for pSecurityDescriptor using CoTaskMemFree.
}
// Free memory used for the attributes retrieved.
FreeADsMem(pAttrInfo);
return hr;
}