msi安装程序完成后的应用程序进程以SYSTEM用户名启动,有时无法创建com对象

Posted

技术标签:

【中文标题】msi安装程序完成后的应用程序进程以SYSTEM用户名启动,有时无法创建com对象【英文标题】:Application process after msi installer finished is started as SYSTEM user name which sometimes can not create com object 【发布时间】:2012-11-21 09:59:15 【问题描述】:

我有一个安装 C# 应用程序的 Visual Studio 安装程序项目,我有一个自定义操作和代码来在安装完成后运行该过程。

假设Windows机器上的登录用户是“john”。现在当 john 运行 msi 安装程序时,我检查了任务管理器中的进程,它显示 msiexec.exe 是安装程序的进程名称,它以用户“john”的身份运行

安装程序完成并运行安装应用程序的进程 myapp.exe 现在,当我在 Windows 的任务管理器中检查此进程时,它显示 myapp.exe 正在以 SYSTEM 身份运行(我知道那是什么帐户以及为什么它不以约翰)

问题 当 myapp.exe 以 SYSTEM 用户身份运行时,它无法创建已经以用户 john 身份运行的组件(在我的情况下为 iTunes)的 com 组件实例。如果组件没有运行,则创建iTunes实例成功,否则失败。

问题 那么是否可以确保安装程序何时以 john 身份运行,当它完成时它以 john 而不是 SYSTEM 用户身份启动进程 myapp.exe ?请注意,我在安装过程中不会要求用户输入密码。

安装程序完成时我运行的代码

    // Event handler for 'Committed' event.
    private void MyInstaller_Committed(object sender, InstallEventArgs e)
    
        try
                        
            Directory.SetCurrentDirectory(Path.GetDirectoryName
            (Assembly.GetExecutingAssembly().Location));
            Process.Start(Path.GetDirectoryName(
              Assembly.GetExecutingAssembly().Location) + "\\MyApp.exe");
        
        catch
        
            // Do nothing... 
        
    

【问题讨论】:

您的问题解决了吗?如果是这样,愿意发布解决方案吗? 我做了,是的,但不记得让我检查我的代码,然后会给你我的解决方案 【参考方案1】:

这很可能是因为您正在延迟运行自定义操作。即它默认在 SYSTEM 用户帐户下运行。

解决方案是确保立即启动它,例如,您可以使用安装最后一个对话框中的“完成”按钮上的已发布事件启动它。我不确切知道如何在 VS 设置项目中添加已发布的事件,或者是否可以,但您可以轻松地在使用专门的 setup authoring tools 构建的包中添加一个。

【讨论】:

【参考方案2】:

在 Form_Load 事件中这样写:

字符串 lUserName=Environment.GetEnvironmentVariable("USERNAME");

那么您将在安装 MSI 时获得 windows 登录用户名,而不是获取系统用户帐户。

【讨论】:

【参考方案3】:

就我个人而言,我确实设法通过运行explorer.exe 来解决这个问题,该参数化为我的应用程序可执行文件的路径:

Process.Start(
    new ProcessStartInfo
    
        FileName = "explorer.exe",
        Arguments = Context.Parameters["target"],
        UseShellExecute = true
    );

【讨论】:

以上是关于msi安装程序完成后的应用程序进程以SYSTEM用户名启动,有时无法创建com对象的主要内容,如果未能解决你的问题,请参考以下文章

System Center 2012 - App Controller 安装语言包

如何使用 python 在 msi 安装程序中写入文本字段?

自定义msi安装包的执行过程

用Wix手工编辑XML制作C++ MSI安装程序,怎样保证安装新版本时候强制卸载旧版本,急急急!!!

如果应用程序打开,Jpackage MSI 升级未完成

如何运行nodejs环境