项目是这样的,C++人员写了一个dll,便于跨平台调用,所以用的是控制台界面传参调用,目的是生成一个文件。代码编写完成后,本机没问题,发布到阿里云服务器始终调用不成功,而直接在cmd界面是可以调用执行成功的。代码主要如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37/// <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.查看配置文件是否给予权限配置:
1
2
3
4<system.webServer> <modules runAllManagedModulesForAllRequests="true"/> </system.webServer>
8.终极杀器,尝试将能够运行的iis服务器配置,迁移到该机来运行。操作步奏就是点击IIS服务器,在右边的管理框内,点击共享的配置,导出配置。然后在新主机的iis服务器上,同样进入“共享的配置”,勾选启用共享的配置,选择物理路径,点击右边的“应用”后才输入密码,而不是直接填写完了各项参数后点击应用。
这里进行完上面8项解决方式的尝试后,也跟阿里云工程师提交了工单,依旧没有解决此问题。后经提醒,可能是基础环境变量导致。其实也有想过是这个问题,但由于考虑到cmd窗口能够执行,且即便在IIS中,上面函数试着执行ipconfig > D:test.txt语句也是完全没有问题的,也就掉以轻心了。
解决方式:打开环境变量,找到path变量,添加%SystemRoot%system32;%SystemRoot%;%SystemRoot%System32Wbem;之后重启IIS即可,根本原因还是底层cmd执行权限受到限制,无法通过cmd调用dll生成文件,因而执行其它的cmd命令没有出现问题。最后尝试了上面各种解决方案,问题得到处理。
最后
以上就是伶俐犀牛最近收集整理的关于【C#】在IIS7.5中调用执行cmd命令生成文件失败的全部内容,更多相关【C#】在IIS7内容请搜索靠谱客的其他文章。
发表评论 取消回复