2011-04-13 99 views
0

我必须做一个IIS模块,阻止访问没有来自某个CA的证书的用户。 我做了一个CTL-证书信任列表。我使用netsh http add sslcert ip ....测试了它,它工作正常。 现在我所要做的就是在c#类库中实现netsh的调用。 我tryed使用方法:我可以从C#类库执行一个dos命令吗?

 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(); 
    } 
} 

我到底做错了什么?10倍

+0

“不启动”:你得到任何错误? (请参阅eventlog也许?)。请注意,控制台应用程序将运行在您的帐户下,而aspnet运行在低特权帐户下 - 这可能是您的问题。 – 2011-04-13 09:08:19

回答

1

在这些种在我的书的情况下,缺乏细节首先怀疑,是某种路径问题。尝试完全限定命令路径,看看它是否更好。

pnet.StartInfo.FileName = Environment.SystemDirectory + @"\netsh.exe"; // or something like that 

我会很谨慎调用外部命令这种方式,虽然一般模式,但是因为你提供两个文件的名称和它的参数,它应该是做一个合理的安全的事情。如果你有时间,而且还没有这样做,你可能需要考虑是否有API来做你想做的事。有机会; netsh可能不是magic

1

我在做什么错了10倍

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

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

这就是说,你会更emplying原生API的更好(?ADSI,WMI)要达到的目标

+0

10x为创意家伙。 我发现了这个问题。首先,我用命令netsh http show sslcert测试了一个c#控制台应用程序。为此,您不需要管理员权限,但对于删除命令,您需要管理员权限。谢谢,谢谢。 所以现在我需要找到一种方法来从C#代码管理模式下运行CMD.exe。 我搜索了一下,发现了runas命令。但它不太适合我,因为它会打开另一个cmd.exe窗口。如果你们有任何想法,请告诉我。 我无法搜索另一个API,这是我需要做的一项任务。 再次10x。 – 2011-04-13 14:59:01

+0

看看windows安全:'模拟'。有一篇文章的代码[在CodeProject上](http://www.codeproject.com/KB/cs/zetaimpersonator.aspx)和[SO Answer](http://stackoverflow.com/questions/559719/windows-模仿从c/559740#559740)报告良好的链接+良好的结果 – sehe 2011-04-13 15:06:34

相关问题