过程如下:
1,.net core 网站发布后,服务器上 localhost 访问URL时,调用 CMD.exe
2, 谷歌浏览器左下角显示“正在等待localhost的响应”
3,过2分钟后,显示 HTTP 错误 502.3 - Bad Gateway 操作超时
4,开发环境代码调试没问题
PS:网上各种查,都不好用,请大神出手,感激涕零.....
做了如下操作:
1,应用程序池 标识 改成 管理员administrator
要调用的第三方程序在网站的目录中,网站目录上也给予了 administrator 最大权限
2,服务中 IIS Admin 改成选中了 可与桌面交互
3,给文件:“C:\Windows\System32\cmd.exe” 添加了 everyone 执行权限
4,部署到 Win 10 X64 IIS 和 win server 2012 X64 IIS 上都不行
都不行.......
建议提供一下
static bool RunCmdNew(string WorkRootPath, string exePath, string arguments)
这三个参数的资料。
我的意思是你实际运行了的数据, WorkRootPath,exePath,arguments 传了啥。
非常感谢!
WorkRootPath: D:\LiveSite\VSPDep\SnCamDllTest
exePath:XXXXX.exe
arguments:白鸽-109_100200012-D:\LiveSite\VSPDep\SnCamDllTest\data
ps: 直接在CMD命令窗口上,是可以调用的。 arguments 参数中的 - 起到分割的作用。
非常感谢!
您可以简单新建个 .net core 的站点,发布到 IIS 后, 能看到无法调用的场景了。
@recordman: 不用谢。
说实话,我很少会故意去挑战系统的安全设置。
简单说,你现在做的是反安全设计,但凡有别的办法,都不用网站干这事。
@爱编程的大叔:
我明白这样写法的弊端。没想到部署的时候出了问题。
现在最重要的是解决问题,交付。
@爱编程的大叔:
有的时候客户要求调用他们第三方的EXE,有的时候需要调用外部的专用程序,比如FFMpeg、Zip 等等。
没想到发布后,困住了.....
@recordman: 到了这种时候,才喊救命,办法其实已经不多了。
PS:只是不甘心,这个问题居然没找到解决方法,不能留有遗憾!
@recordman:
你知道 Winform 方法就OK啦。
这才是正规方法。
可能搞安全的人会喜欢和系统安全对着干。
我一般不喜欢挑战规则,在规则内寻找解决方案才是我一贯的作法。
否则说不定哪个Service Pack直接就废了你一个漏洞方法。
可能是 IIS 应用程序池账号权限的问题
非常感谢 dudu ! 上一个难题也是您解决的
1,应用程序池 标识 改成 管理员administrator
2,服务中 IIS Admin 改成选中了 可与桌面交互
依然不行.....
@recordman: 建议提供一下运行 cmd.exe 的相关代码
@dudu: 非常感谢
/// <summary>
/// 通过CMD 调用第三方
/// </summary>
/// <param name="WorkRootPath">CMD工作目录</param>
/// <param name="exePath">第三方程序名称 </param>
/// <param name="arguments">第三方程序 所需参数</param>
/// <returns></returns>
static bool RunCmdNew(string WorkRootPath, string exePath, string arguments)
{
bool result = false;
Process CmdProcess = new Process();
try
{
CmdProcess.StartInfo.FileName = "cmd.exe";
CmdProcess.StartInfo.CreateNoWindow = true; // 创建新窗口
CmdProcess.StartInfo.UseShellExecute = false; // 不启用shell启动进程
CmdProcess.StartInfo.RedirectStandardInput = true; // 重定向输入
CmdProcess.StartInfo.RedirectStandardOutput = true; // 重定向标准输出
CmdProcess.StartInfo.RedirectStandardError = true; // 重定向错误输出
CmdProcess.StartInfo.WorkingDirectory = WorkRootPath;
CmdProcess.StartInfo.Arguments = "/c " + exePath + " " + arguments;
bool bl= CmdProcess.Start();//执行
Log.LogHelper.Info(" 启动CMD 节点 3" + bl);
//string fff = CmdProcess.StandardOutput.ReadToEnd(); //输出
CmdProcess.WaitForExit();//等待程序执行完退出进程
CmdProcess.Close();//结束
result = true;
//Log.LogHelper.Info(" 启动CMD 输出:" + fff);
}
catch (Exception ex)
{
CmdProcess.Close();//结束
throw;
}
return result;
// bool result = false;
// //try
// //{
// using (Process p = new Process())
// {
// ////启动程序
// //System.Diagnostics.Process p = new System.Diagnostics.Process();
// p.StartInfo.FileName = @"C:\Windows\System32\cmd.exe";
// p.StartInfo.UseShellExecute = false; //是否使用操作系统shell启动
// p.StartInfo.RedirectStandardInput = true;//接受来自调用程序的输入信息
// p.StartInfo.RedirectStandardOutput = true;//由调用程序获取输出信息
// p.StartInfo.RedirectStandardError = true;//重定向标准错误输出
// p.StartInfo.CreateNoWindow = false;//不显示程序窗口
// p.StartInfo.WorkingDirectory = WorkRootPath;
// p.Start();//启动程序
// p.StandardInput.WriteLine(exePath + " " + arguments);
// //p.StandardInput.WriteLine("\r");
// p.StandardInput.AutoFlush = true;
// p.StandardInput.WriteLine("exit");
// p.StandardInput.WriteLine("\r");
// ////获取cmd窗口的输出信息
// string output = p.StandardOutput.ReadToEnd();
// Log.LogHelper.Info(" 启动CMD 输出:" + output);
// p.WaitForExit();//等待程序执行完退出进程
// p.Close();
// result = true;
// }
// //}
// //catch (Exception ex)
// //{
// // Log.LogHelper.Info("启动CMD异常:" + ex.Message);
// //}
// return result;
}
非常感谢!
您可以简单新建个 .net core 的站点,发布后,就能看到无法调用的场景了。