在 Windows 2008 R2 x64 上使用 Wix 3.5
我以管理员身份运行它以避免任何权限问题。我创建了一个安装程序,它执行 icacls 命令以将用户添加到 c:\windows\system32\inetsrv\config\administration.config 文件的 ACL。这是wix代码
<Property Id="QtExecExample" Value='"cmd" /c icacls "c:\windows\system32\inetsrv\config\administration.config" /Grant johndoe:M /T'/>
<CustomAction Id="QtExecExample" BinaryKey="WixCA" DllEntry="CAQuietExec" Execute="deferred" Return="check" Impersonate="no"/>
<InstallExecuteSequence>
<Custom Action="QtExecExample" Before='InstallFinalize' > NOT Installed</Custom>
</InstallExecuteSequence>
以下是 msi 日志中的输出
MSI (s) (44:88) [07:51:46:872]:执行操作:CustomActionSchedule(Action=QtExecExample,ActionType=3073,Source=BinaryData,Target=CAQuietExec,CustomActionData="cmd" /c icacls "c :\windows\system32\inetsrv\config\administration.config" /Grant johndoe:M /T) MSI (s) (44:88) [07:51:46:872]: 为 790536 类型创建 MSIHANDLE (795)线程 1928
MSI (s) (44:38) [07:51:46:872]:调用远程自定义操作。DLL:
C:\Windows\Installer\MSIFBCF.tmp,入口点:CAQuietExec
MSI (s) (44!68) [07:51:46:888]:为线程 2920
CAQuietExec 创建类型为 790531 的 MSIHANDLE (796):已成功处理0 个文件;处理 0 个文件失败
如您所见,文件几乎没有被修改,就好像命令被忽略了一样。用户未添加到 ACL。我知道该命令有效,因为如果我从 dos 提示符运行该命令,我会得到以下信息。
C:\Users\Administrator\Desktop>cmd /c icacls "c:\windows\system32\inetsrv\config\administration.config" /Grant johndoe:M /T
处理文件:c:\windows\system32\inetsrv\config\ Administration.config
成功处理了 1 个文件;处理 0 个文件失败
如果从 WIX 运行命令但不确定原因,似乎无法更改 inetsrv\config 下文件的 ACL。如果命令通过命令行工作,那么它不应该通过 Wix CAQuietExec 工作吗?有谁知道我做错了什么或我错过了什么?