0

我的程序,通过 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()运行,为什么我没有得到“文件触发!” 信息?

更新: 在评论之后,我运行了进程监视器,这是在目标 .exe 文件应该运行的确切时间生成的日志。请看一下,看看你是否发现任何可疑之处:

链接到 Google Docs 上的日志电子表格

4

3 回答 3

2

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

有关详细信息,请参见此处。

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

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Windows
NoInteractiveServices

将值设置为“0”。

于 2015-04-21T13:40:25.843 回答
1
  1. 进程查看器中有什么——你看到你的进程开始了吗?
  2. Windows 事件日志中有什么?
  3. Win2012 可能对安全性和您的应用程序(从服务执行,因此非常特定的用户)更严格。您可以尝试使用 SysInternals 的 FileMon/ProcessMonitor 来检查它在哪个调用失败或卡在哪个调用。

还有一个通用的建议:在 Windows 中从服务启动 UI 并不是最佳实践。创建服务是为了完成一些后台工作,而不是与用户交互。如果您的服务需要 UI,最好创建用户自己启动的 UI,创建一个小应用程序,该应用程序将位于托盘中并等待来自服务的事件,然后在用户中启动 UI,即所谓的“窗口站”。

于 2015-04-21T13:44:39.883 回答
0

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

于 2015-04-22T10:36:45.167 回答