IIS模拟调用powershell线程?

IIS模拟调用powershell线程?,powershell,iis,Powershell,Iis,我刚开始学习IIS,我正在尝试使用IIS托管一个应用程序以模拟管理用户,然后以管理员身份执行powershell命令以将用户添加到本地组 在ASP.NET代码中,我正在运行以下程序: private string RunScript() { StringBuilder stringBuilder = new StringBuilder(); PowerShell psExec = PowerShell.Create();

我刚开始学习IIS,我正在尝试使用IIS托管一个应用程序以模拟管理用户,然后以管理员身份执行powershell命令以将用户添加到本地组

在ASP.NET代码中,我正在运行以下程序:

private string RunScript()
        {
            StringBuilder stringBuilder = new StringBuilder();

            PowerShell psExec = PowerShell.Create();
            psExec.AddCommand(SCRIPT_LOCATION);
            psExec.AddParameter("username",Username.Text);
            psExec.AddParameter("computer", Computer.Text);
            psExec.AddParameter("group", Group.Text);

            Collection<PSObject> results;

            stringBuilder.AppendLine(System.Security.Principal.WindowsIdentity.GetCurrent().Name);

            results = psExec.Invoke();
            //errors = psExec.Streams.Error.ReadAll();
            foreach (PSObject result in results)
            {
                stringBuilder.AppendLine(result.ToString());
            }
            return stringBuilder.ToString();
        }
返回我是NT Authority\System

在我的IIS中:
应用程序池标识是“本地系统”
身份验证设置已启用ASP.NET模拟(其中管理员用户设置为特定用户
已启用Windows身份验证

所以,当我尝试将用户添加到组中时,我得到“访问被拒绝”。作为一个理智的检查,我已经确认,如果我以管理员的身份单独运行powershell脚本,则add可以正常工作

我确信这是我所缺少的一些基本的东西,但如果有人能提供任何建议或指导,我将不胜感激


谢谢您的时间。

据我所知,
psExec.Invoke()
方法创建了一个名为“Pipeline Execution thread”的线程,并在这个新线程中执行命令/脚本。默认情况下,模拟令牌不会跨线程流动,因此“管道执行线程”不会获取调用线程的模拟令牌

您可以使用ASP.config文件中的“alwaysFlowImpersonationPolicy”和“legacyImpersonationPolicy”配置元素将ASP.Net配置为将模拟令牌流到新创建的线程,如下所示:

            <runtime>

                         <legacyImpersonationPolicy enabled=”false”/>

                         <alwaysFlowImpersonationPolicy enabled=”true”/>

           </runtime>



据我所知,
psExec.Invoke()
方法创建了一个名为“Pipeline Execution thread”的线程,并在这个新线程中执行命令/脚本。默认情况下,模拟令牌不会跨线程流动,因此“管道执行线程”不会获取调用线程的模拟令牌

您可以使用ASP.config文件中的“alwaysFlowImpersonationPolicy”和“legacyImpersonationPolicy”配置元素将ASP.Net配置为将模拟令牌流到新创建的线程,如下所示:

            <runtime>

                         <legacyImpersonationPolicy enabled=”false”/>

                         <alwaysFlowImpersonationPolicy enabled=”true”/>

           </runtime>



不应使用。将应用程序池标识更改为管理员。谢谢您的回答。因此,我尝试从web.config中删除,并将应用程序池标识设置为admin。现在,当powershell脚本运行时,我收到NullReferenceException。这对我来说似乎很奇怪,当我使用相同的参数运行脚本时,它会毫无问题地完成。为什么从IIS运行脚本时会发生此异常?另外,我注意到脚本实际上起了作用,添加了用户。但我被引导到“/”应用程序“页面中的服务器错误。不应使用
。将应用程序池标识更改为管理员。谢谢您的回答。因此,我尝试从web.config中删除,并将应用程序池标识设置为admin。现在,当powershell脚本运行时,我收到NullReferenceException。这对我来说似乎很奇怪,当我使用相同的参数运行脚本时,它会毫无问题地完成。为什么从IIS运行脚本时会发生此异常?另外,我注意到脚本实际上起了作用,添加了用户。但我被引导到“应用程序“/”中的服务器错误”页面。谢谢您的回答!因此,我尝试按照您的建议更新aspnet.config文件,然后从IIS重新启动。这篇文章说要回收应用程序池,所以我也这么做了。不幸的是,我仍然看到同样的问题。是否有一个步骤来确保我的应用程序池正确拾取aspnet.config文件?请告诉我您现在使用的是哪种版本的asp.net?根据HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\net Framework Setup\NDP\v4,版本为4.8.03761。C:\Windows\Microsoft.NET\Framework\v2.0.50727和…\v4.0.30319中有aspnet.config文件,但我也尝试编辑了这两个配置文件。谢谢您的回答!因此,我尝试按照您的建议更新aspnet.config文件,然后从IIS重新启动。这篇文章说要回收应用程序池,所以我也这么做了。不幸的是,我仍然看到同样的问题。是否有一个步骤来确保我的应用程序池正确拾取aspnet.config文件?请告诉我您现在使用的是哪种版本的asp.net?根据HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\net Framework Setup\NDP\v4,版本为4.8.03761。C:\Windows\Microsoft.NET\Framework\v2.0.50727和…\v4.0.30319中有aspnet.config文件,但我也尝试编辑这两个配置文件。
            <runtime>

                         <legacyImpersonationPolicy enabled=”false”/>

                         <alwaysFlowImpersonationPolicy enabled=”true”/>

           </runtime>