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

时间:2019-09-01 18:47:40

标签: winapi access named-pipes uac wasapi

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

但是,由于ERROR_ACCESS_DENIED,我无法打开管道。问:如何在服务中设置管道,以便应用程序能够对其进行写打开操作?

我读了this,但是完全没有帮助。我很高兴看到提示或代码示例。

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

1 个答案:

答案 0 :(得分:2)

要对Securable Object进行控制访问,我们需要设置适当的安全描述符。当然,系统默认总是根据调用者security descriptor在新创建的对象上设置一些token当用户创建安全对象而不指定安全描述符时系统使用的默认DACL )(如果需要,我们可以使用TokenDefaultDacl来更改此DACL)

启用对对象集 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};

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

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