Как я могу прочитать IP-адрес виртуальной машины через Powershell в C # - PullRequest
0 голосов
/ 09 июля 2019

Hi stack переполнение ers!

Я хочу прочитать IP-адрес моих виртуальных машин.Для этого я создал приложение для WindowsForms и в данный момент могу переключаться между своими виртуальными машинами, приостанавливать или возобновлять их, и все работает нормально.Для этого я запускаю команды powershell в коде C #.Моя единственная проблема - получить IP-адреса моих виртуальных машин.Причина в том, что я хочу получить доступ к виртуальным машинам через удаленный рабочий стол после их запуска.

До сих пор я пытался создать элемент PowerShell и запустить команду для доступа к IP-адресам.Пока все хорошо, я могу видеть IP-адрес всех своих машин, если взгляну на PSObject, но не могу извлечь его в переменную.

Я пытался преобразовать его в объекти перебирать все типы, что не сработало, потому что я теряю всю информацию.Я также попытался запустить несколько команд 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;
}

1 Ответ

0 голосов
/ 09 июля 2019

Вот фрагмент кода, который отлично работает для меня в консольном приложении - адаптируйте его под свои настройки 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

Кроме того, зачастую проще перенести обработку данных в PowerShell, отправив более сложный сценарий, который возвращает только нужную информацию (например, используя PsCustomObject), а нечем иметь дело с этим, как только вы снова в вашем приложении C #.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...