我正在运行一个应该在服务器上启动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之间有什么不同? (相同的用户上下文)
非常感谢!
答案 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。