【问题标题】:Unable to run command prompt programmatically in Windows service无法在 Windows 服务中以编程方式运行命令提示符
【发布时间】:2015-06-04 19:21:56
【问题描述】:

我有以下代码,用于通过命令行以编程方式运行可执行文件:

var process = new Process();
var startInfo = new ProcessStartInfo();
startInfo.WindowStyle = ProcessWindowStyle.Hidden;
startInfo.WorkingDirectory = ConfigurationManager.BitCometDirectory;
startInfo.FileName = "cmd.exe";
var command = String.Format("/c bitcomet {0} -s --tray", path);
startInfo.Arguments = command;
process.StartInfo = startInfo;
var status = process.Start();

当我通过控制台应用程序测试此代码时,它运行良好。

不过,我们的目标是将此代码集成到 Windows 服务中。当我这样做并将 VS 调试器附加到正在运行的服务时,该服务执行时不会出现问题/错误。 BitComet.exe 和 BitCometService.exe(不确定是什么)也出现在任务管理器中。该命令是打开一个 torrent 文件,不幸的是,这不会发生,因为下载永远不会开始。 FWIW,statustrue

当我最初设置 Windows 服务时,我必须创建一个安装程序并将帐户(服务将在其下运行的帐户类型)设置为 LocalService,这样我就不必在安装时验证服务。我还使用设置为User 的帐户对其进行了测试,结果相同。

有解决问题的方法吗?

提前致谢。

更新 #1: 我在代码中添加了process.StandardOutput.ReadToEnd(); 以记录错误,但这总是返回一个空字符串。但是,当我检查应用程序日志时,我看到以下错误:

Faulting application name: UPNP.exe, version: 1.0.8.11, time stamp: 0x4a9638a4
Faulting module name: UPNP.exe, version: 1.0.8.11, time stamp: 0x4a9638a4
Exception code: 0xc0000005
Fault offset: 0x00013cbf
Faulting process id: 0xe088
Faulting application start time: 0x01d0a1ecc058cc01
Faulting application path: C:\Program Files\BitComet\tools\UPNP.exe
Faulting module path: C:\Program Files\BitComet\tools\UPNP.exe
Report Id: fe9f1270-0ddf-11e5-b482-10604b472e44

我不确定UPNP.exe 是什么,但它似乎是由BitComet.exe 调用的,这是我的代码调用的。关于如何解决这个问题的任何想法?我目前将服务设置为以我的用户身份登录(而不是本地系统或本地服务)。

更新 #2

<Event xmlns="http://schemas.microsoft.com/win/2004/08/events/event">
- <System>
  <Provider Name="Application Error" /> 
  <EventID Qualifiers="0">1000</EventID> 
  <Level>2</Level> 
  <Task>100</Task> 
  <Keywords>0x80000000000000</Keywords> 
  <TimeCreated SystemTime="2015-06-08T14:13:24.000000000Z" /> 
  <EventRecordID>136152</EventRecordID> 
  <Channel>Application</Channel> 
  <Computer><<computer info>></Computer> 
  <Security /> 
  </System>
- <EventData>
  <Data>UPNP.exe</Data> 
  <Data>1.0.8.11</Data> 
  <Data>4a9638a4</Data> 
  <Data>UPNP.exe</Data> 
  <Data>1.0.8.11</Data> 
  <Data>4a9638a4</Data> 
  <Data>c0000005</Data> 
  <Data>00013cbf</Data> 
  <Data>1c5c</Data> 
  <Data>01d0a1f5482780b3</Data> 
  <Data>C:\Program Files\BitComet\tools\UPNP.exe</Data> 
  <Data>C:\Program Files\BitComet\tools\UPNP.exe</Data> 
  <Data>85d9245f-0de8-11e5-bb36-10604b472e44</Data> 
  </EventData>
  </Event>

【问题讨论】:

  • 需要更多信息。 Process.Start() 返回什么?有没有抛出异常?你怎么知道程序没有运行(或者没有'启动和停止并出现一些错误)? (您是否知道服务不会在您的屏幕上或托盘图标上显示任何内容?)
  • 而不是"/c bitcomet ...",使用完整的可执行路径:"/c c:\BitCometDirectory\bitcomet ..."。可能是包含您的bitcomet 可执行文件的目录不在本地服务用户的PATH 环境变量中。 Process.Start() 返回 true,因为它能够启动 cmd.exe,但 cmd.exe 无法执行 bitcomet
  • Windows 服务无法与桌面交互。它在不同的会话中执行。如果您在详细信息视图中添加会话 ID 列,您可以在任务管理器中看到这一点。它有点旧,但Sessions, Desktops and Windows Stations 包含对这些概念的很好的介绍。所以基本上,由服务启动的子进程对交互式用户是不可见的。
  • 您确定这是 UPNP.exe 的整个错误日志条目吗?不应该有一些东西说明错误是什么吗?你应该阅读标准错误以及标准输出。
  • @im1dermike - uPNP.exe 工具是一只好奇的野兽。我最初认为这是一个 Microsoft 配置工具,用于 PNP 客户端将自己宣传为与您引用的 torrent 相关的对等点,但它不是“常规”操作系统位置中的标准可执行文件。正如您所指出的那样,它正在崩溃的事实将使它成为真正需要追踪的熊。

标签: c# command-line windows-services


【解决方案1】:

在黑暗中拍摄,但也许这是问题/修复:

var command = String.Format("/c {0}\\bitcomet  -s --tray", path);

这里的想法是将路径值放入由 CMD 触发的命令中。如果这不是“路径”指向的地方,这将无法解决问题。

【讨论】:

  • wiki.bitcomet.com/bitcomet_command_line。路径是用于打开文件的 bitcomment 命令中的参数。 BitComet &lt;TORRENT_FILE&gt; [–output=OUTPUT] [–silent , [–paused] ] [–tray]
  • 我没有包含它。它只是 *.torrent 文件的有效路径。我相信我刚刚发现了问题。很快就会发布我的答案。
  • 很高兴听到。我很想听听解决方案!怀疑这是左场的出路:)
  • 呃。也许不是。它肯定作为服务成功运行过一次,但我无法重新创建它。 :\ 我添加的最新可能线索作为我的帖子 FWIW 的更新。
【解决方案2】:

试图解决 UPNP.exe 错误已经变成了一个黑洞。虽然理想情况下我会将所有种子(手动和自动启动)都放在同一个应用程序中,但作为替代方案,我想我会尝试连接不同的种子实用程序。我找到了aria2,它是一个命令行 torrent 客户端。几分钟之内,我就可以通过该服务下载一个 torrent。

我不确定 BitComet 及其 UPNP.exe 文件的问题是什么,或者如何解决它,但这是我将要使用的替代方法。

【讨论】:

    猜你喜欢
    • 2019-05-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-12
    • 1970-01-01
    相关资源
    最近更新 更多