我一直致力于使用Powershell脚本的Web应用程序。出于某种原因,即使使用ASP.NET模拟,我也会在需要提升访问权限的命令上遇到“访问被拒绝”错误。
通过在Windows 2008 R2标准SP1服务器上运行的IIS 7.5部署Web应用程序。
我已检查事件查看器中记录的异常,并注意到在生成的线程中使用的帐户是NETWORK SERVICE帐户:
据我所知,这意味着没有将模拟带到PowerShell cmdlet线程。我确信被模拟的用户应该有权运行脚本,但看起来使用的权限是NETWORK SERVICE帐户的权限,而不是目标。
我也对aspnet.config文件进行了以下更改,正如我读过的一些文章中所建议的那样无效:
<legacyImpersonationPolicy enabled="false"/>
<alwaysFlowImpersonationPolicy enabled="true"/>
以下是ASP NET C#代码片段,以帮助解释我的情况:
//Create Runspace
RunspaceConfiguration psConfig = RunspaceConfiguration.Create();
Runspace psRunspace = RunspaceFactory.CreateRunspace(psConfig);
//Configure runspace to run on the current thread
psRunspace.ApartmentState = System.Threading.ApartmentState.STA;
psRunspace.ThreadOptions = System.Management.Automation.Runspaces.PSThreadOptions.UseCurrentThread;
using (Pipeline psPipeline = psRunspace.CreatePipeline())
{
psRunspace.Open();
psPipeline.Commands.AddScript("C:\\Scripts\\Powershell\\MyScript.ps1");
// Invoke the cmdlet
var results = psPipeline.Invoke();
var builder = new StringBuilder();
foreach (var psObject in results)
{
// Convert the Base Object to a string and append it to the string builder.
// Add \r\n for line breaks
builder.Append(psObject.BaseObject.ToString() + "\r\n");
}
//Display the results
ResultBox.Text = builder.ToString();
我花了最后5个小时才开始工作。任何帮助将不胜感激。谢谢!
答案 0 :(得分:1)
请尝试以下解决方案 - 它适用于SharePoint环境
public ListUsersPS(string searchstring)
{
....
WindowsIdentity identity = WindowsIdentity.GetCurrent();
WindowsImpersonationContext ctx = null;
ctx = identity.Impersonate();
Runspaceconfiguration connectionInfo = Runspaceconfiguration.Create();
...
using (Runspace rsp = Runspacefactory.Createrunspace(connectionInfo))
{
...
}
...
}
答案 1 :(得分:0)
您是否尝试过更改运行IIS进程的用户?
在IIS中,您可以更改运行应用程序池的用户。如果多个应用程序使用相同的应用程序池,请小心。
要更改在IIS中运行应用程序池的用户,请单击“高级设置”,其中有一个名为“流程模型和身份”的部分。