首页 新闻 会员 周边 捐助

.net core 网站发布后,调用 CMD.exe 无效

0
悬赏园豆:20 [已解决问题] 解决于 2020-06-22 10:55

过程如下:
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 上都不行
都不行.......

recordman的主页 recordman | 初学一级 | 园豆:10
提问于:2020-06-19 08:45
< >
分享
最佳答案
0

建议提供一下

static bool RunCmdNew(string WorkRootPath, string exePath, string arguments)

这三个参数的资料。

我的意思是你实际运行了的数据, WorkRootPath,exePath,arguments 传了啥。

收获园豆:10
爱编程的大叔 | 高人七级 |园豆:30844 | 2020-06-19 10:06

非常感谢!
WorkRootPath: D:\LiveSite\VSPDep\SnCamDllTest
exePath:XXXXX.exe
arguments:白鸽-109_100200012-D:\LiveSite\VSPDep\SnCamDllTest\data


ps: 直接在CMD命令窗口上,是可以调用的。 arguments 参数中的 - 起到分割的作用。

recordman | 园豆:10 (初学一级) | 2020-06-19 10:40

非常感谢!
您可以简单新建个 .net core 的站点,发布到 IIS 后, 能看到无法调用的场景了。

recordman | 园豆:10 (初学一级) | 2020-06-19 11:32

@recordman: 不用谢。
说实话,我很少会故意去挑战系统的安全设置。
简单说,你现在做的是反安全设计,但凡有别的办法,都不用网站干这事。

爱编程的大叔 | 园豆:30844 (高人七级) | 2020-06-19 11:55

@爱编程的大叔:
我明白这样写法的弊端。没想到部署的时候出了问题。
现在最重要的是解决问题,交付。

recordman | 园豆:10 (初学一级) | 2020-06-19 12:04

@爱编程的大叔:
有的时候客户要求调用他们第三方的EXE,有的时候需要调用外部的专用程序,比如FFMpeg、Zip 等等。
没想到发布后,困住了.....

recordman | 园豆:10 (初学一级) | 2020-06-19 12:30

@recordman: 到了这种时候,才喊救命,办法其实已经不多了。

  1. 比如试试,外部EXE放在网站内部看看行不行,先别说不能放里面。里面不行外面更难。
  2. 如果服务器可以任你们摆布的话,写个木马EXE干这事呗。人不能被尿给憋死。
  3. 人有多大胆,地有多大产。这时候很多可能的解决方案都变成和你能接受的变通以及你的服务器环境息息相关了,这么问比较难。有可能的话还是建议你找人现场指导。
爱编程的大叔 | 园豆:30844 (高人七级) | 2020-06-19 12:42

@爱编程的大叔:
非常感谢您的热心回复!谢谢。
1,EXE就在站点内部
2,最终的服务器,我见不到
3,方法总比问题多,写个辅助winfrom就可以的,放到托盘上,由他发起。

PS:只是不甘心,这个问题居然没找到解决方法,不能留有遗憾!

recordman | 园豆:10 (初学一级) | 2020-06-19 13:39

@recordman:
你知道 Winform 方法就OK啦。
这才是正规方法。
可能搞安全的人会喜欢和系统安全对着干。
我一般不喜欢挑战规则,在规则内寻找解决方案才是我一贯的作法。
否则说不定哪个Service Pack直接就废了你一个漏洞方法。

爱编程的大叔 | 园豆:30844 (高人七级) | 2020-06-19 15:22
其他回答(1)
0

可能是 IIS 应用程序池账号权限的问题

收获园豆:10
dudu | 园豆:29880 (高人七级) | 2020-06-19 08:56

非常感谢 dudu ! 上一个难题也是您解决的
1,应用程序池 标识 改成 管理员administrator
2,服务中 IIS Admin 改成选中了 可与桌面交互

依然不行.....

支持(0) 反对(0) recordman | 园豆:10 (初学一级) | 2020-06-19 09:37

@recordman: 建议提供一下运行 cmd.exe 的相关代码

支持(0) 反对(0) dudu | 园豆:29885 (高人七级) | 2020-06-19 09:39

@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;
    }
支持(0) 反对(0) recordman | 园豆:10 (初学一级) | 2020-06-19 09:49

非常感谢!
您可以简单新建个 .net core 的站点,发布后,就能看到无法调用的场景了。

支持(0) 反对(0) recordman | 园豆:10 (初学一级) | 2020-06-19 11:31
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册