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 安装程序中写入文本字段?