我正在尝试从 ASP.NET CORE C# WebAPI 运行 PowerShell 脚本。请参阅以下环境详细信息:
.NET SDKs installed:
3.1.403 [C:\Program Files\dotnet\sdk]
7.0.200 [C:\Program Files\dotnet\sdk]
7.0.201 [C:\Program Files\dotnet\sdk]
7.0.306 [C:\Program Files\dotnet\sdk]
7.0.400 [C:\Program Files\dotnet\sdk]
8.0.100-preview.3.23178.7 [C:\Program Files\dotnet\sdk]
8.0.101 [C:\Program Files\dotnet\sdk]
API 在 .NET 7 上运行:这里是 .csproj 文件
<Project Sdk="Microsoft.NET.Sdk.Web">
<PropertyGroup>
<TargetFramework>net7.0</TargetFramework>
<Nullable>enable</Nullable>
<ImplicitUsings>enable</ImplicitUsings>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Microsoft.PowerShell.SDK" Version="7.3.9" />
</ItemGroup>
API代码:
using System.Diagnostics;
using System.Management.Automation;
using System.Management.Automation.Runspaces;
public static ScriptResult Run2(string filePath, Dictionary<string,string> parameters)
{
string myScript = File.ReadAllText(filePath);
ScriptResult scriptResult = new ScriptResult();
using (System.Management.Automation.PowerShell ps = System.Management.Automation.PowerShell.Create())
{
ps.AddScript(myScript);
foreach (var kvp in parameters)
{
ps.AddParameter(kvp.Key, kvp.Value);
}
var result = ps.Invoke();
if (ps.HadErrors)
{
string errorMessage = "";
foreach (var error in ps.Streams.Error)
{
errorMessage += error.ToString() + "\n"; <-- This is where I am getting the error message
}
throw new Exception(errorMessage);
}
foreach (var PSObject in result)
{
var x = PSObject.ToString();
}
}
return scriptResult;
}
Get-ExecutionPolicy -List 的输出
Scope ExecutionPolicy
----- ---------------
MachinePolicy Undefined
UserPolicy Undefined
Process Undefined
CurrentUser Unrestricted
LocalMachine Bypass
注意:该脚本包含以下行:
Import-Module MicrosoftTeams
##script to get token##
Connect-MicrosoftTeams -AccessTokens @("$graphToken", "$teamsToken") | Out-Null
$getUserSettings = Get-CSOnlineUser -Identity $UserEmail -ErrorAction 'stop'
$output = @{
UserConfig = $getUserSettings
}
$output | ConvertTo-JSON
Write-Output $output
出现错误:
无法加载文件 C:\Program Files\WindowsPowerShell\Modules\MicrosoftTeams .5.0\MicrosoftTeams.psm1,因为在此系统上禁用运行脚本。有关详细信息,请参阅 about_Execution_Policies,网址为 https://go.microsoft.com/fwlink/?LinkID=135170。
ASP.Net Web 应用程序几乎肯定以 不同用户 的身份运行,因此它的
CurrentUser
范围可能是 Undefined
,这与 Windows 上的 Restricted
相同。这可以准确解释您观察到的结果。
但是,我们还没有完成。 文档表明
LocalMachine
的ByPass
政策应覆盖此:
Scope的有效值为MachinePolicy、UserPolicy、Process、CurrentUser和LocalMachine。 LocalMachine 是设置执行策略时的默认值。
Scope 值按优先顺序列出。即使在较低优先级设置了更严格的政策,优先的政策在当前会话中仍然有效。
我实际上认为这个文档是不明确的,因为当你阅读列表时,它为解释哪个方向是增加还是减少优先级留下了空间。但我自己的使用表明我有信心
LocalMachine
设置应该是这里使用的。
所以还有一个问题,为什么脚本无法运行。我对此不是100%确定,但我有怀疑。
需要理解的一件事是,实际上有两种 PowerShell:一种是 Windows 附带的,另一种是单独安装的。 Powershell 6.0 及更高版本是单独安装的(尽管未来版本的 Windows 可能会开始包含新的 Powershell)。
当我们看到您使用的是 Powershell 版本 7.3 时,这是 Powershell Core 的已安装版本。 ASP.Net Web 应用程序 shell 可能会使用内置的 Powershell(可能是 5.0 或 5.1 版),最重要的是,它可以拥有自己的一组执行策略。