如何使非提升进程可以访问命名管道?

dev*_*ull 3 winapi uac named-pipes wasapi

问题:我创建了一个服务,该服务应该在提升的权限下运行。现在我有了一个可供用户访问的应用程序。应用程序希望通过命名管道与服务通信。命名管道由服务创建。

但是我无法打开管道,因为 ERROR_ACCESS_DENIED。问题:如何在服务中设置管道,以便应用程序能够写入/打开它?

我读过这篇文章,但它根本没有帮助。我很高兴看到提示或代码示例。

背景:我需要更改音频设备的设置,这可以通过通过 IMMDevice::OpenPropertyStore 调用获取的 IPropertyStore 接口来完成。然而,文档清楚地表明,如果我没有管理权限,我就无法执行此操作。显然,我不想每次用户旋转旋钮时都会使用 UAC 来惹恼用户。为此,我创建了上述服务。但再次没有运气。

RbM*_*bMm 5

为了控制对安全对象的访问,我们需要设置适当的安全描述符。当然,默认情况下系统总是根据调用者令牌在新创建的对象上设置一些安全描述符当用户创建安全对象而不指定安全描述符时系统使用的默认DACL)(如果需要,我们可以更改此DACL)TokenDefaultDacl

最简单的解决方案是为安全描述符中的对象集NULL(非空!!空 DACL 禁用所有访问)DACL 启用非常广泛的访问。这允许几乎每个人访问对象(低完整性线程/进程除外(为此需要设置低强制标签SACL

SECURITY_DESCRIPTOR sd;
InitializeSecurityDescriptor(&sd, SECURITY_DESCRIPTOR_REVISION);
SetSecurityDescriptorDacl(&sd, TRUE, 0, FALSE);
SetSecurityDescriptorControl(&sd, SE_DACL_PROTECTED, SE_DACL_PROTECTED);
SECURITY_ATTRIBUTES sa = { sizeof(sa), &sd, FALSE};
Run Code Online (Sandbox Code Playgroud)

然后我们在创建对象 api 中指向SECURITY_ATTRIBUTES(几乎所有这些 api 都将指针作为SECURITY_ATTRIBUTES参数。如果使用本机 api - 指向安全描述符的指针位于OBJECT_ATTRIBUTES结构内部)

另一种可能的选择 - 不使用 NULL,而是使用另一个 DACL,这里最困难的一点是决定这个 DACL 中必须包含什么具体内容。不是实施,而是概念选择。