在Wix MSI中:卸载时终止进程

在Wix MSI中:卸载时终止进程,wix,uninstallation,windows-installer,Wix,Uninstallation,Windows Installer,我添加了一个自定义操作,当有人试图使用“控制面板”中的“添加/删除”命令(使用以下代码)卸载我的应用程序时,该操作应使用taskkill CMD终止该应用程序: <Property Id="TASKKILL"> <DirectorySearch Id="SysDir" Path="[SystemFolder]" Depth="1"> <FileSearch Id="taskkillExe" Name="taskkill.exe

我添加了一个自定义操作,当有人试图使用“控制面板”中的“添加/删除”命令(使用以下代码)卸载我的应用程序时,该操作应使用taskkill CMD终止该应用程序:

<Property Id="TASKKILL">
        <DirectorySearch Id="SysDir" Path="[SystemFolder]" Depth="1">
            <FileSearch Id="taskkillExe" Name="taskkill.exe" />
        </DirectorySearch>
</Property>

<CustomAction Id="ServerKill" Property="TASKKILL" Execute="immediate" Impersonate="yes" Return="ignore" ExeCommand="/F /FI &quot;IMAGENAME EQ App.exe&quot;"/>

<InstallExecuteSequence>
    <Custom Action="ServerKill" After="FindRelatedProducts"/>   
</InstallExecuteSequence>

然而,这不起作用。如果有人能告诉我如何修复它,或者分享一种更好/更简单的方法来终止我的应用程序进程,我将不胜感激

p、 s

还尝试使用cmd使用WMIC。这确实不起作用,因此安装本身根本没有完成。

也许您可以从Util模式中尝试关闭应用程序功能:

有关示例代码段,请参见此处:


更新:我运行了一些测试,这个元素的工作原理与我预期的略有不同。首先需要添加对wixutil扩展名文件的引用。在命令行上,这是:

candle -ext WiXUtilExtension Test.wxs
light -ext WixUtilExtension Test.wixobj
Visual Studio中我认为您只需向WixUtilExtension.dll添加一个项目引用即可

然后,您只需将如下内容添加到wxs源文件:

  <util:CloseApplication Id="CloseNotepad" Target="notepad.exe"
                         CloseMessage="yes" RebootPrompt="no">
  </util:CloseApplication>

并将其添加到wxs文件的顶部:

<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi" 
     xmlns:util="http://schemas.microsoft.com/wix/UtilExtension">

看起来Wix负责剩下的工作(自定义操作和MSI中的自定义表,其中包含要终止的进程列表)


这是我的完整测试文件:

<?xml version="1.0" encoding="utf-8"?>
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi" 
     xmlns:util="http://schemas.microsoft.com/wix/UtilExtension">

   <Product Id="*" UpgradeCode="12345678-1234-1234-1234-111111111111" 
            Name="Example Product Name" Version="0.0.1" Manufacturer="Example Company Name" Language="1033">
      <Package InstallerVersion="200" Compressed="yes" Comments="Windows Installer Package"/>
      <Media Id="1" Cabinet="product.cab" EmbedCab="yes"/>

      <Directory Id="TARGETDIR" Name="SourceDir">
         <Component Id="ApplicationFiles" Guid="*">
        </Component>
      </Directory>

      <Feature Id="DefaultFeature" Level="1">
         <ComponentRef Id="ApplicationFiles"/>
      </Feature>

      <util:CloseApplication Id="CloseNotepad" Target="notepad.exe" CloseMessage="yes" RebootPrompt="no"></util:CloseApplication>
   </Product>
</Wix>

也许您可以从Util模式中尝试关闭应用程序功能

有关示例代码段,请参见此处:


更新:我运行了一些测试,这个元素的工作原理与我预期的略有不同。首先需要添加对wixutil扩展名文件的引用。在命令行上,这是:

candle -ext WiXUtilExtension Test.wxs
light -ext WixUtilExtension Test.wixobj
Visual Studio中我认为您只需向WixUtilExtension.dll添加一个项目引用即可

然后,您只需将如下内容添加到wxs源文件:

  <util:CloseApplication Id="CloseNotepad" Target="notepad.exe"
                         CloseMessage="yes" RebootPrompt="no">
  </util:CloseApplication>

并将其添加到wxs文件的顶部:

<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi" 
     xmlns:util="http://schemas.microsoft.com/wix/UtilExtension">

看起来Wix负责剩下的工作(自定义操作和MSI中的自定义表,其中包含要终止的进程列表)


这是我的完整测试文件:

<?xml version="1.0" encoding="utf-8"?>
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi" 
     xmlns:util="http://schemas.microsoft.com/wix/UtilExtension">

   <Product Id="*" UpgradeCode="12345678-1234-1234-1234-111111111111" 
            Name="Example Product Name" Version="0.0.1" Manufacturer="Example Company Name" Language="1033">
      <Package InstallerVersion="200" Compressed="yes" Comments="Windows Installer Package"/>
      <Media Id="1" Cabinet="product.cab" EmbedCab="yes"/>

      <Directory Id="TARGETDIR" Name="SourceDir">
         <Component Id="ApplicationFiles" Guid="*">
        </Component>
      </Directory>

      <Feature Id="DefaultFeature" Level="1">
         <ComponentRef Id="ApplicationFiles"/>
      </Feature>

      <util:CloseApplication Id="CloseNotepad" Target="notepad.exe" CloseMessage="yes" RebootPrompt="no"></util:CloseApplication>
   </Product>
</Wix>

或者,计划在卸载时运行的简单VBScript应执行以下操作:

strComputer=“”
设置objWMIService=GetObject(“winmgmts:_
&“{impersonationLevel=impersonate}!\\”&strComputer&“\root\cimv2”)
设置colProcessList=objWMIService.ExecQuery_
(“从Win32_进程中选择*,其中名称='Notepad.exe')
对于colProcessList中的每个objProcess
objProcess.Terminate()
下一个

或者,计划在卸载时运行的简单VBScript应执行以下操作:

strComputer=“”
设置objWMIService=GetObject(“winmgmts:_
&“{impersonationLevel=impersonate}!\\”&strComputer&“\root\cimv2”)
设置colProcessList=objWMIService.ExecQuery_
(“从Win32_进程中选择*,其中名称='Notepad.exe')
对于colProcessList中的每个objProcess
objProcess.Terminate()
下一个

Hi,感谢您的重播,我签出了它,由于未知原因,我无法定义CloseApplication元素。我收到以下消息:Setup.wxs(35):错误CNDL0200:Product元素包含未处理的扩展元素“util:CloseApplication”。请确保已提供“”命名空间中元素的扩展。WixUI_InstallDirNoLicense.wxs light.exe:错误LGHT0093:在提供的中间体列表中找不到条目部分。应为“Product”类型的部分。我在上面的答案中添加了一些详细信息。您好,感谢重播将其签出,由于未知原因,我无法定义CloseApplication元素。我收到以下消息:Setup.wxs(35):错误CNDL0200:Product元素包含未处理的扩展元素“util:CloseApplication”。请确保已提供“”命名空间中元素的扩展。WixUI_InstallDirNoLicense.wxs light.exe:错误LGHT0093:在提供的中间体列表中找不到条目部分。应为“Product”类型的部分。我在上面的答案中添加了一些细节。