从ASP.NET启动进程

时间:2011-12-08 12:52:15

标签: asp.net windows iis-7 powershell iis-7.5

我正在运行一个应该在服务器上启动ASP的{​​{1}} Web应用程序。要运行此Powershell script,需要许多域权限。所以我在拥有所有权限的用户下运行apppool。 但是,当我开始使用powershellscript时,我总是得到拒绝访问权限。

有没有人知道如何解决问题?

当我按照描述启动流程时,流程是在应用程序池的usercontext下运行还是在ASP.NET Web应用程序中登录的用户的usercontext下运行?

我试过两种方法 1。

Powershell script

2

string cmdArg = "C:\\Scripts\\test.ps1 " + username;
            Runspace runspace = RunspaceFactory.CreateRunspace();
            runspace.Open();
            Pipeline pipeline = runspace.CreatePipeline();

            pipeline.Commands.AddScript(cmdArg);
            pipeline.Commands[0].MergeMyResults(PipelineResultTypes.Error, PipelineResultTypes.Output);
            Collection<PSObject> results = pipeline.Invoke();
            runspace.Close();

            StringBuilder stringBuilder = new StringBuilder();
            foreach (PSObject obj in results)
            {
                stringBuilder.AppendLine(obj.ToString());
              string test =  Environment.UserName;
            }
            return results[0].ToString();

好的,您认为使用这些超级权限运行Apppool并非最佳做法。

如何在两者之间放置Web服务? web服务是在appdomain中,只能从localhost访问?

更新 好的,我写了一个asp.net webservice。 Web服务在具有所有权限的应用程序池中运行,但只能从localhost访问。 Web服务包含启动脚本的代码。 ASP MVC3 Web应用程序在几乎没有权限的应用程序池中运行。 但是当webmethod被执行时,我总是会收到一个错误,告诉我,我没有权利。我试图在webconfig中设置impersonate为false,但没有成功。

有谁知道如何解决这个问题?

更新

当我从webservice启动时,我已经读出了执行powershell的当前用户。我说这是用户拥有所有权利。但是ps会抛出错误,例如:你无法启动一个值为null的方法。

然后我尝试使用runsas作为低级别用户运行ps。我得到了同样的错误。

然后我尝试使用与webservice中相同的用户运行ps,一切正常!

有没有人可以解释这种现象? 我上面的代码和runas之间有什么不同? (相同的用户上下文)

非常感谢!

2 个答案:

答案 0 :(得分:0)

我认为这仅取决于模拟设置,如果启用了模拟,则使用当前登录的用户,否则使用应用池用户

答案 1 :(得分:0)

在HTTP请求中启动新进程对性能不是很好,也可能存在安全风险。但是,在ASP.NET和其他现代Web服务器可用之前,提供内容(除静态文件之外)的唯一方法是在单独的进程中执行程序。

执行此操作的API称为Common Gateway Interface (CGI),但仍受IIS支持。如果配置正确,您可以在每个请求上执行程序。

我不确定您是否可以使用CGI执行脚本,但是您可以创建一个ISAPI过滤器,该过滤器将对扩展名为.ps1的文件执行PowerShell。这基本上是在请求扩展名为php.exe的文件时,在新进程中执行.php的方式。

启用可执行内容可以而且应该在逐个文件夹的基础上完成,以限制安全风险。一般来说,你应该避免混合不同种类的内容,即。不应该同时查看脚本并执行它。

如果你的目的是能够远程运行PowerShell脚本而不是其他很多东西,那么在PowerShell中编写一个小型HTTP服务器也应该很容易从等式中完全删除IIS和ASP.NET。