通过 C# (Hyper-V) 在 PowerShell 中获取虚拟机名称

Get Virtual Machine names in PowerShell via C# (Hyper-V)

我正在尝试使用以下代码从本地 Hyper-V 服务器获取虚拟机名称列表:

string _scr = ("Get-VM | Select -ExpandProperty Name");
var _ps = PowerShell.Create();
_ps.AddScript(_scr);
Collection<PSObject> _cObj = _ps.Invoke();
foreach (PSObject _vm in _cObj)
{
    Console.WriteLine(_vm);
}

Get-VM cmdlet 应该 return 字符串格式的值,但我没有得到任何输出。

我想得到类似于我们在 PowerShell 中得到的以下输出的结果:

PS C:\> Get-VM | Select -ExpandProperty Name
VM-Name1
VM-Name2
VM-Name3
VM-Name4
PS C:\>

谁能帮我解决这个问题?

万分感谢。

阿达

Get-VM 只能以管理员身份在 PowerShell 会话中工作 运行。当我以管理员身份尝试您的 C# 代码 运行 时,它会打印 VM 名称。

当我在没有管理员权限的情况下尝试时,我没有得到任何输出,和你一样 - 但如果你检查 _ps.HadErrors 它是 true,则会报告错误。试试这个版本的代码:

string _scr = ("Get-VM | Select -ExpandProperty Name");
var _ps = PowerShell.Create();
_ps.AddScript(_scr);
Collection<PSObject> _cObj = _ps.Invoke();

if (_ps.HadErrors) {
    Console.WriteLine(_ps.Streams.Error[0].ToString());
}

foreach (PSObject _vm in _cObj)
{
    Console.WriteLine(_vm);
}

我收到“您没有完成此任务所需的权限。请联系计算机 {name} 授权策略的管理员”,您可能会收到另一个错误,让您了解出了什么问题。

(另一个考虑因素,如果未自动加载 Hyper-V 模块,您可能需要在 PowerShell 代码的开头添加 Import Hyper-V;)。