1. using System.Diagnostics;
  2. public class CmdHelper
  3. {
  4. private static string CmdPath = @"C:\Windows\System32\cmd.exe";
  5.  
  6. /// <summary>
  7. /// 执行cmd命令
  8. /// 多命令请使用批处理命令连接符:
  9. /// <![CDATA[
  10. /// &:同时执行两个命令
  11. /// |:将上一个命令的输出,作为下一个命令的输入
  12. /// &&:当&&前的命令成功时,才执行&&后的命令
  13. /// ||:当||前的命令失败时,才执行||后的命令]]>
  14. /// 其他请百度
  15. /// </summary>
  16. /// <param name="cmd"></param>
  17. /// <param name="output"></param>
  18. public static void RunCmd(string cmd, out string output)
  19. {
  20. cmd = cmd.Trim().TrimEnd('&') + "&exit";//说明:不管命令是否成功均执行exit命令,否则当调用ReadToEnd()方法时,会处于假死状态
  21. using (Process p = new Process())
  22. {
  23. p.StartInfo.FileName = CmdPath;
  24. p.StartInfo.UseShellExecute = false; //是否使用操作系统shell启动
  25. p.StartInfo.RedirectStandardInput = true; //接受来自调用程序的输入信息
  26. p.StartInfo.RedirectStandardOutput = true; //由调用程序获取输出信息
  27. p.StartInfo.RedirectStandardError = true; //重定向标准错误输出
  28. p.StartInfo.CreateNoWindow = true; //不显示程序窗口
  29. p.Start();//启动程序
  30.  
  31. //向cmd窗口写入命令
  32. p.StandardInput.WriteLine(cmd);
  33. p.StandardInput.AutoFlush = true;
  34.  
  35. //获取cmd窗口的输出信息
  36. output = p.StandardOutput.ReadToEnd();
  37. p.WaitForExit();//等待程序执行完退出进程
  38. p.Close();
  39. }
  40. }
  41. }

使用示例

示例1:显示ipconfig信息
string cmd =@"ipconfig/all";

示例2:打开VS2010命令提示      
string cmd =@"C:&cd C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC&vcvarsall.bat";

示例3:使用sn.exe工具产生密钥对并显示          
string cmd =@"C:&cd C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC&vcvarsall.bat&sn -k d:\LicBase.snk&sn -p d:\LicBase.snk d:\LicBasePubKey.snk&sn -tp d:\LicBasePubKey.snk";

调用
string output = "";
CmdHelper.RunCmd(cmd, out output);
MessageBox.Show(output);

======================

最近做关于Windows Server POP3服务器的小项目,翻遍网络,也没能找到接口。

值得庆幸的是最终发现了一个控制台接口winpop.exe,也就是用cmd命令提示符与POP3服务器交互。

这样实属无奈之举,用cmd命令效率低不说,而且获取、分析返回信息相当麻烦。然而这还不算什么,最主要的是:B/S模式下,网页程序有权限调用cmd吗?
   这里调用cmd,当然不是调用客户机器上的cmd,而是服务器上的cmd,这样心里还有点底。

小心翼翼的在我电脑上做了实验,成功在aspx页面中调用cmd,并执行了ping命令,而且顺利获取、分析返回信息。

于是我满怀信心的把测试程序发布到了服务器上,也是顺利执行!核心代码如下:

  1. using System.Diagnostics;
  2. using System.IO;
  3.  
  4. /// <summary>
  5. /// cmd命令执行助手类
  6. /// </summary>
  7. public class CMDHelper
  8. {
  9. private Process p = null;
  10. private StreamReader reader = null;
  11.  
  12. /// <summary>
  13. /// 通过cmd执行ping命令
  14. /// </summary>
  15. /// <param name="cmdString">命令内容</param>
  16. /// <returns>命令执行结果</returns>
  17. public string execute(string cmdString)
  18. {
  19. ProcessStartInfo start = new ProcessStartInfo("cmd.exe");
  20.  
  21. start.FileName = "ping";
  22. start.Arguments = cmdString;
  23.  
  24. start.CreateNoWindow = true;
  25.  
  26. start.RedirectStandardOutput = true;
  27.  
  28. start.RedirectStandardInput = true;
  29.  
  30. start.UseShellExecute = false;
  31.  
  32. start.WorkingDirectory = "C:\\WINDOWS\\system32";
  33.  
  34. p = Process.Start(start);
  35.  
  36. reader = p.StandardOutput;
  37.  
  38. string line = "";
  39. string lineTemp = "";
  40.  
  41. //逐行读出返回的数据,并做一定处理,方便解析
  42. while (!reader.EndOfStream)
  43. {
  44. lineTemp = reader.ReadLine();//读出一行
  45. //将空行用*号表示
  46. if (lineTemp == "")
  47. {
  48. line += "*";
  49. }
  50. else
  51. {
  52. line += lineTemp;
  53. }
  54. }
  55.  
  56. return line;
  57. }
  58. }

可是高兴的太早了,当我把start.FileName= "ping";改成start.FileName = "winpop";,也就是执行winpop命令,这时候无情的返回了“拒绝访问”。

分析一下,是什么拒绝访问了?刚刚已经成功执行了ping,说明访问cmd的权限是有的,执行的ping命令实际上是利用cmd.exe调用了ping.exe,这说明访问ping.exe的权限也是有的。而现在换成winpop命令,却出现了拒绝访问,说明我们没有权限访问winpop.exe!

这下该怎么办呢?首先想到的就是修改winpop.exe的访问权限,右击winpop.exe(在Windows/System32文件夹下),点击【属性】---【安全】选项卡,在用户中加入当前用户,还是拒绝;加入ASP.NET用户,还是拒绝;最后急了,加上Everyone用户,依然拒绝!看来这种方法没有作用。

再冷静的分析一下,这肯定是权限问题引起的。那么这个权限究竟在哪限制了?

别忘了,我们的程序是运行在IIS中的,所有的生杀大权,都由IIS掌握,权限是不是在这里呢?

果断google一下,IIS还真有权限,更确切的说,是IIS中的“应用程序池”可以设置权限。接下来就说说如何设置。

先从IIS中找到你的网站,在右键--【属性】中看看使用的应用程序池是哪个,然后【在应用程序池】目录下找到它,右键---【属性】

找到【标识】选项卡,再找到【预定义账户】,在后边的下拉菜单中选择“本地系统”就可以了!

这样一来,你的网站就可以随心所欲的执行cmd命令了,其实不仅仅是执行cmd命令,简直是至高无上的权限!

提醒一下,这样更改的是应用程序池权限,因此所有使用这个应用程序池的网站都有很高的权限,这是相当危险的,还须谨慎使用!!

作为完整的解决方案,还需要提一点。

调用cmd执行命令时,可以指定用户(用户是指系统用户,也就是登录电脑时用的帐号密码),这样也可以获得一定的权限。代码如下:

  1. using System.Diagnostics;
  2. using System.IO;
  3.  
  4. /// <summary>
  5. /// cmd命令执行助手类
  6. /// </summary>
  7. public class CMDHelper
  8. {
  9. private Process p = null;
  10. private StreamReader reader = null;
  11.  
  12. /// <summary>
  13. /// 通过cmd执行ping命令
  14. /// </summary>
  15. /// <param name="cmdString">命令内容</param>
  16. /// <returns>命令执行结果</returns>
  17. public string execute(string cmdString)
  18. {
  19. ProcessStartInfo start = new ProcessStartInfo("cmd.exe");
  20.  
  21. start.FileName = "ping";
  22. start.Arguments = cmdString;
  23.  
  24. start.CreateNoWindow = true;
  25.  
  26. start.RedirectStandardOutput = true;
  27.  
  28. start.RedirectStandardInput = true;
  29.  
  30. start.UseShellExecute = false;
  31.  
  32. start.WorkingDirectory = "C:\\WINDOWS\\system32";
  33.  
  34. start.UserName = "administrator"; //指定用户
  35. //构造用户密码,假定密码为123,必须一个字符一个字符的添加
  36. System.Security.SecureString password = new System.Security.SecureString();
  37. password.AppendChar('');
  38. password.AppendChar('');
  39. password.AppendChar('');
  40. start.Password = password;
  41.  
  42. p = Process.Start(start);
  43.  
  44. reader = p.StandardOutput;
  45.  
  46. string line = "";
  47. string lineTemp = "";
  48.  
  49. //逐行读出返回的数据,并做一定处理,方便解析
  50. while (!reader.EndOfStream)
  51. {
  52. lineTemp = reader.ReadLine();//读出一行
  53. //将空行用*号表示
  54. if (lineTemp == "")
  55. {
  56. line += "*";
  57. }
  58. else
  59. {
  60. line += lineTemp;
  61. }
  62. }
  63.  
  64. return line;
  65. }
  66. }

但是本人在Windows Server2003下测试失败,只要指定用户,网页程序就挂起,直到响应超时,原因未知。

ASP.NET调用cmd命令提示符拒绝访问解决方案的更多相关文章

  1. 在IIS7.5中ASP.NET调用cmd程序拒绝访问决绝方法小记

    前言 昨天利用Github的Webhook实现自动部署站点,其中要调用命令行(cmd.exe)程序执行shell脚本. 在本地测试没有任何问题,部署到服务器之后,发现错误信息:访问拒绝. 问题 没有权 ...

  2. asp.net 调用 WNetAddConnection2 window api 访问被拒绝

    通过Asp.net 程序调用局域网另外一台机器文件,显示拒绝访问,单独编写控制台程序正常. 修改iis 应用程序池标识,为管理员用户即可!!

  3. IE8 环境的 JQuery 中的 $.ajax 拒绝访问---解决方案

    需求是兼容到 IE8. $.ajax 总是请求失败,直接跳转到 error 函数中,报错:拒绝访问. 网上的一些解决方法都试过了还是没有用,比如再请求之前设置 jQuery.support.cors ...

  4. Asp.Net Core中完成拒绝访问功能

    很多时候如果用户没有某个菜单的操作权限的话在页面是不应该显示出来的. @if (SignInManager.IsSignedIn(User) && User.IsInRole(&quo ...

  5. python3.7 pip升级或安装,拒绝访问 解决方案

  6. windows cmd控制台打开和关闭SqlServer 以及 显示发生系统错误5 拒绝访问的解决方案

    打开:net start mssqlserver 关闭:net stop mssqlserver 在dos下输入 net start mssqlserver 显示发生系统错误5 拒绝访问 解决办法,以 ...

  7. [转载]ASP.NET对路径"xxxxx"的访问被拒绝的解决方法小结

    异常详细信息: System.UnauthorizedAccessException: 对路径“D:/temp1/MyTest.txt”的访问被拒绝     在windows 2003下,在运行web ...

  8. C# Process.Kill() 拒绝访问(Access Denied) 的解决方案

    需求:很多时候我们需要后台运行几个Console来不停的计算数据,那么部署到客户服务器后,如果出现突发异常,程序挂掉了,那...? 解决方案:封装了一个对后台运行程序不停监测的功能,如果发现程序有异常 ...

  9. ASP.NET对路径"xxxxx"的访问被拒绝的解决方法小结

    异常详细信息: System.UnauthorizedAccessException: 对路径“D:/temp1/MyTest.txt”的访问被拒绝     在windows 2003下,在运行web ...

随机推荐

  1. C++中的this和Python的self对比

    Python,当实例对象调用函数(函数其实都是属于类空间的)的时候,系统会自动将对象本身传入 函数在定义时的第一个变量一般是self.(但self并不是关键字,用其他名字也可以)         定义 ...

  2. STM32通用定时器原理

    /************************************************************************************************ 转载 ...

  3. DeepFM算法解析及Python实现

    1. DeepFM算法的提出 由于DeepFM算法有效的结合了因子分解机与神经网络在特征学习中的优点:同时提取到低阶组合特征与高阶组合特征,所以越来越被广泛使用. 在DeepFM中,FM算法负责对一阶 ...

  4. ubuntu下安装搜狗输入法

    1.如果系统中未安装依赖fcitx,libssh2-1,或者依赖fcitx,libssh2-1的版本低的话,则需提前安装或者升级,否则安装输入法时会出错 安装命令 sudo apt-get insta ...

  5. ScreenToGif 代码分析

    ScreenToGif项目由四个文件夹组成: Files 存放协议文件 GifRecorder 存放gif编码器代码 ScreenToGif 存放主代码 Other 存放Hooktest和Transl ...

  6. JDBC详解系列(一)之流程

    ---[来自我的CSDN博客](http://blog.csdn.net/weixin_37139197/article/details/78838091)--- JDBC概述   使用JDBC也挺长 ...

  7. 【Orleans开胃菜系列2】连接Connect源码简易分析

    [Orleans开胃菜系列2]连接Connect源码简易分析 /** * prism.js Github theme based on GitHub's theme. * @author Sam Cl ...

  8. 《Effective Java》 学习笔记 —— 并发

    <Effective Java>第二版学习笔记之并发编程. 第66条 同步访问共享的可变数据 * 关键字synchronized可以保证在同一时刻只有一个线程可以执行某个方法或代码块. * ...

  9. Android几行代码实现监听微信聊天

    原创作品,转载请注明出处,尊重别人的劳动果实. 2017.2.7更新: *现在适配微信版本更加容易了,只需要替换一个Recourse-ID即可 *可以知道对方发的是小视频还是语音,并获取秒数. *可以 ...

  10. 快速定位iOS线上BUG在哪个控制器崩溃

    快速定位iOS线上App崩溃在哪个控制器里面,需要和后台配合使用 下载本SDK并手动添加到项目里 新建所有的页面都继承于YZViewController 在AppDelegate的didFinishL ...