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

How to make named pipe accessible for non-elevated processes?

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

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

我读了 this 但是它根本没有帮助。我很乐意看到提示或代码示例。

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

用于控制对 Securable Object we need set appropriate a security descriptor. of course system always by default set some security descriptor on new created object based on caller token ( The default DACL that the system uses when the user creates a securable object without specifying a security descriptor) (we can change this DACL with TokenDefaultDacl 的访问(如果需要)

为对象集 NULL 启用非常广泛的访问权限的最简单解决方案(不为空 !! 空 DACL 可禁用对所有对象的访问)安全描述符中的 DACL。这几乎允许每个人访问对象(低完整性除外 thread/process(为此需要设置 低强制标签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};

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

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