我正在尝试在C#Web服务中执行批处理文件。我确信批处理文件没有问题。我面临的问题是批处理文件只能在调试模式下执行。当我连接客户端机器时,它不会产生错误,也不会被执行。我确信连接没有任何问题,因为我可以成功地从客户端向Web服务发送内容。
以下是代码:
try
{
System.Diagnostics.Process proc = new System.Diagnostics.Process();
proc.StartInfo.FileName = "C:\\mybatch.bat";
proc.StartInfo.UseShellExecute = true;
proc.Start();
}
catch (Exception e)
{
return e.ToString();
}
Visual Studio在管理员模式下运行,但cmd.exe在(myUser)模式下运行,但我已授予对每个用户的完全访问权限。我不知道这是不是问题。如果没有,我应该在代码中添加一些内容吗? :(
请告诉我问题的可能原因和解决方法。
答案 0 :(得分:3)
Web服务未在“普通桌面”中运行...它具有不同(=更少)的权限/权限,例如,他们通常无权访问共享...您可以运行Web服务使用您的用户帐户(BIG安全风险!)或者应该重新考虑您的设计,因为从Web服务运行批处理文件通常不是Web服务所做的...
如果您确实需要这样做,请尝试
ProcessStartInfo processInfo = new ProcessStartInfo(@"C:\mybatch.bat");
processInfo.CreateNoWindow = true;
processInfo.UseShellExecute = false;
Process process = Process.Start(processInfo);
process.WaitForExit();
if(process.ExitCode==0){ // success}
请参阅http://msdn.microsoft.com/en-us/library/system.diagnostics.processstartinfo.aspx
答案 1 :(得分:2)
当某些东西在调试模式下工作时非常令人沮丧,但在Release中失败了!为了理清运行时差异,我考虑使用SysInternals的免费ProcMon工具:http://technet.microsoft.com/en-us/sysinternals/bb896645
下载并运行ProcMon以捕获所有注册表和文件访问权限。随着它运行,在调试模式下访问您的网站,并通过Web服务成功执行您的批处理文件。在ProdMon中,停止捕获(按CTRL-E开始和停止捕获)并按CTRL-F搜索“mybatch.bat”。
你应该找到多行 - 注意相关的进程(可能是“w3wp.exe”),并注意每行的操作,路径和结果。您可以过滤结果 - 只需右键单击Process Name并选择“Include w3wp.exe”。
当您准备好看到发布失败案例时,清除您的跟踪(CTRL-X),将您的网络服务器置于发布模式,再次开始跟踪。现在点击你的web服务......一旦失败就停止你的跟踪(CTRL-C)并查看它以查看失败的确切内容。一旦你知道了,你将能够专注于解决这个问题 - 调试和发布之间的具体区别。答案可能会出现在Yahia指出的文档中:http://msdn.microsoft.com/en-us/library/system.diagnostics.processstartinfo.aspx
祝你好运,并告诉你用你找到的东西!
答案 2 :(得分:0)
正如Yahia上面指出的那样,您的问题与安全权限有关。在VS中通过Debug运行时,您的Web服务的常规权限会升高。
您可以开发一个轻量级Windows服务,该服务将在Web服务主机上运行(您可以将它们放在不同的计算机上,只要它们可以访问某些共享资源 - 请参阅下一步)。现在,自然,这个Windows服务将具有扩展权限,因此它可以随时运行任何进程。
至于如何利用两兄弟服务之间的沟通,我认为你有几个选择。第一个突然出现在我脑海中的是使用位于共享位置的文件。当WS收到请求时,它会将该请求写入该共享上的文件中。 Windows服务具有轮询计时器以检查该位置中的新作业,或者它可以使用FileSystemWatcher来通过事件通知。