以下命令在直接从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脚本?
答案 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,因为我已经更改了它)
要更改用户,请转到IIS管理器,在应用程序组中,我的站点的应用程序组显示在Identity:ApplicationPoolIdentity中,选择应用程序池并单击“高级设置”,在“处理模型”中选择“标识”,然后单击省略号(带有三个点)。在个人帐户中设置具有用户名和密码的管理员帐户,重新启动IIS。
如果我按任务管理器查看,则iis用户已更改