我需要授予每个人访问我正在创建的命名管道的权限。我知道这样做的方法是创建一个 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);
此代码创建一个可供所有人访问的映射
我的情况与 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 。