IDirectoryObject를 사용하여 보안 설명자 가져오기
이 항목에는 보안 설명자를 가져오는 데 사용되는 코드 예제가 포함되어 있습니다.
다음 C++ 코드 예제는 다음과 같습니다.
- 버퍼를 만듭니다.
- IDirectoryObject 인터페이스를 사용하여 지정된 개체의 보안 설명자를 가져옵니다.
- 보안 설명자를 버퍼에 복사합니다.
- 보안 설명자 데이터를 포함하는 SECURITY_DESCRIPTOR 구조체에 대한 포인터를 반환합니다.
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;
}