Net Powershell SDK 6.2.6-为什么PKI模块命令在某些系统上不可用



简短问题

为什么,当我在中运行Get-Commandpowershell命令时。NET 5.0应用程序使用Microsoft.PowerShell.SDKnuget包我在不同的系统上得到不同的结果,这些结果与在powershell中手动运行同一命令不同,即使在同一系统上也是如此?

示例代码

这基本上显示了代码如何运行命令,尽管它确实有更多的输出流处理等

var initialState = InitialSessionState.CreateDefault();
initialState.ExecutionPolicy = ExecutionPolicy.Unrestricted;
using (var ps = PowerShell.Create(initialState))
{
ps.AddScript("Get-Command");
var pipelineObjects = await ps.InvokeAsync();
//**Snip code to interpret pipelineObjects here**
}

如果有什么不同的话,该应用程序的目标运行时明确为win7-x86,但其目的是永远不要在win10 x64以上的系统上运行。

基本问题

  • 我需要从运行一些powershell脚本。NET 5.0应用程序,针对多个操作系统
  • 这些脚本依赖于一些PKI模块命令,例如New-SelfSignedCertificateExport-PfxCertificate
  • 在我的系统上运行此代码,我可以看到PKI命令的输出
  • 在我的系统上手动在powershell中运行Get-Command,虽然命令列表不完全相同,但那些PKI命令仍然存在
  • 某些系统上运行此代码会导致没有PKI命令,这意味着如果我尝试使用此代码运行这些脚本,它将失败
  • 出现故障的系统上手动运行Get-Command,而我确实看到了这些命令,所以如果我手动运行脚本,脚本就会工作,只是不能通过应用程序

我知道,使用SDK,我实际上将PowerShell 6运行时与应用程序捆绑在一起,该应用程序可能有不同/有限的可用命令,但由于这些命令确实出现在我的应用程序上,因此我相信这表明它是";后退";

我发现,在一些较旧的Windows 10安装上,如果你通过Windows更新完全更新系统,它可以解决这个明显的问题,但到目前为止,我发现的所有Windows Server 2016/2019系统似乎都存在这个问题。。。。但有一台Windows 10机器在更新后似乎仍然存在这个问题。

目前,我可以通过手动运行各种脚本来解决这个问题,但这正是通过应用程序运行脚本所要解决的时间浪费问题。

我找了很多遍,但都没有找到答案。因此:

  • 如果cmdlet不是SDK本机支持的,那么它可能";搜索";其他命令
  • 如何在上面的代码中显式导入PKI模块?我曾尝试在运行前添加initialState.ImportPSModule("PKI");,但没有效果(也没有导致任何错误(

很高兴接受我在某个地方做了一些愚蠢的事情,但它在90%的系统上的工作方式令人沮丧。

好吧,我已经找到了一个似乎是解决办法的方法,将来自各种来源的一些信息拼凑在一起。

似乎有效的解决方案是将其注入到我试图运行的脚本的开头:

Import-Module PKI -SkipEditionCheck;

SDK意味着我正在有效地运行Powershell Core,而PKI模块显然还没有移植到它,因此您需要-SkipEditionCheck参数。

正如我上面所说,我试图使用InitialSessionState.ImportPSModule()方法来做同样的事情,但这并没有奏效——也许是因为似乎没有等效于-SkipEditionCheck参数的过载?不知道。

这似乎在初步测试的基础上起了作用,如果我发现进一步的问题,我会回来编辑这个答案。

相关内容

  • 没有找到相关文章

最新更新