Hil*_*ila 18 permissions installer windows-installer wix wix-extension
我已阅读所有相关主题,但未找到问题的完整答案.
我想将SYSTEM的完全权限和用户组的读取和执行权限授予Program Files下的文件夹.没有更多,没有更少.
我知道有三种方法可以使用WIX为文件夹授予权限,但这些方法对我来说都不是很好,我将解释原因:
1)常规权限元素:
<CreateFolder Directory="Test">
<Permission User="SYSTEM" GenericAll="yes"/>
<Permission User="Users" Domain="[LOCAL_MACHINE_NAME]"
GenericRead="yes" Read="yes" GenericExecute="yes" ChangePermission="yes"/>
</CreateFolder>
Run Code Online (Sandbox Code Playgroud)
问题:它在外部操作系统上失败,因为它不知道"Users"关键字.我也尝试过SID.除此之外,我需要将Permission元素放在Test目录中的每个文件下(但如果这是唯一的情况,我会管理)
2)WixUtilsExtension PermissionEx元素:
<CreateFolder Directory="Test">
<util:PermissionEx User="SYSTEM" GenericAll="yes"/>
<util:PermissionEx User="Users" Domain="[LOCAL_MACHINE_NAME]"
GenericRead="yes" Read="yes" GenericExecute="yes" ChangePermission="yes"/>
</CreateFolder>
Run Code Online (Sandbox Code Playgroud)
问题:该文件夹还保留Program Files文件夹的默认权限.我不能允许.
3)使用Sddl的PermissionEx:
问题:此元素仅在使用MSI 5.0安装时可用.我正在使用安装程序3.01.
我很乐意获得任何解决方案,包括采用自定义操作的解决方案......
我有完全相同的问题,并与Rob M讨论过它.我打算做Christian G的回答(/sf/answers/370787721/),但Rob建议使用WixQueryOsWellKnownSID(http://wix.sourceforge.net/manual-wix3/osinfo.htm)来获取围绕非en-US语言环境.
在.wxs文件中添加以下内容:
<PropertyRef Id="WIX_ACCOUNT_LOCALSYSTEM" />
<PropertyRef Id="WIX_ACCOUNT_USERS" />
Run Code Online (Sandbox Code Playgroud)
进一步.wxs在你想要应用权限的文件中,就像这样:
<Permission GenericAll="yes" User="[WIX_ACCOUNT_LOCALSYSTEM]" />
<Permission GenericRead="yes" GenericExecute="yes" User="[WIX_ACCOUNT_USERS]" />
Run Code Online (Sandbox Code Playgroud)
现在,当你运行灯光时,你只需要链接WixUtilExtension.
light -ext WiXUtilExtension ...
Run Code Online (Sandbox Code Playgroud)
注:根据您的WiX版本,可能不完全支持此功能.如果它不适合您,可能还有其他选项可用于转换SID.
使用以下代码无需自定义操作即可完成此操作.我已经验证了这个工作(也在子文件夹上).另外,用户每个人都被映射到操作系统本地化的Windows.
<CreateFolder>
<Permission User="Everyone" GenericAll="yes" ChangePermission="yes"/>
</CreateFolder>
Run Code Online (Sandbox Code Playgroud)
小智 2
您需要实施延迟自定义操作来更改权限。C# 自定义操作示例:
[CustomAction]
public static ActionResult SetFolderPermission(Session session)
{
string folder = session.CustomActionData["Folder"].Trim('\"');
string sid = session.CustomActionData["SID"].Trim('\"');
System.Security.Principal.SecurityIdentifier sidID = new System.Security.Principal.SecurityIdentifier(sid);
System.Security.AccessControl.DirectorySecurity ds = System.IO.Directory.GetAccessControl(folder);
ds.AddAccessRule(new System.Security.AccessControl.FileSystemAccessRule(sidID
, System.Security.AccessControl.FileSystemRights.Write
, System.Security.AccessControl.InheritanceFlags.ObjectInherit
, System.Security.AccessControl.PropagationFlags.NoPropagateInherit
, System.Security.AccessControl.AccessControlType.Allow));
System.IO.Directory.SetAccessControl(folder , ds);
return ActionResult.Success;
}
Run Code Online (Sandbox Code Playgroud)
您可以将其移植到 C++ 上,必须推迟自定义操作 - 您必须通过 CustomActionData 访问会话属性
| 归档时间: |
|
| 查看次数: |
24591 次 |
| 最近记录: |