使用 WiX 工具集为 ProgramData 中的现有文件夹和文件设置权限
Set permissions for existing folders and files in ProgramData with WiX Toolset
我继承了一个使用WIX Toolset (3.10.3)构建安装包的项目。应用程序下载共享数据并将其存储在 c:\ProgramData\Vendor\ApplicationName
中。但是,此路径不是在安装期间创建的,而是在应用程序本身的执行期间创建的,每当第一次请求该路径时。
我现在发现了多个 Windows 用户使用该应用程序时出现的权限相关问题。每当应用程序从后端下载新数据文件时,都是当前 windows 用户获得这些文件的 "Full control" 权限。当其他人使用另一个 Windows 帐户登录时,他们只有对这些文件的读取权限。当应用程序试图保持本地文件与后端同步时,这些混合权限会导致问题。
由于应用程序不需要提升权限,我必须在安装过程中更正此问题。作为第一步,我现在确保 c:\ProgramData\Vendor\
文件夹是在安装过程中创建的,并且它通过 <util:PermissionEx User="Everyone" GenericAll="yes" />
获得了正确的权限。由于这些权限是继承的,它将解决所有用户进行全新安装的问题。
问题是权限仅由 folders/files 在 安装后 创建的继承。这意味着从以前版本升级的用户仍将保留具有混合权限的数据文件。因此,我需要确保所有现有文件夹和文件在安装期间获得新权限。我该如何做到这一点?
好的,我就是这样解决的。希望以后能对其他人有所帮助。
首先,我在 MSI 的 wxs 文件中添加了以下内容:
<Directory Id="CommonAppDataFolder">
<Directory Id="ProgramDataVendorFolder" Name="MyVendor">
<!--This will create the \ProgramData\MyVendor\MyProductName\ folder. -->
<Directory Id="ProgramDataAppFolder" Name="MyProductName" />
</Directory>
</Directory>
<DirectoryRef Id="ProgramDataAppFolder">
<Component Id="CmpCreateCommonAppDataFolderWithPermissions" Guid="13ae94b7-9ef5-4181-bfa9-933844a13418" Permanent="yes">
<CreateFolder>
<!--This will ensure that everyone gets full permissions to the folder that we create in the ProgramData folder. -->
<util:PermissionEx User="Everyone" GenericAll="yes" />
</CreateFolder>
</Component>
</DirectoryRef>
然后包含它:
<Feature Id="ProductFeature" Title="$(var.ProductName)" Level="1">
<!--Add folder -->
<ComponentRef Id="CmpCreateCommonAppDataFolderWithPermissions" />
</Feature>
这三件事确保所有用户都可以完全访问 ProgramData 中的文件夹,即使该文件夹已经存在。
但是,如果由于之前的权限问题,文件虚拟化已经处于活动状态,则仅更改权限是不够的。为了关闭文件虚拟化,我在我的可执行文件中添加了一个 app.manifest:
<requestedExecutionLevel level="asInvoker" uiAccess="false" />
请记住,如果以前使用的 VirtualStore 包含重要文件,它们将不会自动出现在 ProgramData 文件夹中。
有关 file/registry 虚拟化的更多信息可在此处找到:https://blogs.technet.microsoft.com/mrsnrub/2010/08/11/uac-virtualization-allowing-standard-users-to-update-a-system-protected-area/
我继承了一个使用WIX Toolset (3.10.3)构建安装包的项目。应用程序下载共享数据并将其存储在 c:\ProgramData\Vendor\ApplicationName
中。但是,此路径不是在安装期间创建的,而是在应用程序本身的执行期间创建的,每当第一次请求该路径时。
我现在发现了多个 Windows 用户使用该应用程序时出现的权限相关问题。每当应用程序从后端下载新数据文件时,都是当前 windows 用户获得这些文件的 "Full control" 权限。当其他人使用另一个 Windows 帐户登录时,他们只有对这些文件的读取权限。当应用程序试图保持本地文件与后端同步时,这些混合权限会导致问题。
由于应用程序不需要提升权限,我必须在安装过程中更正此问题。作为第一步,我现在确保 c:\ProgramData\Vendor\
文件夹是在安装过程中创建的,并且它通过 <util:PermissionEx User="Everyone" GenericAll="yes" />
获得了正确的权限。由于这些权限是继承的,它将解决所有用户进行全新安装的问题。
问题是权限仅由 folders/files 在 安装后 创建的继承。这意味着从以前版本升级的用户仍将保留具有混合权限的数据文件。因此,我需要确保所有现有文件夹和文件在安装期间获得新权限。我该如何做到这一点?
好的,我就是这样解决的。希望以后能对其他人有所帮助。
首先,我在 MSI 的 wxs 文件中添加了以下内容:
<Directory Id="CommonAppDataFolder">
<Directory Id="ProgramDataVendorFolder" Name="MyVendor">
<!--This will create the \ProgramData\MyVendor\MyProductName\ folder. -->
<Directory Id="ProgramDataAppFolder" Name="MyProductName" />
</Directory>
</Directory>
<DirectoryRef Id="ProgramDataAppFolder">
<Component Id="CmpCreateCommonAppDataFolderWithPermissions" Guid="13ae94b7-9ef5-4181-bfa9-933844a13418" Permanent="yes">
<CreateFolder>
<!--This will ensure that everyone gets full permissions to the folder that we create in the ProgramData folder. -->
<util:PermissionEx User="Everyone" GenericAll="yes" />
</CreateFolder>
</Component>
</DirectoryRef>
然后包含它:
<Feature Id="ProductFeature" Title="$(var.ProductName)" Level="1">
<!--Add folder -->
<ComponentRef Id="CmpCreateCommonAppDataFolderWithPermissions" />
</Feature>
这三件事确保所有用户都可以完全访问 ProgramData 中的文件夹,即使该文件夹已经存在。
但是,如果由于之前的权限问题,文件虚拟化已经处于活动状态,则仅更改权限是不够的。为了关闭文件虚拟化,我在我的可执行文件中添加了一个 app.manifest:
<requestedExecutionLevel level="asInvoker" uiAccess="false" />
请记住,如果以前使用的 VirtualStore 包含重要文件,它们将不会自动出现在 ProgramData 文件夹中。
有关 file/registry 虚拟化的更多信息可在此处找到:https://blogs.technet.microsoft.com/mrsnrub/2010/08/11/uac-virtualization-allowing-standard-users-to-update-a-system-protected-area/