【问题标题】:Unable to uninstall a driver无法卸载驱动程序
【发布时间】:2016-09-28 13:24:10
【问题描述】:

使用 Wix 3.10.2 生成我的产品安装程序。我在卸载驱动程序时遇到了很多麻烦。我一直在尽我所能了解网络上的示例,并且可以安装驱动程序。问题在于卸载 - 他们没有。

这里是product.wxs的相关部分:

<Directory Id="MYDRIVER" Name="myDriver">
    <!-- Windows 7 -->
    <Component Id="myDriver_Win7" Guid="..." KeyPath="yes" SharedDllRefCount="yes" Win64="$(var.Win64)">
        <Condition>VersionNT = 601</Condition>
        <File Id="myDriver.inf_win7" Name="myDriver.inf" Vital="no" DiskId="1" Source="$(var.WIN64BINARIES)\UHDDriver\Win7Release\myDriver.inf" />
        <File Id="myDriver.sys_win7" Name="myDriver.sys" Vital="no" DiskId="1" Source="$(var.WIN64BINARIES)\UHDDriver\Win7Release\myDriver.sys" />
        <File Id="myDriver_.cat_win7" Name="myDriver_.cat" Vital="no" DiskId="1" Source="$(var.WIN64BINARIES)\UHDDriver\Win7Release\myDriver_.cat" />
        <Driver AddRemovePrograms="no" DeleteFiles="yes" Legacy="yes" PlugAndPlayPrompt="no" Sequence="4" xmlns="http://schemas.microsoft.com/wix/DifxAppExtension" />
    </Component>
    <!-- Windows 8.1, Server 2012R2 -->
    <Component Id="myDriver_Win8.1" Guid="..." KeyPath="yes" SharedDllRefCount="yes" Win64="$(var.Win64)">
        <Condition>VersionNT = 603</Condition>
        <File Id="myDriver.inf_win8.1" Name="myDriver.inf" Vital="no" DiskId="1" Source="$(var.WIN64BINARIES)\UHDDriver\Win8.1Release\myDriver.inf" />
        <File Id="myDriver.sys_win8.1" Name="myDriver.sys" Vital="no" DiskId="1" Source="$(var.WIN64BINARIES)\UHDDriver\Win8.1Release\myDriver.sys" />
        <File Id="myDriver_.cat_win8.1" Name="myDriver_.cat" Vital="no" DiskId="1" Source="$(var.WIN64BINARIES)\UHDDriver\Win8.1Release\myDriver_.cat" />
        <Driver AddRemovePrograms="no" DeleteFiles="yes" Legacy="yes" PlugAndPlayPrompt="no" Sequence="4" xmlns="http://schemas.microsoft.com/wix/DifxAppExtension" />
    </Component>
</Directory>

<Feature Id="extDevice" AllowAdvertise="no" ConfigurableDirectory="INSTALLDIR" Level="101" Title="External USB Device">
...
<ComponentRef Id="myDriver_Win7" />
<ComponentRef Id="myDriver_Win8.1" />
...
</Feature>

根据操作系统版本安装适当的驱动程序。卸载,我原以为,只是反过来。

我从阅读 https://msdn.microsoft.com/en-us/library/windows/hardware/ff553591%28v=vs.85%29.aspx 了解到,DeleteFiles 现在什么都不做(对于操作系统 > win7)。

从过去的时代开始,我们还有一个自定义操作(从 installshield 移植),它试图删除过时的驱动程序版本。 product.wxs 中设置自定义操作的代码:

<CustomAction Id="CA_DeleteDriverSysFile" BinaryKey="CustomActions_dll" DllEntry="DeleteDriverSysFile" />

<InstallExecuteSequence>
...
<Custom Action="CA_DeleteDriverSysFile" After="RemoveFolders">(REMOVE="ALL") Or (feature selection conditions)</Custom>
...
</InstallExecuteSequence>

还有 C# 代码:

[CustomAction]
public static ActionResult DeleteDriverSysFile(Session session)
{
    return DoDeleteDriverSysFile(session, MYDRIVER_SYS);
}

static ActionResult DoDeleteDriverSysFile(Session session, string driverFilen)
{
    try
    {
        string driverPath = Path.Combine(new string[] { Environment.SystemDirectory, "drivers", driverFilen });
        File.Delete(driverPath);
        return ActionResult.Success;
    }
    catch (Exception e)
    {
        return ActionResult.Failure;
    }
}

很简单,但是总是返回 ActionResult.Failure 代码.. 无法从驱动程序目录中删除文件,即使以管理员身份登录也是如此。

我在这里做错了什么,我应该怎么做才能删除驱动程序?

相关 - 如何修复已安装此驱动程序的 Windows Server 2016 机器以及现在卸载失败的位置?

【问题讨论】:

  • 您是否尝试将您的 CustomAction 标记为 Execute="deferred" ?您可能想使用 session.Log("Exception删除系统驱动程序:{0}", e.Message);在您返回 ActionResult.Failure 之前,因此当您使用 /l*v log.txt 运行 msiexec 时,您会在 msi 日志中获得一些信息
  • 当您尝试添加 Execute="deferred" 时,不要忘记 Impersonate="no"。
  • ^^ 成功了!

标签: windows wix driver uninstallation wix3.10


【解决方案1】:

Brian 和 Sutarmin 回答了这个问题。我将 CA 设置为立即执行并作为执行安装的用户。我还在Package 标签中添加了InstallScope="perMachine"

为了修复机器,我去了设备管理器,启用查看->隐藏并右键单击删除有问题的驱动程序。然后,通过通常的渠道删除该软件。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-10-23
    • 1970-01-01
    • 1970-01-01
    • 2023-01-28
    • 2016-09-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多