WIX:授予文件夹权限

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.

我很乐意获得任何解决方案,包括采用自定义操作的解决方案......

fer*_*der 8

我有完全相同的问题,并与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.


Bla*_*ski 7

使用以下代码无需自定义操作即可完成此操作.我已经验证了这个工作(也在子文件夹上).另外,用户每个人都被映射到操作系统本地化的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 访问会话属性