【问题标题】:Starting Process from ASP.NET从 ASP.NET 启动过程
【发布时间】:2011-12-08 12:52:14
【问题描述】:

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

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

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

我试过两种方法 1.

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

2.

string cmdArg = "C:\\Scripts\\test.ps1 " + username;
Process myProcess = new Process();
          ProcessStartInfo myProcessStartInfo = new ProcessStartInfo("powershell.exe",cmdArg);

            myProcessStartInfo.UseShellExecute = false;
            myProcessStartInfo.RedirectStandardOutput = true;
            myProcess.StartInfo = myProcessStartInfo;

            myProcess.Start();
            StreamReader myStreamReader = myProcess.StandardOutput;
            myProcess.WaitForExit();
            string myString = myStreamReader.ReadLine();

            return myString;

好的,您认为使用这些大权限运行 Apppool 并不是最佳做法。

在两者之间放置一个网络服务怎么样? Web 服务位于只能从 localhost 访问的 appdomain 中?

更新 好的,我已经编写了一个 asp.net 网络服务。 Web 服务在具有所有权限的应用程序池中运行,但只能从 localhost 访问。 Web 服务包含启动脚本的代码。 ASP MVC3 web 应用程序在几乎没有权限的应用程序池中运行。 但是当执行 webmethod 时,我总是得到一个错误,告诉我,我没有足够的权限。我尝试将 webconfig 中的模拟设置为 false,但没有成功。

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

更新:

当我从 web 服务启动它时,我已经读出了执行 powershell 的当前用户。我说拥有所有权利的是用户。但是 ps 会抛出类似的错误:你不能启动一个值为 null 的方法。

然后我尝试以低级别用户的身份使用 runas 运行 ps。我得到了同样的错误。

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

有没有人能解释一下这个现象? 我上面的代码和runas有什么不同? (相同的用户上下文)

非常感谢!

【问题讨论】:

  • 如果这是一个生产网站,我真的不会这样做。您正在引入一个巨大的安全漏洞,并且可能还存在性能/可用性问题。就我个人而言,我会创建一个单独的服务或其他东西,然后可以根据某些事件(例如 Web 应用程序将一行插入数据库)来工作。
  • 你能发布你用来启动这个过程的代码吗?默认情况下,除非您打开了模拟,否则该进程应作为应用程序池正在运行的进程运行。还要检查机器上的事件日志,因为您可能会在那里看到访问被拒绝错误以及用户。
  • 感谢您的 cmets,我已经更新了我的问题!

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


【解决方案1】:

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

用于执行此操作的 API 称为 Common Gateway Interface (CGI),并且仍然受 IIS 支持。如果配置正确,您可以对每个请求执行一个程序。

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

可以而且应该逐个文件夹地启用可执行内容以限制安全风险。一般来说,您应该避免混合不同类型的内容,即。不能既查看脚本又执行它。

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

【讨论】:

  • 非常感谢您的详细解答!我想使用 web 服务和 IIS,因为里面有更多的功能。我又更新了我的问题。
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-08-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-04
    • 2010-09-26
    • 2011-10-14
    • 1970-01-01
    相关资源
    最近更新 更多