【问题标题】:Wix: Cannot call DISM from Wix CustomActionWix:无法从 Wix CustomAction 调用 DISM
【发布时间】:2018-07-27 05:41:32
【问题描述】:

维克斯 3.10

看完文章(Run ExeCommand in customAction as Administrator mode in Wix Installer), 我使用了属性 Impersonate="no" 的延迟 CustomAction,使用 DISM 命令调用批处理文件。

    <Property Id="CMD">
      <DirectorySearch Id="CmdFolder" Path="[SystemFolder]" Depth="1">
        <FileSearch Id="CmdExe" Name="cmd.exe"  />
      </DirectorySearch>
    </Property>
    <Property Id="SXSPATH" Secure="yes" Value="SXSFOLDER" />
    <Directory Id="TARGETDIR" Name="SourceDir">
        <Directory Id="SXSFOLDER" />
    </Directory>


    <CustomAction Id="SetCustomActionData" Return="check" Property="OfflineSxSInstall" Value="[SXSFOLDER]" />

    <CustomAction Id="OfflineSxSInstall" Property="CMD" Execute="deferred" Return="check" Impersonate="no" ExeCommand="/c &quot;&quot;[#file_configure.bat]&quot; &quot;[SXSFOLDER]&quot;&quot;" />

    <InstallExecuteSequence>
        <Custom Action="OfflineSxSInstall" After="InstallFiles">NOT Installed</Custom>
    </InstallExecuteSequence>  

遗憾的是,DISM 总是返回错误 11“您无法使用 32 位版本的 DISM 为正在运行的 64 位操作系统提供服务。 请使用与您的计算机体系结构相对应的 DISM 版本"....

首先,我尝试为 64 位 Windows 2012R2 测试环境调用正确的 CMD.exe 和 DISM.exe,......但尽管 DISM 的绝对路径总是返回相同的错误,更改 Path="[SystemFolder] " 到 "[System64Folder]"...

然后我找到了一篇类似现象的文章(https://social.technet.microsoft.com/Forums/ie/en-US/e25c27cf-ca6d-4079-90a1-8201ffc503e5/dism-gives-error-11?forum=w8itprogeneral),告诉我是因为没有权限导致的……

目前我试图通过使用明确以管理员身份运行的 schtasks.exe 来解决问题...(可能通过 Wix 公共参数使用登录名和密码...。用户使用 Wix UI 窗口输入,丑陋....)

config.bat

setlocal

echo @Starting Installation of IIS Role Services and .NET Framework.... @%DATE%_%TIME%   >> C:\temp\test_configure.txt 2>&1


REM cd C:\Windows\SysWOW64
cd >> C:\temp\test_configure.txt 2>&1
echo %1 >> C:\temp\test_configure.txt 2>&1
SET SXS_SOURCE_PATH=%1

DISM.exe /Online /Enable-Feature /FeatureName:NetFx3 /All /Source:%SXS_SOURCE_PATH% >> C:\temp\test_configure.txt 2>&1
if !ERRORLEVEL! neq 0 (
    ECHO interrupting Installation of IIS Role Services and .NET Framework....@%DATE%_%TIME%  >> C:\temp\test_configure.txt 2>&1
    EXIT /B 100
)       


DISM.exe /Online /Enable-Feature /FeatureName:IIS-WebServerRole /FeatureName:IIS-RequestFiltering /FeatureName:IIS-Security /FeatureName:IIS-HttpLogging /FeatureName:IIS-HealthAndDiagnostics /FeatureName:IIS-WebServerManagementTools /FeatureName:IIS-ManagementConsole /FeatureName:IIS-IIS6ManagementCompatibility /FeatureName:IIS-Metabase /FeatureName:IIS-WebServer /FeatureName:IIS-Performance /FeatureName:IIS-HttpCompressionStatic /FeatureName:IIS-CommonHttpFeatures /FeatureName:IIS-StaticContent /FeatureName:IIS-DefaultDocument /FeatureName:IIS-DirectoryBrowsing /FeatureName:IIS-HttpErrors /FeatureName:IIS-ApplicationDevelopment /FeatureName:IIS-ASPNET /FeatureName:IIS-NetFxExtensibility /FeatureName:IIS-ISAPIExtensions /FeatureName:IIS-ISAPIFilter /all /Source:%SXS_SOURCE_PATH% >> C:\temp\test_configure.txt 2>&1

if !ERRORLEVEL! neq 0 (
    ECHO @interrupting Installation of IIS Role Services and .NET Framework....@%DATE%_%TIME%  >> C:\temp\test_configure.txt 2>&1
    EXIT /B 100
)       



echo @Complete  Installation of IIS Role Services and .NET Framework....@%DATE%_%TIME%   >> C:\temp\test_configure.txt 2>&1

endlocal
exit /B 0

有什么想法吗?恐怕我必须面对像 DISM API 这样的大事......

附: 遵循@Chris Riccio 的建议,我停止使用批处理文件,并且 QuietExec 工作正常,而 AddIISComponent 命令不是那么长。 (如果我使用注释掉命令,LIGHT 会警告“LGHT1076:ICE03:字符串溢出(大于列中允许的长度);表:CustomAction,列:目标,键:AddDISMComponent。”)

    <CustomAction Id="SetCustomActionData" Return="check" Property="AddDISMComponent" Value="[SXSFOLDER]" />

    <!--<CustomAction Id='AddDISMComponent' Property='DISMComponent' Value='"[System64Folder]dism.exe" /norestart /quiet /online /enable-feature /FeatureName:IIS-WebServerRole /FeatureName:IIS-RequestFiltering /FeatureName:IIS-Security /FeatureName:IIS-HttpLogging /FeatureName:IIS-HealthAndDiagnostics /FeatureName:IIS-WebServerManagementTools /FeatureName:IIS-ManagementConsole /FeatureName:IIS-IIS6ManagementCompatibility /FeatureName:IIS-Metabase /FeatureName:IIS-WebServer /FeatureName:IIS-Performance /FeatureName:IIS-HttpCompressionStatic /FeatureName:IIS-CommonHttpFeatures /FeatureName:IIS-StaticContent /FeatureName:IIS-DefaultDocument /FeatureName:IIS-DirectoryBrowsing /FeatureName:IIS-HttpErrors /FeatureName:IIS-ApplicationDevelopment /FeatureName:IIS-ASPNET /FeatureName:IIS-NetFxExtensibility /FeatureName:IIS-ISAPIExtensions /FeatureName:IIS-ISAPIFilter /FeatureName:NetFx3 /all /Source:[SXSFOLDER]' Execute='immediate'/>-->
    <CustomAction Id='AddDISMComponent' Property='DISMComponent' Value='"[System64Folder]dism.exe" /norestart /quiet /online /enable-feature /FeatureName:IIS-WebServerRole /FeatureName:NetFx3 /all /Source:[SXSFOLDER]' Execute='immediate'/>
    <CustomAction Id="DISMComponent" BinaryKey="WixCA" DllEntry="CAQuietExec64" Execute="deferred" Return="ignore" Impersonate="no" />

    <InstallExecuteSequence>
      <Custom Action="AddDISMComponent" After="CostFinalize" />
      <Custom Action="DISMComponent" After="InstallInitialize"><![CDATA[(NOT Installed)]]></Custom> 
    </InstallExecuteSequence>  

我目前尝试调用多个 QuietExec-DISM 命令来分割长参数...

不聪明....

    <CustomAction Id='AddDISMComponent1' Property='DISMComponent1' Value='"[System64Folder]dism.exe" /norestart /quiet /online /enable-feature /FeatureName:IIS-WebServerRole /Source:[SXSFOLDER]' Execute='immediate'/>
    <CustomAction Id="DISMComponent1" BinaryKey="WixCA" DllEntry="CAQuietExec64" Execute="deferred" Return="check" Impersonate="no" />

    <CustomAction Id='AddDISMComponent2' Property='DISMComponent2' Value='"[System64Folder]dism.exe" /norestart /quiet /online /enable-feature /FeatureName:IIS-RequestFiltering /Source:[SXSFOLDER]' Execute='immediate'/>
    <CustomAction Id="DISMComponent2" BinaryKey="WixCA" DllEntry="CAQuietExec64" Execute="deferred" Return="check" Impersonate="no" />

    <InstallExecuteSequence>
      <Custom Action="AddDISMComponent1" After="CostFinalize" />
      <Custom Action="AddDISMComponent2" After="AddDISMComponent1" />
      <Custom Action="DISMComponent1" After="InstallInitialize"><![CDATA[(NOT Installed)]]></Custom> 
      <Custom Action="DISMComponent2" After="DISMComponent1"><![CDATA[(NOT Installed)]]></Custom> 
    </InstallExecuteSequence>  

【问题讨论】:

    标签: cmd wix dism


    【解决方案1】:

    不像我预期的那样聪明....但有效。

        <CustomAction Id='AddDISMComponent1' Property='DISMComponent1' Value='"[System64Folder]dism.exe" /norestart /quiet /online /enable-feature /FeatureName:IIS-WebServerRole /all /Source:[SXSFOLDER]' Execute='immediate'/>
        <CustomAction Id="DISMComponent1" BinaryKey="WixCA" DllEntry="CAQuietExec64" Execute="deferred" Return="check" Impersonate="no" />
    
        <CustomAction Id='AddDISMComponent2' Property='DISMComponent2' Value='"[System64Folder]dism.exe" /norestart /quiet /online /enable-feature /FeatureName:IIS-RequestFiltering /all /Source:[SXSFOLDER]' Execute='immediate'/>
        <CustomAction Id="DISMComponent2" BinaryKey="WixCA" DllEntry="CAQuietExec64" Execute="deferred" Return="check" Impersonate="no" />
    
        <CustomAction Id='AddDISMComponent3' Property='DISMComponent3' Value='"[System64Folder]dism.exe" /norestart /quiet /online /enable-feature /FeatureName:IIS-HttpLogging /all /Source:[SXSFOLDER]' Execute='immediate'/>
        <CustomAction Id="DISMComponent3" BinaryKey="WixCA" DllEntry="CAQuietExec64" Execute="deferred" Return="check" Impersonate="no" />
    
        <CustomAction Id='AddDISMComponent4' Property='DISMComponent4' Value='"[System64Folder]dism.exe" /norestart /quiet /online /enable-feature /FeatureName:IIS-HealthAndDiagnostics /all /Source:[SXSFOLDER]' Execute='immediate'/>
        <CustomAction Id="DISMComponent4" BinaryKey="WixCA" DllEntry="CAQuietExec64" Execute="deferred" Return="check" Impersonate="no" />
    
        <CustomAction Id='AddDISMComponent5' Property='DISMComponent5' Value='"[System64Folder]dism.exe" /norestart /quiet /online /enable-feature /FeatureName:IIS-WebServerManagementTools /all /Source:[SXSFOLDER]' Execute='immediate'/>
        <CustomAction Id="DISMComponent5" BinaryKey="WixCA" DllEntry="CAQuietExec64" Execute="deferred" Return="check" Impersonate="no" />
    
        <CustomAction Id='AddDISMComponent6' Property='DISMComponent6' Value='"[System64Folder]dism.exe" /norestart /quiet /online /enable-feature /FeatureName:IIS-ManagementConsole /all /Source:[SXSFOLDER]' Execute='immediate'/>
        <CustomAction Id="DISMComponent6" BinaryKey="WixCA" DllEntry="CAQuietExec64" Execute="deferred" Return="check" Impersonate="no" />
    
        <CustomAction Id='AddDISMComponent7' Property='DISMComponent7' Value='"[System64Folder]dism.exe" /norestart /quiet /online /enable-feature /FeatureName:IIS-IIS6ManagementCompatibility /all /Source:[SXSFOLDER]' Execute='immediate'/>
        <CustomAction Id="DISMComponent7" BinaryKey="WixCA" DllEntry="CAQuietExec64" Execute="deferred" Return="check" Impersonate="no" />
    
        <CustomAction Id='AddDISMComponent8' Property='DISMComponent8' Value='"[System64Folder]dism.exe" /norestart /quiet /online /enable-feature /FeatureName:IIS-Metabase /all /Source:[SXSFOLDER]' Execute='immediate'/>
        <CustomAction Id="DISMComponent8" BinaryKey="WixCA" DllEntry="CAQuietExec64" Execute="deferred" Return="check" Impersonate="no" />
    
        <CustomAction Id='AddDISMComponent9' Property='DISMComponent9' Value='"[System64Folder]dism.exe" /norestart /quiet /online /enable-feature /FeatureName:IIS-WebServer /all /Source:[SXSFOLDER]' Execute='immediate'/>
        <CustomAction Id="DISMComponent9" BinaryKey="WixCA" DllEntry="CAQuietExec64" Execute="deferred" Return="check" Impersonate="no" />
    
        <CustomAction Id='AddDISMComponent10' Property='DISMComponent10' Value='"[System64Folder]dism.exe" /norestart /quiet /online /enable-feature /FeatureName:IIS-Performance /all /Source:[SXSFOLDER]' Execute='immediate'/>
        <CustomAction Id="DISMComponent10" BinaryKey="WixCA" DllEntry="CAQuietExec64" Execute="deferred" Return="check" Impersonate="no" />
    
        <CustomAction Id='AddDISMComponent11' Property='DISMComponent11' Value='"[System64Folder]dism.exe" /norestart /quiet /online /enable-feature /FeatureName:IIS-HttpCompressionStatic /all /Source:[SXSFOLDER]' Execute='immediate'/>
        <CustomAction Id="DISMComponent11" BinaryKey="WixCA" DllEntry="CAQuietExec64" Execute="deferred" Return="check" Impersonate="no" />
    
        <CustomAction Id='AddDISMComponent12' Property='DISMComponent12' Value='"[System64Folder]dism.exe" /norestart /quiet /online /enable-feature /FeatureName:IIS-CommonHttpFeatures /all /Source:[SXSFOLDER]' Execute='immediate'/>
        <CustomAction Id="DISMComponent12" BinaryKey="WixCA" DllEntry="CAQuietExec64" Execute="deferred" Return="check" Impersonate="no" />
    
        <CustomAction Id='AddDISMComponent13' Property='DISMComponent13' Value='"[System64Folder]dism.exe" /norestart /quiet /online /enable-feature /FeatureName:IIS-StaticContent /all /Source:[SXSFOLDER]' Execute='immediate'/>
        <CustomAction Id="DISMComponent13" BinaryKey="WixCA" DllEntry="CAQuietExec64" Execute="deferred" Return="check" Impersonate="no" />
    
        <CustomAction Id='AddDISMComponent14' Property='DISMComponent14' Value='"[System64Folder]dism.exe" /norestart /quiet /online /enable-feature /FeatureName:IIS-DefaultDocument /all /Source:[SXSFOLDER]' Execute='immediate'/>
        <CustomAction Id="DISMComponent14" BinaryKey="WixCA" DllEntry="CAQuietExec64" Execute="deferred" Return="check" Impersonate="no" />
    
        <CustomAction Id='AddDISMComponent15' Property='DISMComponent15' Value='"[System64Folder]dism.exe" /norestart /quiet /online /enable-feature /FeatureName:IIS-DirectoryBrowsing /all /Source:[SXSFOLDER]' Execute='immediate'/>
        <CustomAction Id="DISMComponent15" BinaryKey="WixCA" DllEntry="CAQuietExec64" Execute="deferred" Return="check" Impersonate="no" />
    
        <CustomAction Id='AddDISMComponent16' Property='DISMComponent16' Value='"[System64Folder]dism.exe" /norestart /quiet /online /enable-feature /FeatureName:IIS-HttpErrors /all /Source:[SXSFOLDER]' Execute='immediate'/>
        <CustomAction Id="DISMComponent16" BinaryKey="WixCA" DllEntry="CAQuietExec64" Execute="deferred" Return="check" Impersonate="no" />
    
        <CustomAction Id='AddDISMComponent17' Property='DISMComponent17' Value='"[System64Folder]dism.exe" /norestart /quiet /online /enable-feature /FeatureName:IIS-ApplicationDevelopment /all /Source:[SXSFOLDER]' Execute='immediate'/>
        <CustomAction Id="DISMComponent17" BinaryKey="WixCA" DllEntry="CAQuietExec64" Execute="deferred" Return="check" Impersonate="no" />
    
        <CustomAction Id='AddDISMComponent18' Property='DISMComponent18' Value='"[System64Folder]dism.exe" /norestart /quiet /online /enable-feature /FeatureName:IIS-ASPNET /all /Source:[SXSFOLDER]' Execute='immediate'/>
        <CustomAction Id="DISMComponent18" BinaryKey="WixCA" DllEntry="CAQuietExec64" Execute="deferred" Return="check" Impersonate="no" />
    
        <CustomAction Id='AddDISMComponent19' Property='DISMComponent19' Value='"[System64Folder]dism.exe" /norestart /quiet /online /enable-feature /FeatureName:IIS-NetFxExtensibility /all /Source:[SXSFOLDER]' Execute='immediate'/>
        <CustomAction Id="DISMComponent19" BinaryKey="WixCA" DllEntry="CAQuietExec64" Execute="deferred" Return="check" Impersonate="no" />
    
        <CustomAction Id='AddDISMComponent20' Property='DISMComponent20' Value='"[System64Folder]dism.exe" /norestart /quiet /online /enable-feature /FeatureName:IIS-ISAPIExtensions /all /Source:[SXSFOLDER]' Execute='immediate'/>
        <CustomAction Id="DISMComponent20" BinaryKey="WixCA" DllEntry="CAQuietExec64" Execute="deferred" Return="check" Impersonate="no" />
    
        <CustomAction Id='AddDISMComponent21' Property='DISMComponent21' Value='"[System64Folder]dism.exe" /norestart /quiet /online /enable-feature /FeatureName:IIS-ISAPIFilter /all /Source:[SXSFOLDER]' Execute='immediate'/>
        <CustomAction Id="DISMComponent21" BinaryKey="WixCA" DllEntry="CAQuietExec64" Execute="deferred" Return="check" Impersonate="no" />
    
        <CustomAction Id='AddDISMComponent22' Property='DISMComponent22' Value='"[System64Folder]dism.exe" /norestart /quiet /online /enable-feature /FeatureName:NetFx3 /all /Source:[SXSFOLDER]' Execute='immediate'/>
        <CustomAction Id="DISMComponent22" BinaryKey="WixCA" DllEntry="CAQuietExec64" Execute="deferred" Return="check" Impersonate="no" />
    
        <InstallExecuteSequence>
          <Custom Action="AddDISMComponent1" After="CostFinalize" />
          <Custom Action="AddDISMComponent2" After="AddDISMComponent1" />
          <Custom Action="AddDISMComponent3" After="AddDISMComponent2" />
          <Custom Action="AddDISMComponent4" After="AddDISMComponent3" />
          <Custom Action="AddDISMComponent5" After="AddDISMComponent4" />
          <Custom Action="AddDISMComponent6" After="AddDISMComponent5" />
          <Custom Action="AddDISMComponent7" After="AddDISMComponent6" />
          <Custom Action="AddDISMComponent8" After="AddDISMComponent7" />
          <Custom Action="AddDISMComponent9" After="AddDISMComponent8" />
          <Custom Action="AddDISMComponent10" After="AddDISMComponent9" />
          <Custom Action="AddDISMComponent11" After="AddDISMComponent10" />
          <Custom Action="AddDISMComponent12" After="AddDISMComponent11" />
          <Custom Action="AddDISMComponent13" After="AddDISMComponent12" />
          <Custom Action="AddDISMComponent14" After="AddDISMComponent13" />
          <Custom Action="AddDISMComponent15" After="AddDISMComponent14" />
          <Custom Action="AddDISMComponent16" After="AddDISMComponent15" />
          <Custom Action="AddDISMComponent17" After="AddDISMComponent16" />
          <Custom Action="AddDISMComponent18" After="AddDISMComponent17" />
          <Custom Action="AddDISMComponent19" After="AddDISMComponent18" />
          <Custom Action="AddDISMComponent20" After="AddDISMComponent19" />
          <Custom Action="AddDISMComponent21" After="AddDISMComponent20" />
          <Custom Action="AddDISMComponent22" After="AddDISMComponent21" />
    
          <Custom Action="DISMComponent1" After="InstallInitialize"><![CDATA[(NOT Installed)]]></Custom> 
          <Custom Action="DISMComponent2" After="DISMComponent1"><![CDATA[(NOT Installed)]]></Custom> 
          <Custom Action="DISMComponent3" After="DISMComponent2"><![CDATA[(NOT Installed)]]></Custom> 
          <Custom Action="DISMComponent4" After="DISMComponent3"><![CDATA[(NOT Installed)]]></Custom> 
          <Custom Action="DISMComponent5" After="DISMComponent4"><![CDATA[(NOT Installed)]]></Custom> 
          <Custom Action="DISMComponent6" After="DISMComponent5"><![CDATA[(NOT Installed)]]></Custom> 
          <Custom Action="DISMComponent7" After="DISMComponent6"><![CDATA[(NOT Installed)]]></Custom> 
          <Custom Action="DISMComponent8" After="DISMComponent7"><![CDATA[(NOT Installed)]]></Custom> 
          <Custom Action="DISMComponent9" After="DISMComponent8"><![CDATA[(NOT Installed)]]></Custom> 
          <Custom Action="DISMComponent10" After="DISMComponent9"><![CDATA[(NOT Installed)]]></Custom> 
          <Custom Action="DISMComponent11" After="DISMComponent10"><![CDATA[(NOT Installed)]]></Custom> 
          <Custom Action="DISMComponent12" After="DISMComponent11"><![CDATA[(NOT Installed)]]></Custom> 
          <Custom Action="DISMComponent13" After="DISMComponent12"><![CDATA[(NOT Installed)]]></Custom> 
          <Custom Action="DISMComponent14" After="DISMComponent13"><![CDATA[(NOT Installed)]]></Custom> 
          <Custom Action="DISMComponent15" After="DISMComponent14"><![CDATA[(NOT Installed)]]></Custom> 
          <Custom Action="DISMComponent16" After="DISMComponent15"><![CDATA[(NOT Installed)]]></Custom> 
          <Custom Action="DISMComponent17" After="DISMComponent16"><![CDATA[(NOT Installed)]]></Custom> 
          <Custom Action="DISMComponent18" After="DISMComponent17"><![CDATA[(NOT Installed)]]></Custom> 
          <Custom Action="DISMComponent19" After="DISMComponent18"><![CDATA[(NOT Installed)]]></Custom> 
          <Custom Action="DISMComponent20" After="DISMComponent19"><![CDATA[(NOT Installed)]]></Custom> 
          <Custom Action="DISMComponent21" After="DISMComponent20"><![CDATA[(NOT Installed)]]></Custom> 
          <Custom Action="DISMComponent22" After="DISMComponent21"><![CDATA[(NOT Installed)]]></Custom> 
    
        </InstallExecuteSequence>  
    

    【讨论】:

      【解决方案2】:

      您可以使用内置的 Wix QuietExec 自定义操作来运行 dism 命令行 - 这应该会大大简化安装程序

          <CustomAction Id='AddIISComponent' Property='IISComponent' Value='"[System64Folder]dism.exe" /norestart /quiet /online /enable-feature /featurename:IIS-WebServerRole /all' Execute='immediate'/>
          <CustomAction Id="IISComponent" BinaryKey="WixCA" DllEntry="CAQuietExec64" Execute="deferred" Return="ignore" Impersonate="no" />
          <InstallExecuteSequence>
              <Custom Action="AddIISComponent" After="CostFinalize" />
              <Custom Action="IISComponent" After="InstallInitialize"><![CDATA[(NOT Installed)]]></Custom> 
          </InstallExecuteSequence>
      

      这是一个完整的sample

      【讨论】:

      • 非常感谢您提供的信息。我需要在客户环境下使用安装程序,可能无法在线获得WindowsUpdate...请问如何设置“/Source:”目录?
      • 您应该能够像在示例中一样将源参数添加到命令行。
      • 再次感谢您提出我的基本问题。我会试试的。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-04-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多