【问题标题】:Running MSI uninstaller with elevated privilege以提升的权限运行 MSI 卸载程序
【发布时间】:2011-12-16 02:09:34
【问题描述】:

我创建了一个窗口设置项目,并向主应用程序添加了一些自定义安装程序类,以便将其包含在设置项目的自定义操作部分中。我没有使用任何第三方安装程序,只是普通的 Visual Studio 安装项目。

我的应用程序有一个自定义安装程序类,在卸载功能中,我包含了一个函数来终止进程,并删除在程序目录中创建的额外文件。 它适用于 Windows XP 但不适用于 7。所以我假设它与 UAC 有关。如何强制运行具有管理员权限的卸载程序?

这是我的卸载程序覆盖代码:

public override void Uninstall(IDictionary savedState)
{
    base.Uninstall(savedState);
    try
    {
       KillProcess();
       DeleteAppPathFolder();
    }
    catch (Exception) { }
}

private void KillProcess()
{
    for (; ; )
    {
        Process[] procMain = Process.GetProcessesByName("TaskbarNotificator");
        if (procMain.Length > 0)
        {
            procMain[0].Kill();
        }
        else
            break; 
    }
}

private void DeleteAppPathFolder()
{
    FileInfo fileInfo = new FileInfo
        (System.Reflection.Assembly.GetExecutingAssembly().Location);

    string sProgram = Path.Combine(fileInfo.DirectoryName, GLOBALS.APP_DIR_NAME);

    if (Directory.Exists(sProgram))
        Directory.Delete(sProgram, true);
}

【问题讨论】:

  • 不清楚您是在制作 MSI 还是有自定义应用程序可以卸载您的产品。
  • 我不确定您所说的生成 MSI 是什么意思。我已经为我的主应用程序创建了一个安装程序类,然后将其作为自定义操作的一部分添加到 MSI 安装程序项目中。我粘贴的代码是卸载覆盖功能的一部分。

标签: c# windows-installer admin uninstallation


【解决方案1】:

要让自定义操作以完全权限运行,您可以确保它被安排为延迟且没有模拟。基本上,它必须在 MSI 中使用 msidbCustomActionTypeInScript and msidbCustomActionTypeNoImpersonate 标志。

每个设置创作工具的执行方式不同。如果您找不到设置方法,请向我们提供有关您用于创建 MSI 的更多详细信息。

【讨论】:

  • 这正是我想要做的。我正在阅读链接,但没有迹象表明我必须在哪里输入标志。是否在 CustomActionData 字段中?
  • 你用什么来创建你的包? Visual Studio 安装项目、WiX 等?
  • Visual Studio 安装项目。不过,我必须澄清一些事情。我想在管理员模式下运行卸载程序,因为安装程序类中有一个自定义代码覆盖了卸载程序类。我不知道你提出的解决方案是否正确。
  • 这是以管理员身份运行自定义操作的正确方法。您使用的是哪个 Visual Studio 版本?在 VS 2010 中,默认情况下应该推迟自定义操作,不进行模拟。另外,您是否尝试过调试代码以查看究竟是什么失败了?
  • 我认为您提供的解决方案与我想要的不相关,所以我将我的问题移至此帖子 [链接] (stackoverflow.com/questions/7933477/…)
猜你喜欢
  • 1970-01-01
  • 2020-05-21
  • 2014-07-15
  • 2014-12-11
  • 2019-05-27
  • 2016-06-05
  • 2019-07-03
  • 2022-10-18
  • 2011-08-27
相关资源
最近更新 更多