Как мне создать NULL / пустой DACL?

Мне нужно предоставить доступ каждому для именованного канала, который я создаю. Я понимаю, как это сделать, создать NULL / пустой DACL и передать его CreateNamedPipe,

Как мне создать NULL DACL? Мне сказали, что это не то же самое, что передать нулевой указатель для LPSECURITY_ATTRIBUTES,

5

Решение

Как это:

SECURITY_DESCRIPTOR SD;
InitializeSecurityDescriptor(&SD, SECURITY_DESCRIPTOR_REVISION);
SetSecurityDescriptorDacl(&SD, TRUE, NULL, FALSE);

Я упустил проверку ошибок для краткости. Вы бы этого не сделали.

Затем, когда вы звоните CreateNamedPipe Вы можете настроить запись атрибутов безопасности следующим образом:

SA.nLength = sizeof(SA);
SA.lpSecurityDescriptor = &SD;
SA.bInheritHandle = TRUE;

Документация для SetSecurityDescriptorDacl состояния:

Когда параметр pDacl не указывает на DACL, а флаг bDaclPresent имеет значение TRUE, указывается NULL DACL. Все доступ разрешен. Вы не должны использовать NULL DACL с объектом, потому что любой пользователь может изменить DACL и владельца дескриптора безопасности. Это будет мешать использованию объекта.

Итак, выше указано, как это сделать, но в документации подчеркивается, что вы не должны этого делать.

9

Другие решения

Вот код, который мы используем в одном из наших проектов:

SECURITY_DESCRIPTOR  pSD;
SECURITY_ATTRIBUTES  SA;

if(!InitializeSecurityDescriptor(&pSD, SECURITY_DESCRIPTOR_REVISION))
throw error;
if(!SetSecurityDescriptorDacl(&pSD, true, NULL, false))
throw error;
SA.nLength = sizeof(SA);
SA.lpSecurityDescriptor = &pSD;
SA.bInheritHandle = true;
pSA = &SA;
...
FMapping = CreateFileMapping(INVALID_HANDLE_VALUE, pSA, PAGE_READWRITE, 0, 4096, p);

Этот код создает отображение с доступом для всех

4