简短问题
为什么,当我在中运行Get-Command
powershell命令时。NET 5.0应用程序使用Microsoft.PowerShell.SDK
nuget包我在不同的系统上得到不同的结果,和这些结果与在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-SelfSignedCertificate
和Export-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
参数的过载?不知道。
这似乎在初步测试的基础上起了作用,如果我发现进一步的问题,我会回来编辑这个答案。