【发布时间】:2016-08-23 00:30:11
【问题描述】:
尝试从 Windows 服务运行 bat 文件。 代码如下:
try
{
SecureString securePwd = new SecureString();
foreach (char c in pwd)
{
securePwd.AppendChar(c);
}
Process process = new Process();
process.StartInfo.UseShellExecute = false;
process.StartInfo.FileName = @"CMD.exe"; //The file in that DIR.
process.StartInfo.WorkingDirectory = @"C:\";
process.StartInfo.Arguments = @"/C " + filePath;
process.StartInfo.Verb = "runas";
process.StartInfo.UserName = user;
process.StartInfo.Password = securePwd;
process.Start();
}
catch (Exception ex)
{
EventLog myEventLog = new EventLog { Source = "MoC LaneUpdate" };
myEventLog.WriteEntry(ex.ToString(), EventLogEntryType.Error);
}
我已经验证了相同的代码在非服务中运行时是否有效。我也没有收到错误消息,但是 .bat 文件没有运行,至少在我当前的用户会话中没有出现。我的文件是否在后台会话中运行?如何在 startinfo 中指定的用户中运行批处理文件?
【问题讨论】:
-
“它似乎没有出现在我当前的用户会话中” - 对我来说听起来很正常,假设您实际上将服务代码作为服务运行。在不同用户的凭据下运行不会改变没有显示控制台窗口的登录会话这一事实,就像您在自己的登录会话中“以管理员身份”运行程序时一样,该程序仍然使用您的会话用户界面。您有什么证据表明批处理文件实际上并未执行?是什么让您认为您发布的代码应该做的不是它正在做的事情?
-
对,但是我的批处理文件应该完成的任务永远不会完成。我不担心看不到 cmd 提示符。
-
您可以配置服务以允许与桌面交互。安装服务后,转到服务屏幕和服务属性菜单的登录选项卡。选中允许服务与桌面交互复选框。
-
哦。你的代码看起来不错。只是为了好玩,你能写一个 bat 文件来创建一个文本文件,如果它被调用,它会给你留下具体的证据吗?然后,如果你有你的服务调用,你肯定会知道它正在调用一个 bat 文件。
-
到目前为止,您对批处理文件的执行所做的唯一明确声明是“它似乎没有出现在我当前的用户会话中”。正如我所说,这是正常的,因此该陈述不代表任何类型的问题陈述。请改进问题,以便您有一个实际的问题陈述;确认批处理文件实际上没有运行,然后编辑问题,以便您提供一个好的minimal reproducible example 可靠地重现该问题。
标签: c# windows-services