2016-07-07 111 views
0

在某些时候,我需要赶上msiexec流程启动及其结束事件。我的代码正在使用通常的用户权限。 Windows将以系统权限启动msiexec进程,因此我不能执行Refresh()并检查该进程的HasExited属性。为什么Process.GetProcessesByName(“msiexec”)显示错误的结果?

while (true) { 
    Process[] msi = Process 
     .GetProcessesByName("msiexec"); 

    if (msi.Length > 0) break; 
} 

// The `msiexec` is launched. Now to wait its finishing... 

while (true) { 
    Process[] msi = Process 
     .GetProcessesByName("msiexec"); 

    if (msi.Length == 0) break; // Here is `false` always! 
} 

// Components was installed. 

但第二while循环总是显示msi.Length == 1甚至msiexec后,将完成。为什么会发生?我该如何解决它?

+0

所以,你在所有的系统程序的外观和有* NO * MSIEXEC进程中运行的下降?你对此100%确定?如果是这样,那么你刚刚在.NET中发现了一个错误。 – aquinas

+0

取而代之的是使用循环,你不能在找到过程之后调用'WaitForExit()'方法吗? –

+0

@ChrisDunaway,不,它不起作用。我在创建这个主题之前尝试了它。问题是'msiexec'可以处理系统权限。 –

回答

0

请注意,几个同名的进程可以同时运行。因此,msi.Length可以> 1.在启动msiexec之前,它也可以> 0。

一旦找到了msiexec进程,而不是再次调用GetProcessesByName,则可以测试该进程的HasExited属性。

如果msi.Length> 1,则等到非退出进程的数量由1

+0

不,我不能。我有关于我没有获得'HasExited'值的必要权限的消息。 Windows不能同时安装多个应用程序。因此'msiexec'总是会是一个(在我看来)。 –

+1

我已经看到启动子设置的设置,导致任务管理器中有多个msiexec。请参阅(随机图片显示几个msiexecs):https://williamsitblog.files.wordpress.com/2015/12/image3.png –

+0

也请确保您的应用程序运行在64位。 64位进程可以访问32进程,但反之亦然:发现信息在这里:https://msdn.microsoft.com/en-us/library/system.diagnostics.process(v=vs.110).aspx (第二注)。此外,您需要完全信任的权限(同一链接中的第三个注释)。 –