Какая модификация моего кода необходима, чтобы SetSecurityDescriptorGroup не терпел неудачу?

Вот ссылка на документацию по этой функции: 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;
}

person Mr. Man    schedule 07.10.2016    source источник
comment
Поиск здесь SetSecurityDescriptorGroup дал этот ответ в качестве самого первого результата.   -  person Ken White    schedule 08.10.2016
comment
Спасибо, Кен. Я изменю свой запрос, чтобы запросить пример кода, который изменяет существующий SecurityDescriptor. Этот пример кода создает его с нуля.   -  person Mr. Man    schedule 08.10.2016
comment
GetNamedSecurityInfo выделяет дескриптор безопасности для вас, вы сами не выделяете память (поэтому у вас есть утечка памяти).   -  person Jonathan Potter    schedule 08.10.2016
comment
Гарри, ваше предложение позволило моему коду успешно завершиться. Я предполагаю, что вам нужно будет повторно ввести этот комментарий в качестве ответа, чтобы я мог правильно его отметить?   -  person Mr. Man    schedule 10.10.2016


Ответы (1)


Функция GetNamedSecurityInfo() создает дескриптор безопасности в относительном формате, но функция SetSecurityDescriptorGroup() требует дескриптор безопасности в абсолютном формате. Вы можете преобразовать относительный формат в абсолютный, используя СделатьАбсолютсд().

(См. также Абсолютный и самоотносительный дескрипторы безопасности в MSDN.)

person Harry Johnston    schedule 10.10.2016