6

我需要授予每个人访问我正在创建的命名管道的权限。我知道这样做的方法是创建一个 NULL/空 DACL 并将其传递给CreateNamedPipe.

如何创建 NULL DACL?有人告诉我,这与为LPSECURITY_ATTRIBUTES.

4

3 回答 3

11

像这样:

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 和安全描述符的所有者。这会干扰对象的使用。

所以,以上是如何做到这一点,但文档确实强调你不应该这样做。

于 2013-01-24T13:34:00.977 回答
4

这是我们在其中一个项目中使用的代码:

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);

此代码创建一个可供所有人访问的映射

于 2013-01-24T13:36:18.833 回答
1

我的情况与 Docker 容器开发有些不同。我安装了一个现有的 COM 应用程序,并希望通过 PowerShell 创建一个空 DACL。首先在组件服务中查找您的 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 。

于 2022-02-19T20:51:39.783 回答