C# 如何通过编程确定安装了哪些PowerShell管理单元

C# 如何通过编程确定安装了哪些PowerShell管理单元,c#,powershell,C#,Powershell,我想知道是否有一个方法,我可以调用,它可以告诉我,如果一个PowerShell 已安装管理单元 我知道我可能会调用do it,比如说通过WMI或编写PowerShell脚本,然后将列表返回给C#,但有没有一种方法可以在某个地方执行此操作 谢谢。我不确定这是否是最佳方式,但请查看默认运行空间配置,例如: using System.Linq; using System.Management.Automation; using System.Management.Automation.Runspace

我想知道是否有一个方法,我可以调用,它可以告诉我,如果一个PowerShell 已安装管理单元

我知道我可能会调用do it,比如说通过WMI或编写PowerShell脚本,然后将列表返回给C#,但有没有一种方法可以在某个地方执行此操作


谢谢。

我不确定这是否是最佳方式,但请查看默认运行空间配置,例如:

using System.Linq;
using System.Management.Automation;
using System.Management.Automation.Runspaces;

var cmdlets = Runspace.DefaultRunspace.RunspaceConfiguration.Cmdlets;
var snapins = (from cmdlet in cmdlets
              select new { cmdlet.PSSnapin.Name }).Distinct();
手工编制,所以YMMV

要查看已安装而不是已加载的管理单元,请枚举此注册表项的内容:

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\PowerShell\1\PowerShellSnapIns

或者您可以从C#code调用
getpssnapin-Registered
,并处理返回的PSSnapInInfo对象。

嗨,Keith,我来测试一下。谢谢鲍勃,基思,不幸的是这不起作用。该脚本修复后,仅显示打开运行空间时加载到运行空间中的当前spanin。实际上,是powershell安装的一部分。谢谢你的努力。Bob.Ah,在这种情况下,只需枚举注册表项HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\PowerShell\1\PowerShellSnapInsHi Kieth的内容,该注册表项也不起作用,因为只有在将windows installer安装的管理单元添加到运行空间时,才会填充该注册表项。我知道这是一个WMI调用,它会评估所有windows installer安装的产品,但是如果您使用第三方安装程序安装管理单元,WMI将不会接收它。这就留下了一个整体。还有其他想法吗?我认为,如果他们的答案不是别的,那么就没有简单的答案。BobHmm都获得PSSnapin,此注册表项将显示该计算机上所有已安装的管理单元(因此位置为-HKEY_LOCAL_machine)。这与运行空间无关。顺便说一句,当我说安装,我不是指通过添加PSSnapin加载。我的意思是,您要么运行setup.exe(或.msi)文件来安装管理单元,要么在管理单元的DLL上手动运行installutil.exe。注意,在通过Add-PSSnapin加载管理单元之前,管理单元必须在PowerShell中注册(即在上面显示的注册表项下有一个条目)。