Process.Start()在Win7和Win8下运行,但不在Windows 2012 R2下运行

时间:2015-04-21 13:35:51

标签: c# windows process windows-services windows2012

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

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

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

当我在Windows 2012 R2环境中尝试完全相同的程序时,我注意到在我的日志文件中收到上面的第一条日志消息后("关于运行文件...")没有记录了其他内容,Process.Start()也无效。这很令人困惑,因为完全相同的程序在其他操作系统中工作。

因此,如果未成功调用Process.Start(),我将不会收到"错误"我的日志中的消息,如果运行Process.Start(),为什么我没有得到"文件触发!"消息?

更新 在评论之后,我运行了Process Monitor,这是在目标.exe文件应该运行的确切时刻生成的日志。请看一下,看到你发现任何可疑的东西:

Link to log spreadsheet on Google Docs

3 个答案:

答案 0 :(得分:2)

我认为这是因为Windows Server 2012默认情况下不允许进程以交互方式运行。

See here for details.

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

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Windows
NoInteractiveServices

将值设置为" 0"。

答案 1 :(得分:1)

  1. 进程查看器中有什么 - 您是否看到了要启动的进程?
  2. Windows事件日志中有什么?
  3. Win2012可能对安全性和应用程序更加严格(从服务执行,因此非常具体的用户)。您可以尝试使用SysInternals中的FileMon / ProcessMonitor来检查它正在失败或停留的呼叫。
  4. 一般的建议:在Windows中从服务启动UI不是最佳做法。创建服务是为了完成一些后台工作而不是用户交互。如果您需要用于服务的UI,更好地创建用户自己启动的UI,创建一个小应用程序,它将位于托盘中并等待服务中的事件,然后在用户所谓的“窗口站”中启动UI。

答案 2 :(得分:0)

Windows Server 2012会阻止从其他位置复制的所有文件。所以我解锁了所有的程序文件。谢谢你的帮助。