Мне нужно предоставить доступ каждому для именованного канала, который я создаю. Я понимаю, как это сделать, создать NULL / пустой DACL и передать его CreateNamedPipe
,
Как мне создать NULL DACL? Мне сказали, что это не то же самое, что передать нулевой указатель для LPSECURITY_ATTRIBUTES
,
Как это:
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 и владельца дескриптора безопасности. Это будет мешать использованию объекта.
Итак, выше указано, как это сделать, но в документации подчеркивается, что вы не должны этого делать.
Вот код, который мы используем в одном из наших проектов:
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);
Этот код создает отображение с доступом для всех