使用SID为权限而不是组名写入注册表



在编写注册表值时,是否有方法使用SID而不是组名?例如,目前我有:

<Component Id="RegistryEntries" Guid="{------sanitized------}">
    <RegistryKey Root="HKLM" Key="------sanitized------" ForceCreateOnInstall="yes">
        <Permission User="Users" GenericRead="yes" Read="yes" GenericWrite="yes" />
        <RegistryValue Name="ServerName" Action="write" Type="string" Value="" KeyPath="yes">
            <Permission User="Users" GenericRead="yes" Read="yes" GenericWrite="yes" />
        </RegistryValue>                
    </RegistryKey>
</Component>

通常工作,但在非英语语言中失败,因为"Users"名称被翻译。如果我将Permission元素更改为sid,它应该工作(imo),但它没有:

<Component Id="RegistryEntries" Guid="{------sanitized------}">
    <RegistryKey Root="HKLM" Key="------sanitized------" ForceCreateOnInstall="yes">
        <Permission User="S-1-5-32-545" GenericRead="yes" Read="yes" GenericWrite="yes" />
        <RegistryValue Name="ServerName" Action="write" Type="string" Value="" KeyPath="yes">
            <Permission User="S-1-5-32-545" GenericRead="yes" Read="yes" GenericWrite="yes" />
        </RegistryValue>
    </RegistryKey>
</Component>

相反,它试图搜索字面上称为"S-1-5-32-545"的组。有什么办法能做到我现在想做的吗?我知道其他非wix安装程序也可以这样做,但是在wix文档中没有关于这些事情的信息。

我有一个非常类似的问题,可以解决它:

  • 使用<PermissionEx>从Wix Util扩展而不是使用<Permission>
  • 使用内置的自定义动作WixQueryOsWellKnownSID获取Users组的本地名称

首先,您需要将wixutiextension引用添加到您的项目中。然后,需要将WixUtil名称空间添加到wxs源文件中:

xmlns:util="http://schemas.microsoft.com/wix/UtilExtension"

所以现在你可以使用PermissionEx元素从Wix Util扩展:

<util:PermissionEx User="[WIX_ACCOUNT_USERS]" GenericAll="yes" />

要使属性WIX_ACCOUNT_USERS可用,需要(隐式地)通过向<Product>添加属性引用来调用内置的自定义操作WixQueryOsWellKnownSID:

<PropertyRef Id="WIX_ACCOUNT_USERS" />

这适用于我在Windows 10上使用Wix 3.10(英语和德语)

最新更新