天天看点

【C#】在IIS7.5中调用执行cmd命令生成文件失败

项目是这样的,C++人员写了一个dll,便于跨平台调用,所以用的是控制台界面传参调用,目的是生成一个文件。代码编写完成后,本机没问题,发布到阿里云服务器始终调用不成功,而直接在cmd界面是可以调用执行成功的。代码主要如下:

/// <summary>
        /// 执行cmd命令
        /// </summary>
        /// <param name="cmdS">cmd命令</param>
        /// <returns>执行结果是否成功</returns>
        public bool ExecuteCmd(string cmdS)
        {
            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.Arguments = "/c " + cmdS;      //“/C”表示执行完命令后马上退出
                CmdProcess.Start();//执行
                string fff = CmdProcess.StandardOutput.ReadToEnd(); //输出
                CmdProcess.WaitForExit();//等待程序执行完退出进程
                CmdProcess.Close();//结束
                result = true;
            }
            catch (Exception ex)
            {
                CmdProcess.Close();//结束
                throw;
            }
            return result;
        }
           

于是尝试了以下的解决方案:

在执行cmd代码中添加日志,将执行记录添加到txt文件中,发现实际效果就是代码执行了,也没有抛出异常,但是却没有起任何作用,相当于没有得到执行。于是猜测,大概是权限或者环境的问题。顺着这个思路,有了以下的各种处理方式:

1.将IIS里面你程序用到的程序池的高级设置中“启用32位应用程序”置为true,“加载用户配置文件”置为true。

2.将调用的dll文件,以及生成文件的路径添加IIS用户完全控制权限。

3.将调用的dll文件全部拷贝到bin执行文件夹下,或者windows路径下。

4.在用户管理中创建一个IIS用户,接着找到发步站点的应用程序池,右键高级设置,找到进程模型-标志,点击后面...按钮,选择自定义账户,打开设置,填写前面创建的IIS用户和密码

5.同上面一点,更改进程模型-标志,将内置账户的类型由ApplicationPoolIdentity,分别重新选择为LocalService、LocalSystem、NetworkService进行尝试。

6.打开 IIS 管理器,然后导航至您要管理的级别,在“功能视图”的“server主页”、“site 主页”或“application 主页”页上,双击“处理程序映射”,接着在“操作”页上,单击“编辑功能权限”,全部勾选后点击确定,给予尽量大的脚本权限。

7.查看配置文件是否给予权限配置:

<system.webServer>
    <modules runAllManagedModulesForAllRequests="true"/>
  </system.webServer>
           

8.终极杀器,尝试将能够运行的iis服务器配置,迁移到该机来运行。操作步奏就是点击IIS服务器,在右边的管理框内,点击共享的配置,导出配置。然后在新主机的iis服务器上,同样进入“共享的配置”,勾选启用共享的配置,选择物理路径,点击右边的“应用”后才输入密码,而不是直接填写完了各项参数后点击应用。

这里进行完上面8项解决方式的尝试后,也跟阿里云工程师提交了工单,依旧没有解决此问题。后经提醒,可能是基础环境变量导致。其实也有想过是这个问题,但由于考虑到cmd窗口能够执行,且即便在IIS中,上面函数试着执行ipconfig > D:test.txt语句也是完全没有问题的,也就掉以轻心了。

【C#】在IIS7.5中调用执行cmd命令生成文件失败

解决方式:打开环境变量,找到path变量,添加%SystemRoot%\system32;%SystemRoot%;%SystemRoot%\System32\Wbem;之后重启IIS即可,根本原因还是底层cmd执行权限受到限制,无法通过cmd调用dll生成文件,因而执行其它的cmd命令没有出现问题。最后尝试了上面各种解决方案,问题得到处理。