Как мне создать NULL/ пустой DACL?
Мне нужно предоставить доступ каждому для именованного канала, который я создаю. Я понимаю, как это сделать, создать NULL/ пустой DACL и передать его CreateNamedPipe
,
Как мне создать NULL DACL? Мне сказали, что это не то же самое, что передать нулевой указатель для LPSECURITY_ATTRIBUTES
,
3 ответа
Как это:
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);
Этот код создает отображение с доступом для всех
Мой случай был несколько другим с разработкой контейнера Docker. У меня установлено существующее приложение COM, и я хотел создать нулевой DACL через PowerShell. Сначала найдите свой AppID в службах компонентов:
Затем выполните следующее:
$appid = "{00020906-0000-0000-C000-000000000046}"
$app = get-wmiobject -query ('SELECT * FROM Win32_DCOMApplicationSetting WHERE AppId = "' + $appid + '"') -enableallprivileges
$sdRes = $app.GetLaunchSecurityDescriptor()
$sd = $sdRes.Descriptor
[System.Management.ManagementBaseObject[]] $newDACL = $null
$sd.DACL = $newDACL
$app.SetLaunchSecurityDescriptor($sd)
Теперь приложение (MS Word 97-2003 в этом примере) доступно для всех со всеми рисками безопасности, упомянутыми в других ответах и документации MS.
Примечание: в вашем случае используйте нулевой DACL, а не пустой. Пустой DACL блокирует разрешения для всех пользователей: https://techcommunity.microsoft.com/t5/ask-the-directory-services-team/null-and-empty-dacls/ba-p/396323 .