Как мне создать 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 .

Другие вопросы по тегам