Вот ссылка на документацию по этой функции: https://msdn.microsoft.com/en-us/library/windows/desktop/aa446654(v=vs.85).aspx
Я написал код, который /должен/ работать, но вместо этого при вызове выдает ошибку ERROR_INVALID_SECURITY_DESCR. Мой код должен копировать известный рабочий guid из одной папки в другую, но я возьму любой рабочий пример кода, который не выдает ошибку в SetSecurityDescriptorGroup при изменении SecurityDescriptor для файла или папки.
Как вы можете видеть ниже, мой код проверяет правильность всего, включая дескрипторы безопасности, но ошибка «1338» по-прежнему возникает при вызове SetSecurityDescriptorGroup.
«1338» — это «ERROR_INVALID_SECURITY_DESCR».
#include "stdafx.h"
#include <windows.h>
#include <AclAPI.h>
#include <sddl.h>
#include <iostream>
using std::wcout;
#include <string>
using std::string;
using std::wstring;
int main()
{
PSECURITY_DESCRIPTOR pGoodSecurityDescriptor = NULL;
LPCWSTR goodFilename = L"\\\\?\\UNC\\server\\home\\good";
if (! (ERROR_SUCCESS == GetNamedSecurityInfo(goodFilename, SE_FILE_OBJECT,
SACL_SECURITY_INFORMATION | DACL_SECURITY_INFORMATION | GROUP_SECURITY_INFORMATION | OWNER_SECURITY_INFORMATION,
NULL, NULL, NULL, NULL, &pGoodSecurityDescriptor)))
{
_tprintf(_T("GetNamedSecurityInfo Error %u\n"), GetLastError());
return -1;
}
if (!IsValidSecurityDescriptor(pGoodSecurityDescriptor))
{
_tprintf(_T("IsValidSecurityDescriptor Error %u\n"), GetLastError());
return -1;
}
PSECURITY_DESCRIPTOR pBadSecurityDescriptor = NULL;
LPCWSTR badFilename = L"\\\\?\\UNC\\server\\home\\bad";
if (!(ERROR_SUCCESS == GetNamedSecurityInfo(badFilename, SE_FILE_OBJECT,
SACL_SECURITY_INFORMATION | DACL_SECURITY_INFORMATION | GROUP_SECURITY_INFORMATION | OWNER_SECURITY_INFORMATION,
NULL, NULL, NULL, NULL, &pBadSecurityDescriptor)))
{
_tprintf(_T("GetNamedSecurityInfo Error %u\n"), GetLastError());
return -1;
}
if (!IsValidSecurityDescriptor(pBadSecurityDescriptor))
{
_tprintf(_T("IsValidSecurityDescriptor Error %u\n"), GetLastError());
return -1;
}
PSID pGroup = (PSID)LocalAlloc(LPTR, sizeof(PSID));
BOOL groupDefaulted = FALSE;
if (!GetSecurityDescriptorGroup(pGoodSecurityDescriptor, &pGroup, &groupDefaulted))
{
_tprintf(_T("GetSecurityDescriptorGroup Error %u\n"), GetLastError());
return -1;
}
if (!IsValidSid(pGroup))
{
_tprintf(_T("IsValidSid Error %u\n"), GetLastError());
return -1;
}
SetLastError(0);
if (!SetSecurityDescriptorGroup(pBadSecurityDescriptor, &pGroup, groupDefaulted))
{
_tprintf(_T("SetSecurityDescriptorGroup Error %u\n"), GetLastError());
return -1;
}
return 0;
}
GetNamedSecurityInfo
выделяет дескриптор безопасности для вас, вы сами не выделяете память (поэтому у вас есть утечка памяти). - person Jonathan Potter   schedule 08.10.2016