使用Invoke-Command进行远程PowerShell调用不适用于ASP.NET

时间:2014-06-16 12:17:43

标签: c# asp.net powershell invoke-command

以下命令在直接从powershell调用时有效,但在ASP.NET应用程序中调用时则无效。

Invoke-Command -ComputerName remotesrv -ScriptBlock { 5 }

我想,存在某种用户权限问题,但此时我陷入困境,并且不知道如何解决这个问题。

ASP.NET代码如下所示:

System.Threading.Tasks.Task.Factory.StartNew(() =>
    {
        using (PowerShell powershell = PowerShell.Create())
        {
            var rs = "-ComputerName remotesrv";
            powershell.AddScript("Set-ExecutionPolicy RemoteSigned");
            var script = String.Format("Invoke-Command {0} -scriptblock {{ 5 }}", rs);
            powershell.AddScript(script);

            powershell.InvocationStateChanged += delegate(object sender, PSInvocationStateChangedEventArgs e)
            {
                if (e.InvocationStateInfo.State == PSInvocationState.Completed)
                {
                    // Clean up
                }
            };

            var output = new PSDataCollection<PSObject>();
            output.DataAdded += delegate(object sender, DataAddedEventArgs e)
            {
                PSDataCollection<PSObject> myp = (PSDataCollection<PSObject>)sender;
                Collection<PSObject> results = myp.ReadAll();
                foreach (PSObject result in results)
                {
                    if (result.BaseObject is int)
                    {
                        // Do something in the database
                    }
                }
            };

            IAsyncResult asyncResult = powershell.BeginInvoke<PSObject, PSObject>(null, output);
            asyncResult.AsyncWaitHandle.WaitOne();
        }
    }
);

如果我不添加-ComputerName remotesrv,则会执行该脚本。

您需要做什么才能从ASP.NET应用程序远程调用powershell脚本?

2 个答案:

答案 0 :(得分:0)

我建议您仔细阅读Powershell remoting requirements用户权限部分。默认情况下,创建连接的帐户必须是远程计算机上的管理员。如果您的Web应用程序在远程计算机上不是管理员的标识下运行,则连接将失败。请注意,这是默认行为,可以通过调整远程计算机上的session configurations来更改。

答案 1 :(得分:0)

我遇到了同样的问题,我的解决方案是更改执行IIS应用程序池的用户。 设置Enable-PsRemoting -Force和Set-ExecutionPolicy Unrestricted后,(或许最好离开ExecutionPolicy RemoteSigned),invoke-command仍然不起作用。 然后我转到任务管理器,进程选项卡并查看w3wp.exe,正在执行该进程的用户是“DefaultAppPool”,我猜这个用户没有权限在PowerShell上远程访问或执行。 (图片显示Administrador,因为我已经更改了它)

enter image description here

要更改用户,请转到IIS管理器,在应用程序组中,我的站点的应用程序组显示在Identity:ApplicationPoolIdentity中,选择应用程序池并单击“高级设置”,在“处理模型”中选择“标识”,然后单击省略号(带有三个点)。在个人帐户中设置具有用户名和密码的管理员帐户,重新启动IIS。

enter image description here

如果我按任务管理器查看,则iis用户已更改