我可以从C#类库执行dos命令吗?

时间:2011-04-13 08:55:23

标签: c# class iis module

我必须执行一个IIS模块,阻止对没有来自某个CA的证书的用户的访问。 我做了CTL证书信任列表。我使用netsh http add sslcert ip ....测试它,它的工作原理。 现在我所要做的就是在c#类库中实现netsh的调用。 我试着用:

        Process pnet = new Process();
        pnet.StartInfo.FileName = "netsh";
        pnet.StartInfo.Arguments = "http delete sslcert ipport=0.0.0.0:443";
        pnet.StartInfo.UseShellExecute = false;
        pnet.StartInfo.CreateNoWindow = true;
        pnet.Start();
        pnet.Close();

这适用于C#控制台应用程序,但在C#库类中,无法启动。

       namespace IISproject
       {
       public class MyModule : IHttpModule
       {
       #region IHttpModule Members
       public void Dispose()
       { 
       }
       public void Init(HttpApplication context)
       {
       context.PreRequestHandlerExecute += new EventHandler(OnPreRequestHandlerExecute);
    }
    #endregion
    public void OnPreRequestHandlerExecute(Object source, EventArgs e)
    {
        HttpApplication app = (HttpApplication)source;
        HttpRequest request = app.Context.Request;
        if (!String.IsNullOrEmpty(request.Headers["Referer"]))
        {
            throw new HttpException(403,
                                                    "Uh-uh!");
        }
        Process pnet = new Process();
        pnet.StartInfo.FileName = "netsh";
        pnet.StartInfo.Arguments = "http delete sslcert ipport=0.0.0.0:443";
        pnet.StartInfo.UseShellExecute = false;
        pnet.StartInfo.CreateNoWindow = true;
        pnet.Start();
        pnet.Close(); 
    }
}

我做错了什么?10x

2 个答案:

答案 0 :(得分:1)

我书中这类情况的第一个嫌疑人,缺席细节,是某种路径问题。尝试完全限定命令路径,看看它是否有效。

pnet.StartInfo.FileName = Environment.SystemDirectory + @"\netsh.exe"; // or something like that
但是,我会对这种方式调用外部命令的一般模式持谨慎态度,但是既然你提供了文件名及其参数,那么它应该是一个相当安全的事情。如果您有时间,但尚未这样做,您可能需要查看是否有API可以执行您想要的操作。有机会; netsh可能不是magic

答案 1 :(得分:1)

  

我做错了什么?10x

我会说:你没有足够的关心安全。 显然IIS不会产生任何奇怪的应用程序。您需要在配置为以具有启动该进程的权限的用户身份运行的应用程序池中运行它。

您可能会从Windows集成身份验证中获得好处;这样,登录Web服务器的用户将隐含地确定启动该进程的权限。

那就是说,你会更好地利用原生API(ADSI,WMI?)来实现目标