从Wix CAQuietExec运行的icacls与从dos命令行运行时的行为不同

时间:2012-05-04 13:40:16

标签: wix windows-installer windows-server-2008-r2 wix3.5 cacls

在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(44:88)[07:51:46:872]:执行op: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]:为线程1928创建790536型的MSIHANDLE(795)
MSI(s)(44:38)[07:51:46:872]:调用远程自定义操作。 DLL:
C:\ Windows \ Installer \ MSIFBCF.tmp,入口点:CAQuietExec
MSI(s)(44!68)[07:51:46:888]:为线程2920创建790531型的MSIHANDLE(796)
CAQuietExec:已成功处理0个文件;处理0个文件失败

正如您所看到的,文件未被修改,几乎就像忽略了命令一样。用户未添加到ACL。我知道命令有效,因为如果我从dos提示符运行命令,我得到以下内容。

C:\ Users \ Administrator \ Desktop&gt; 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工作吗?有谁知道我做错了什么或我错过了什么?

1 个答案:

答案 0 :(得分:0)

发现了这个问题。 即使我的msi是作为64位二进制文​​件构建的,运行的icacls命令也是32位版本。 inetsrv \ config下的文件只能由64位程序修改。无论如何,我需要在我的wix文件中进行以下两个更改 1)使用64位版本icacls的完整路径即。的 C:\ Windows \ System32下\ ICACLS
2)将DllEntry =“CAQuietExec”更改为 DllEntry =“CAQuietExec64”

上述两项变更解决了这个问题。即使这现在有效,我决定采用自定义操作来进行ACL更改。