如何在 C# 中通过 Powershell 读取 VM 的 IP?

How can I read the IP of an VM via Powershell in C#?

我想读取我的虚拟机的 IP。为此,我制作了一个 WindowsForms 应用程序,目前我可以在我的 VM 之间切换,暂停或恢复它们,一切正常。为此,我使用 C# 代码 运行 powershell 命令。我唯一的问题是获取虚拟机的 IP 地址。原因是我想在启动后通过远程桌面访问虚拟机。

到目前为止,我尝试的是创建一个 PowerShell 元素并 运行使用命令来访问 IP 地址。到目前为止一切顺利,如果我查看 PSObject,我可以看到我所有机器的 IP 地址,但我无法将其提取到变量中。

我尝试将其转换为一个对象并遍历所有类型,但没有成功,因为我丢失了所有信息。我也尝试了 运行ning 几个 Powershell 命令,不幸的是没有成功。我试图找到正确的程序集来创建一个特定的对象来读取这些值,但我找不到。

根据 Visual Studio,我应该可以使用我的 PSMemberInfo 对象访问它。它应该是 Microsoft.HyperV.PowerShell.VMNetworkAdapter 类型,你可以在我附上的图片中看到。但是我找不到这样的类型,也找不到特定的程序集来包含允许我创建这样的类型的内容。 https://i.imgur.com/Ligb1J4.jpg

有没有人已经尝试过类似的东西或者对我如何访问 IP 有其他想法?

PowerShell ps = PowerShell.Create();
ps.AddCommand("Get-VM").AddParameter("Name", _name);
ps.AddStatement().AddCommand("Select").AddParameter("ExpandProperty", "Networkadapters");
ps.AddStatement().AddCommand("Select").AddParameter("IPAddresses");

Collection<PSObject> _c;
_c = ps.Invoke();

foreach (PSObject o in _c)
{
    PSMemberInfo s = o.Members["Networkadapters"];
    //Type listType = s.Value.GetType();
    //var values = s.Value;
}

这是一个在控制台应用程序中对我来说效果很好的片段 - 适应您的 WinForms 设置:

using (PowerShell PowerShellInstance = PowerShell.Create())
{
    PowerShellInstance.AddScript(@"(Get-VM).NetworkAdapters.IPAddresses -match '^(\d{1,3}\.){3}\d{1,3}$'");

    Collection<PSObject> PSOutput = PowerShellInstance.Invoke();

    foreach (PSObject outputItem in PSOutput)
    {
        Console.WriteLine(outputItem);
    }
}

请注意,我添加了一个非常基本的 RegEx 以仅捕获 IPv4 地址。删除它以获取 IPv6 地址

此外,通过发送更复杂的脚本 returns 只需要所需的信息(例如使用 PsCustomObject),而不是必须处理,将数据处理卸载到 PowerShell 通常更容易回到 C# 应用程序后使用它。