概述
项目是这样的,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语句也是完全没有问题的,也就掉以轻心了。
解决方式:打开环境变量,找到path变量,添加%SystemRoot%system32;%SystemRoot%;%SystemRoot%System32Wbem;之后重启IIS即可,根本原因还是底层cmd执行权限受到限制,无法通过cmd调用dll生成文件,因而执行其它的cmd命令没有出现问题。最后尝试了上面各种解决方案,问题得到处理。
最后
以上就是伶俐犀牛为你收集整理的【C#】在IIS7.5中调用执行cmd命令生成文件失败的全部内容,希望文章能够帮你解决【C#】在IIS7.5中调用执行cmd命令生成文件失败所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复