ASP.NET调用cmd命令提示符拒绝访问解决方案
using System.Diagnostics;
public class CmdHelper
{
private static string CmdPath = @"C:\Windows\System32\cmd.exe"; /// <summary>
/// 执行cmd命令
/// 多命令请使用批处理命令连接符:
/// <![CDATA[
/// &:同时执行两个命令
/// |:将上一个命令的输出,作为下一个命令的输入
/// &&:当&&前的命令成功时,才执行&&后的命令
/// ||:当||前的命令失败时,才执行||后的命令]]>
/// 其他请百度
/// </summary>
/// <param name="cmd"></param>
/// <param name="output"></param>
public static void RunCmd(string cmd, out string output)
{
cmd = cmd.Trim().TrimEnd('&') + "&exit";//说明:不管命令是否成功均执行exit命令,否则当调用ReadToEnd()方法时,会处于假死状态
using (Process p = new Process())
{
p.StartInfo.FileName = CmdPath;
p.StartInfo.UseShellExecute = false; //是否使用操作系统shell启动
p.StartInfo.RedirectStandardInput = true; //接受来自调用程序的输入信息
p.StartInfo.RedirectStandardOutput = true; //由调用程序获取输出信息
p.StartInfo.RedirectStandardError = true; //重定向标准错误输出
p.StartInfo.CreateNoWindow = true; //不显示程序窗口
p.Start();//启动程序 //向cmd窗口写入命令
p.StandardInput.WriteLine(cmd);
p.StandardInput.AutoFlush = true; //获取cmd窗口的输出信息
output = p.StandardOutput.ReadToEnd();
p.WaitForExit();//等待程序执行完退出进程
p.Close();
}
}
}
使用示例
示例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命令,而且顺利获取、分析返回信息。
于是我满怀信心的把测试程序发布到了服务器上,也是顺利执行!核心代码如下:
using System.Diagnostics;
using System.IO; /// <summary>
/// cmd命令执行助手类
/// </summary>
public class CMDHelper
{
private Process p = null;
private StreamReader reader = null; /// <summary>
/// 通过cmd执行ping命令
/// </summary>
/// <param name="cmdString">命令内容</param>
/// <returns>命令执行结果</returns>
public string execute(string cmdString)
{
ProcessStartInfo start = new ProcessStartInfo("cmd.exe"); start.FileName = "ping";
start.Arguments = cmdString; start.CreateNoWindow = true; start.RedirectStandardOutput = true; start.RedirectStandardInput = true; start.UseShellExecute = false; start.WorkingDirectory = "C:\\WINDOWS\\system32"; p = Process.Start(start); reader = p.StandardOutput; string line = "";
string lineTemp = ""; //逐行读出返回的数据,并做一定处理,方便解析
while (!reader.EndOfStream)
{
lineTemp = reader.ReadLine();//读出一行
//将空行用*号表示
if (lineTemp == "")
{
line += "*";
}
else
{
line += lineTemp;
}
} return line;
}
}
可是高兴的太早了,当我把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执行命令时,可以指定用户(用户是指系统用户,也就是登录电脑时用的帐号密码),这样也可以获得一定的权限。代码如下:
using System.Diagnostics;
using System.IO; /// <summary>
/// cmd命令执行助手类
/// </summary>
public class CMDHelper
{
private Process p = null;
private StreamReader reader = null; /// <summary>
/// 通过cmd执行ping命令
/// </summary>
/// <param name="cmdString">命令内容</param>
/// <returns>命令执行结果</returns>
public string execute(string cmdString)
{
ProcessStartInfo start = new ProcessStartInfo("cmd.exe"); start.FileName = "ping";
start.Arguments = cmdString; start.CreateNoWindow = true; start.RedirectStandardOutput = true; start.RedirectStandardInput = true; start.UseShellExecute = false; start.WorkingDirectory = "C:\\WINDOWS\\system32"; start.UserName = "administrator"; //指定用户
//构造用户密码,假定密码为123,必须一个字符一个字符的添加
System.Security.SecureString password = new System.Security.SecureString();
password.AppendChar('');
password.AppendChar('');
password.AppendChar('');
start.Password = password; p = Process.Start(start); reader = p.StandardOutput; string line = "";
string lineTemp = ""; //逐行读出返回的数据,并做一定处理,方便解析
while (!reader.EndOfStream)
{
lineTemp = reader.ReadLine();//读出一行
//将空行用*号表示
if (lineTemp == "")
{
line += "*";
}
else
{
line += lineTemp;
}
} return line;
}
}
但是本人在Windows Server2003下测试失败,只要指定用户,网页程序就挂起,直到响应超时,原因未知。
ASP.NET调用cmd命令提示符拒绝访问解决方案的更多相关文章
- 在IIS7.5中ASP.NET调用cmd程序拒绝访问决绝方法小记
前言 昨天利用Github的Webhook实现自动部署站点,其中要调用命令行(cmd.exe)程序执行shell脚本. 在本地测试没有任何问题,部署到服务器之后,发现错误信息:访问拒绝. 问题 没有权 ...
- asp.net 调用 WNetAddConnection2 window api 访问被拒绝
通过Asp.net 程序调用局域网另外一台机器文件,显示拒绝访问,单独编写控制台程序正常. 修改iis 应用程序池标识,为管理员用户即可!!
- IE8 环境的 JQuery 中的 $.ajax 拒绝访问---解决方案
需求是兼容到 IE8. $.ajax 总是请求失败,直接跳转到 error 函数中,报错:拒绝访问. 网上的一些解决方法都试过了还是没有用,比如再请求之前设置 jQuery.support.cors ...
- Asp.Net Core中完成拒绝访问功能
很多时候如果用户没有某个菜单的操作权限的话在页面是不应该显示出来的. @if (SignInManager.IsSignedIn(User) && User.IsInRole(&quo ...
- python3.7 pip升级或安装,拒绝访问 解决方案
- windows cmd控制台打开和关闭SqlServer 以及 显示发生系统错误5 拒绝访问的解决方案
打开:net start mssqlserver 关闭:net stop mssqlserver 在dos下输入 net start mssqlserver 显示发生系统错误5 拒绝访问 解决办法,以 ...
- [转载]ASP.NET对路径"xxxxx"的访问被拒绝的解决方法小结
异常详细信息: System.UnauthorizedAccessException: 对路径“D:/temp1/MyTest.txt”的访问被拒绝 在windows 2003下,在运行web ...
- C# Process.Kill() 拒绝访问(Access Denied) 的解决方案
需求:很多时候我们需要后台运行几个Console来不停的计算数据,那么部署到客户服务器后,如果出现突发异常,程序挂掉了,那...? 解决方案:封装了一个对后台运行程序不停监测的功能,如果发现程序有异常 ...
- ASP.NET对路径"xxxxx"的访问被拒绝的解决方法小结
异常详细信息: System.UnauthorizedAccessException: 对路径“D:/temp1/MyTest.txt”的访问被拒绝 在windows 2003下,在运行web ...
随机推荐
- 2017-2018 Exp3 MAL_免杀原理与实践 20155214
目录 Exp3 MAL_免杀原理与实践 实验内容 对msf生成后门程序的检测 Veil-Evasion应用 Visual Studio2017 + shellcode生成后门 主要思路 知识点 最后的 ...
- 20155334 网络对抗PC平台逆向破解(二)
注入Shellcode并运行攻击 shellcode就是一段机器指令(code) 通常这段机器指令的目的是为获取一个交互式的shell(像linux的shell或类似windows下的cmd.exe) ...
- 微信小程序 Echarts 异步数据更新
微信小程序 Echarts 异步数据更新的练习,被坑了很多次,特作记录. 作者:罗兵 地址:https://www.cnblogs.com/hhh5460/p/9989805.html 0.效果图 ...
- mysql提示Fatal error: Can't open and lock privilege tables: Table 'mysql.host' doesn't exist解决方法
一次重启mysql发现无法启动成功,通过检查mysql日志发现问题并解决了问题. mysql启动失败的日志: [root@nn ~]# tail -n 20 /var/log/mysqld.log 1 ...
- CS50.4
1, PDF,portable document format 便携式文档格式 2, 关于文本编辑器(文字编辑器)和文档编辑器(文字处理器),前者可用来写程序的源代码?名字挺难分辨的. *3, “-o ...
- Partition4:增加分区
在关系型 DB中,分区表经常使用DateKey(int 数据类型)作为Partition Column,每个月的数据填充到同一个Partition中,由于在Fore-End呈现的报表大多数是基于Mon ...
- Synchronous/Asynchronous:任务的同步异步,以及asynchronous callback异步回调
两个线程执行任务有同步和异步之分,看了Quora上的一些问答有了更深的认识. When you execute something synchronously, you wait for it to ...
- flask_admin 笔记四 自定义视图
定义自己的视图 对于您的要求非常具体的情况,您很难用内置的ModelView类来满足这些需求,Flask-Admin使您可以轻松地完全控制并将自己的视图添加到界面中. 1)独立视图 可以通过扩展Bas ...
- cadence allegro 封装原点修改
打开 dra文件后 在菜单栏 setup - change drawing origin 在命令栏输入 新的参考点位置 如想更改新坐标位置为 1,2 .输入 x 1 2
- proe工程图输出dwg/dxf文件设置
网上看到不少人分享proe转转dxf/dwg配置文件的,但是看了一圈,几乎都没有涉及到转化线型的,所以自己整理自己的配置文件,写在这里分享出来. 以Pro/engineer WF5.0为例: 1.复制 ...