收到“此系统上禁用运行脚本。”在 ASP.NET webapi 中

问题描述 投票:0回答:1

我正在尝试从 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

c# powershell asp.net-core asp.net-web-api
1个回答
0
投票

ASP.Net Web 应用程序几乎肯定以 不同用户 的身份运行,因此它的

CurrentUser
范围可能是
Undefined
,这与 Windows 上的
Restricted
相同。这可以准确解释您观察到的结果。

但是,我们还没有完成。 文档表明

LocalMachine
ByPass
政策应覆盖此:

Scope的有效值为MachinePolicyUserPolicyProcessCurrentUserLocalMachineLocalMachine 是设置执行策略时的默认值。

Scope 值按优先顺序列出。即使在较低优先级设置了更严格的政策,优先的政策在当前会话中仍然有效。

我实际上认为这个文档是不明确的,因为当你阅读列表时,它为解释哪个方向是增加还是减少优先级留下了空间。但我自己的使用表明我有信心

LocalMachine
设置应该是这里使用的。

所以还有一个问题,为什么脚本无法运行。我对此不是100%确定,但我有怀疑。

需要理解的一件事是,实际上有两种 PowerShell:一种是 Windows 附带的,另一种是单独安装的。 Powershell 6.0 及更高版本是单独安装的(尽管未来版本的 Windows 可能会开始包含新的 Powershell)。

当我们看到您使用的是 Powershell 版本 7.3 时,这是 Powershell Core 的已安装版本。 ASP.Net Web 应用程序 shell 可能会使用内置的 Powershell(可能是 5.0 或 5.1 版),最重要的是,它可以拥有自己的一组执行策略

© www.soinside.com 2019 - 2024. All rights reserved.