13

新手 WiX 问题:我该怎么做
1. 将一次性 shell 脚本与安装程序一起复制到 temp 中,
例如

  <Binary Id='permissions.cmd' src='permissions.cmd'/>  

2. 在安装结束时找到并运行该脚本。
例如

<CustomAction Id='SetFolderPermissions' BinaryKey='permissions.cmd' 
    ExeCommand='permissions.cmd' Return='ignore'/>  

<InstallExecuteSequence>
    <Custom Action="SetFolderPermissions" Sequence='1'/>
</InstallExecuteSequence>  

我认为我至少有三个问题:

  • 我找不到permissions.cmd来运行它 - 我需要[TEMPDIR]permissions.cmd还是什么?
  • 在安装程序之前,我的序列来得太早了。
  • 我需要cmd /c permissions.cmd在这里某处,可能在ExeCommand附近?

在此示例中, permissions.cmd使用cacls.exe将具有写入权限的交互式用户添加到%ProgramFiles%\Vendor ACL。我也可以使用secureObject - 这个问题是“如何将交互式用户添加到本地化Windows 中的目录”?

4

5 回答 5

6

这是一个工作示例(用于设置权限,而不是用于运行脚本):

<Directory Id="TARGETDIR" Name="SourceDir">
  <Directory Id="ProgramFilesFolder" Name="PFiles">
    <Directory Id="BaseDir" Name="MyCo">
      <Directory Id="INSTALLDIR" Name="MyApp" LongName="MyProd">

        <!-- Create the folder, so that ACLs can be set to NetworkService -->
        <Component Id="TheDestFolder" Guid="{333374B0-FFFF-4F9F-8CB1-D9737F658D51}"
                   DiskId="1"  KeyPath="yes">
          <CreateFolder Directory="INSTALLDIR">
            <Permission User="NetworkService"
                        Extended="yes"
                        Delete="yes"
                        GenericAll="yes">
            </Permission>
          </CreateFolder>
        </Component>

      </Directory>
    </Directory>
  </Directory>
</Directory>

请注意,这是在 Permission 标签中使用 'Extended="Yes"',因此它使用的是 SecureObjects 表和自定义操作,而不是 LockPermissions 表(请参阅WiX 文档中的 Permission Element)。在此示例中,SecureObjects 应用于 MyProd 目录的权限由子目录继承,而使用 LockPermissions 时则不是这种情况。

于 2009-01-06T20:15:23.607 回答
5

我发现博客文章从 MSI 到 WiX,第 5 部分 - 自定义操作:介绍在我想了解 WiX 中的自定义操作时很有帮助。

您还可以在CustomAction 元素中找到 CustomAction 的定义及其属性。

你需要做这样的事情

<CustomAction Id="CallCmd" Value="[SystemFolder]cmd.exe" />
<CustomAction Id="RunCmd"  ExeCommand="/c permission.cmd" />
<InstallExecuteSequence>
    <Custom Action="CallCmd" After="InstallInitialize" />
    <Custom Action="RunCmd" After="CallCmd" />
</InstallExecuteSequence>
于 2008-10-04T14:23:56.493 回答
2

您可以尝试使用Permission 元素作为 CreateFolder 元素的子元素,而不是运行自定义操作,例如:

<CreateFolder>
  <Permission User='INTERACTIVE' GenericRead='yes' GenericWrite='yes' 
              GenericExecute='yes' Delete='yes' DeleteChild='yes' />
  <Permission User='Administrators' GenericAll='yes' />
</CreateFolder>

这会覆盖还是仅编辑文件夹的 ACL?

根据MSDN 文档,它覆盖:

LockPermissions 表中列出的每个文件、注册表项或目录都会收到一个明确的安全描述符,无论它是否替换现有对象。

我刚刚通过在 Windows 2000 上运行测试安装确认了这一点。

于 2008-10-13T23:03:24.943 回答
2

你有一个如何使用它的例子吗?我的意思是,是否使用嵌套我要更改其 ACL 的目录下的CreateFolder ?还是我先单独使用CreateFolder ?以下是否接近?

<Wix xmlns="http://schemas.microsoft.com/wix/2003/01/wi">
<Fragment>
  <DirectoryRef Id="TARGETDIR">
    <Directory Id='ProgramFilesFolder' Name='PFiles'>
      <Directory Id="directory0" Name="MyApp" LongName="My Application">
        <Component Id="component0" DiskId="1" Guid="AABBCCDD-EEFF-1122-3344-556677889900">

          <CreateFolder>
            <Permission User='INTERACTIVE' 
              GenericRead='yes' 
              GenericWrite='yes' 
              GenericExecute='yes' 
              Delete='yes' 
              DeleteChild='yes' />
            <Permission User='Administrators' GenericAll='yes' />
          </CreateFolder>

          <File Id="file0" Name="myapp.exe" Vital="yes" Source="myapp.exe">
            <Shortcut Id="StartMenuIcon" Directory="ProgramMenuFolder" Name="MyApp" LongName="My Application" />
          </File>
        </Component>
      <Directory Id="directory1" Name="SubDir" LongName="Sub Directory 1">
        <Component Id="component1" DiskId="1" Guid="A9B4D6FD-B67A-40b1-B518-A39F1D145FF8">
          etc...
          etc...
          etc...
        </Component>
      </Directory>
    </Directory>
  </DirectoryRef>
</Fragment>

于 2008-10-14T14:04:44.453 回答
1

大多数人倾向于避开 lockPermissions 表,因为它不是附加的,这意味着它将覆盖您当前的权限(从托管环境的角度来看,这很糟糕)。我建议您使用支持ACL继承的工具,例如 SUBINACL 或 SETACL 或众多 ACL 工具之一。

关于您之前的帖子失败的原因,有几个原因。您可以在四个位置放置自定义操作 (CA):UI、立即、延迟和提交/回滚。

您需要您的 CA 在延迟序列中设置权限,因为文件直到延迟序列的中途才会出现。因此,之前的任何事情都会失败。

  1. 您的设置立即生效(因此会失败)
  2. 您的设置顺序为 1(无法推迟,因此会失败)

您需要添加一个属性Execute="Deferred"并将序列从“1”更改为:

<Custom Action="CallCmd" Execute="Deferred" Before="InstallFinalize" />

这将确保在安装文件之后,但在延迟阶段(所需位置)结束之前完成。

我还建议您直接调用 EXE 文件,而不是从批处理文件中调用。安装程序服务将直接在您需要的上下文中启动和 EXE 文件。使用批处理文件将在正确的上下文中启动批处理文件,并可能在执行时将上下文丢失给不想要的帐户。

于 2008-10-23T06:57:19.117 回答