好的,这就是我解决它的方法。希望它可以在未来帮助别人。
首先,我在 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 文件夹中。
有关文件/注册表虚拟化的更多信息,请参见:https ://blogs.technet.microsoft.com/mrsnrub/2010/08/11/uac-virtualization-allowing-standard-users-to-update-a-system-保护区/