Process.Start() 在 Win7 和 Win8 下工作,但不能在 Windows 2012 R2 下工作

Process.Start() working under Win7 and Win8 but not Windows 2012 R2

我的程序,运行 通过 Windows 服务能够在 Win7 和 Win8 下成功 运行 以下代码。

Log("About to run the file...");
try
{
    Process.Start(filePath, args);
    Log("File Triggered!");
}
catch (Exception ex)
{
    Log("Error.");
}

虽然位于 filePath 的程序的 UI 从未显示,但该程序完全在后台完成了它的工作。

当我在 Windows 2012 R2 环境中尝试完全相同的程序时,我注意到在我的日志文件 ("About to run the file...") 中收到上面的第一条日志消息后,没有记录任何其他内容并且 Process.Start() 也不行。这很令人困惑,因为完全相同的程序在其他操作系统中也能运行。

所以如果Process.Start()没有调用成功,我的日志中谁没有收到"Error"消息,如果Process.Start()是运行,为什么我没有收到 "File Triggered!" 消息?

更新: 根据评论,我 运行 Process Monitor,这是在它应该 运行 的那一刻为目标 .exe 文件生成的日志。请看一下,看看你发现了什么可疑的东西:

Link to log spreadsheet on Google Docs

我认为这是因为 Windows Server 2012 默认不允许进程 运行 交互。

See here for details.

您可以通过设置注册表项来覆盖此行为:

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Windows
NoInteractiveServices

将值设置为“0”。

  1. 进程查看器中有什么 -- 您是否看到要启动的进程?
  2. Windows 事件日志中有什么?
  3. Win2012 在安全性和您的应用程序方面可能更加严格(从服务执行,因此非常特定的用户)。您可以尝试使用 SysInternals 中的 FileMon/ProcessMonitor 来检查它在哪个调用失败或卡住。

还有一条通用建议:从 Windows 中的服务开始 UI 并不是最佳做法。创建服务是为了完成一些后台工作,而不是进行用户交互。如果您的服务需要 UI,最好创建 UI 用户自己启动,或者创建一个小应用程序,它将位于托盘中并等待来自服务的事件,然后在 UI 中启动所谓的用户 "window station".

Windows Server 2012 屏蔽所有从其他地方复制的文件。所以我解锁了所有的程序文件。感谢您的帮助。