ASP.NET调用cmd命令提示符拒绝访问解决方案

最近做关于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(‘1‘);
        password.AppendChar(‘2‘);
        password.AppendChar(‘3‘);
        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下测试失败,只要指定用户,网页程序就挂起,直到响应超时,原因未知。

时间: 2024-11-04 20:14:19

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

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

需求是兼容到 IE8. $.ajax 总是请求失败,直接跳转到 error 函数中,报错:拒绝访问. 网上的一些解决方法都试过了还是没有用,比如再请求之前设置 jQuery.support.cors = true,并调用 jquery.xdomainrequest.min.js .更改 IE 设置,将通过域访问数据设置为允许.这些方法都试过了,都没有用. 最后是在 $.ajax 运行之前添加如下代码成功的 . jQuery.support.cors = true; jQuery.ajaxSetu

在IIS中ASP.NET调用cmd程序权限不足

问题 在本地代码中调用cmd 显示的路径为C:\Users\用户名> 而在服务器中调用cmd 显示的路径为C:\Windows\system32\inetsrv > 原因 服务器中调用的不是系统的cmd.exe 而是调用C:\Windows\system32\inetsrv 中的appcmd.exe 该工具来配置和查询 Web 服务器上的对象,并以文本或 XML 格式返回输出. 解决方法 创建一个iis用户(Administrator)注:创建的iis用户必须要有密码,还需要为iis用户添加执

无法中止进程无法访问操作拒绝访问

无法中止进程无法访问操作拒绝访问 解决方案:使用360解除占用 任务管理器显示进程路径 找到该进程的路径 右键使用360解除占用 注:此方法有可能会无效,如果谁有更好的方法,请说明,谢谢. 其他方法(在控制台(CMD)窗口通过命令终止),不一定有效 上边的方法显示出进程PID列 打开控制台尝试一下命令(假设908是要结束的PID): Taskkill /PID 908 /F 或者 ntsd –c q –p 908 注:此方法来源于网上,本人尝试无效 GoodLuck

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

异常详细信息: System.UnauthorizedAccessException: 对路径“D:/temp1/MyTest.txt”的访问被拒绝 在windows 2003下,在运行web应用程序的时候出现一下错误: 服务器无法处理请求,-->对路径“C:/temp/mytest.txt”的访问拒绝 说明: 执行当前 Web 请求期间,出现未处理的异常.请检查堆栈跟踪信息,以了解有关该错误以及代码中导致错误的出处的详细信息. 异常详细信息: System.UnauthorizedAccess

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

异常详细信息: System.UnauthorizedAccessException: 对路径"D:/temp1/MyTest.txt"的访问被拒绝 在windows 2003下,在运行web应用程序的时候出现一下错误: 服务器无法处理请求,-->对路径"C:/temp/mytest.txt"的访问拒绝 说明: 执行当前 Web 请求期间,出现未处理的异常.请检查堆栈跟踪信息,以了解有关该错误以及代码中导致错误的出处的详细信息. 异常详细信息: System.

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

需求:很多时候我们需要后台运行几个Console来不停的计算数据,那么部署到客户服务器后,如果出现突发异常,程序挂掉了,那...? 解决方案:封装了一个对后台运行程序不停监测的功能,如果发现程序有异常,但是进程还在,这个时候就Kill掉这个进程,重启后台计算程序,这里的计算程序均为"控制台运行程序". 代码如下: if (进程是否挂掉) { // 获取所有进程 Process[] ps = Process.GetProcesses(); for (int i = 0; i < p

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

需求:很多时候我们需要后台运行几个Console来不停的计算数据,那么部署到客户服务器后,如果出现突发异常,程序挂掉了,那...? 解决方案:封装了一个对后台运行程序不停监测的功能,如果发现程序有异常,但是进程还在,这个时候就Kill掉这个进程,重启后台计算程序,这里的计算程序均为"控制台运行程序". 代码如下: if (进程是否挂掉) { // 获取所有进程 Process[] ps = Process.GetProcesses(); for (int i = 0; i < p

C#如何调用以管理员身份运行的cmd命令提示符

windows自从vista.win7.win8/8.1以及win10以来,命令行提示符分为两种模式,一种是普通用户模式,一种的管理员模式,很多情况下,我们的程序需要在命令提示符(管理员身份)的状况下运行,但是c#调用的时候一般都是普通用户的cmd命令,虽然可以通过右键 - 以管理员身份运行该软件,但是我们用c#开发的软件,不能告诉每一个用户让他们都以管理员身份运行吧?今天亦是美网络就给大家介绍一个简单的方法,轻松实现c#调用以管理员身份运行的命令提示符. 笔者的环境:win8.1专业版 64位

Android的debug.keystore拒绝访问导致的生成异常及解决方案

构建Android应用程序的时候输出异常:[apkbuilder] keytool 错误: java.io.FileNotFoundException: C:\Users\my\.android\debug.keystore(拒绝访问.)导致BUILD FAILED. 异常原因: Android要求所有的应用程序必须有签名,否则就不会安装该程序.而在我们开发过程中,默认生成和使用debug.keystore(所以平时根本不会注意有这么个玩意),debug.keystore默认有效期为一年,换句话