在IIS中执行PowerShell线程作为模拟用户

时间:2015-08-05 10:16:30

标签: c# asp.net powershell iis impersonation

我一直致力于使用Powershell脚本的Web应用程序。出于某种原因,即使使用ASP.NET模拟,我也会在需要提升访问权限的命令上遇到“访问被拒绝”错误。

通过在Windows 2008 R2标准SP1服务器上运行的IIS 7.5部署Web应用程序。

我已检查事件查看器中记录的异常,并注意到在生成的线程中使用的帐户是NETWORK SERVICE帐户:

Network Service Exception

据我所知,这意味着没有将模拟带到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个小时才开始工作。任何帮助将不胜感激。谢谢!

2 个答案:

答案 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中运行应用程序池的用户,请单击“高级设置”,其中有一个名为“流程模型和身份”的部分。