为什么在.NetCore控制台应用程序中运行PowerShell命令“Get-WindowsCapability”时出现错误?

xcitsw88  于 2023-02-12  发布在  Shell
关注(0)|答案(1)|浏览(264)

NetCore中的PowerShell新手,脚本在PowerShell伊势中工作正常,但当我运行控制台应用程序时。

脚本如下:

Get-WindowsCapability -Online -Name Microsoft.Windows.Notepad*

以下是通过PowerShell伊势的输出:

名称:微软. windows .记事本~~~~0.0.1.0状态:已安装的显示名称:记事本描述:即时查看、编辑和搜索纯文本文档和源代码文件。下载大小:301710安装规模:647868

以下是我的.NetCore控制台应用程序的代码片段:

var psInstance = PowerShell.Create();
psInstance.AddScript("Get-WindowsCapability -Online -Name Microsoft.Windows.Notepad*");
var output  = psInstance.Invoke();
psInstance?.Runspace?.Close();

if (psInstance.HadErrors)
{
   var error = psInstance.Streams.Error.Select(e => e.ToString());
}

下面是我在pInstance对象中看到的错误:

计数= 5 [0]:“在模块'Dism'中找到'Get-WindowsCapability'命令,但由于下列错误,无法加载该模块:[无法加载文件C:\WINDOWS\system32\WindowsPowerShell\v1.0\Modules\Dism\Dism.psm1,因为在此系统上禁用了运行脚本。有关详细信息,请参阅https://go.microsoft.com/fwlink/?LinkID = 135170上的about_Execution_Policies。]\r\n有关详细信息,请运行“导入模块Dism '。”[1]:“在模块'Dism'中找到'Get-WindowsCapability'命令,但由于下列错误,无法加载该模块:[无法加载文件C:\WINDOWS\system32\WindowsPowerShell\v1.0\Modules\Dism\Dism.psm1,因为在此系统上禁用了运行脚本。有关详细信息,请参阅https://go.microsoft.com/fwlink/?LinkID = 135170上的about_Execution_Policies。]\r\n有关详细信息,请运行“导入模块Dism '。”[2]:“[localhost]连接到远程服务器localhost失败,错误消息如下:WinRM无法处理该请求。使用协商身份验证时发生以下错误,错误代码为0x 8009030 e:指定的登录会话不存在。它可能已被终止。\r\n可能的原因是:\r\n -指定的用户名或密码无效。\r\n -未指定身份验证方法和用户名时使用Kerberos。\r\n -Kerberos接受域用户名,但不接受本地用户名。\r\n -远程计算机名称和端口的服务主体名称(SPN)不存在。\r\n -客户端和远程计算机位于不同的域中,并且两个域之间不存在信任。\r\n检查上述问题后,请尝试以下操作:\r\n -检查事件查看器中与身份验证相关的事件。\r\n -更改身份验证方法;请将目标计算机添加到WinRM TrustedHosts配置设置或使用HTTPS传输。\r\n请注意,TrustedHosts列表中的某些计算机可能未经过身份验证。\r\n -有关WinRM配置的详细信息,请运行以下命令:winrm help config。有关详细信息,请参阅about_Remote_Troubleshooting帮助主题。\r\n其他可能的原因:\r\n -指定的凭据中未包含域名或计算机名,例如:域\用户名或计算机\用户名。”[3]:“无法验证参数”Session“的参数。该参数为Null或空。请提供一个非Null或非空的参数,然后重试该命令。”[4]:无法验证参数“Id”的参数。该参数为Null。请为该参数提供有效值,然后尝试再次运行该命令。
我正在以管理员身份运行控制台应用程序。为什么脚本通过PowerShell IDE成功运行,但通过示例应用程序抛出错误?
我是否还必须对PowerShell示例对象执行其他操作?

qni6mghb

qni6mghb1#

    • TL;医生**
  • 使用允许脚本执行的execution policy(如RemoteSigned)配置基于PowerShell SDK的会话
  • 有关示例,请参见this answer
背景信息。

过时的[1] Windows PowerShell ISE总是运行 * Windows PowerShell ,而您的. NET(核心)C#应用程序必须使用 * PowerShell(核心) 的SDK。
这两个PowerShell版本具有 * 单独的 * 执行策略,听起来像是系统上的 * Windows PowerShell * 配置为允许脚本执行,而 * PowerShell(核心)* 则不允许。
如果模块不是 * .ps1脚本文件 ,那么Get-WindowsCapability所属的Dism * 模块 * 会受制于 * script * 执行策略,这可能会令人惊讶。
然而,
许多 * 模块是,即如果它们(也)包含 * PowerShell * 代码,则这不仅对于完全以PowerShell代码(*.psm1)实现的 * 脚本 * 模块是真的,而且对于主要 * 二进制 * 模块(经由汇编(即,编译代码)提供它们的cmdlet的那些模块)也是真的,如果这样的模块 * 也 * 包含PowerShell代码和/或formatting files ( *.format.ps1xml )type-definition files ( *.types.ps1xml )
最健壮的解决方案是在"每个会话"的基础上设置所需的执行策略,如链接的答案所示。
[1]Windows PowerShell ISE不再被积极开发和there are reasons not to use it(底部),特别是不能运行PowerShell(核心)6+。积极开发的,跨平台的编辑器,提供最好的PowerShell开发体验是Visual Studio Code与它的PowerShell extension

相关问题