Форум программистов, компьютерный форум, киберфорум
Наши страницы
C# .NET
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.50/4: Рейтинг темы: голосов - 4, средняя оценка - 4.50
Pablitto
1 / 1 / 1
Регистрация: 20.12.2011
Сообщений: 21
1

Hyper-v: назначить ВМ сетевой адаптер

30.03.2014, 14:28. Просмотров 761. Ответов 3
Метки нет (Все метки)

Здравствуйте.

У меня сложилась такая ситуация:

Есть скрипт vbs для бэкапа ВМ: HyperV Backup Tool v0.7.3 (http://sysadmins.ru/topic247352.html).
Я его обрабатываю в C#, для большей автоматизации.
Всё отлично работает, но при восстановление ВМ у неё слетает сетевой адаптер (Как я вычитал: это из-за специфики скрипта. Автор скрипта, в FAQ - уточнил, что нужно подправить сеть руками и можно запускать ВМ).

Вот мне необходимо сделать, чтобы сеть выставлялась тоже программно (иначе теряется автоматизация в моей сборке - C# + vbs).

Т.е. из этого состояния (после восстановления вм через vbs):
Hyper-v: назначить ВМ сетевой адаптер


Выбрать адаптер существующий (на изображении: Hyper - Virtual Network):
Hyper-v: назначить ВМ сетевой адаптер


И применить его. Всё это сделать программно. Я искал решения (WMI) на C#, PS, vbs, но ничего подходящего для себя не нашёл.

Экспериментировал с этим методом (Я подумал, что он может быть подходящим, хотя я не уверен): http://msdn.microsoft.com/en-us/library/cc136809(v=vs.85).aspx
Но ничего у меня внятного не получилось. А примеров подходящих в гугле не нашёл, и не знаю возможно ли вообще как-нибудь выбрать адаптер (т.к. он существует в списке и создавать никаких ресурсов не нужно).

Может быть кто-нибудь подскажет, что-нибудь по данному вопросу ? Может кто знает из-за чего может быть такая ошибка ? Или подскажет реализацию программного исправления данной ошибки (C#, PS, vbs) ?

P.S.
Буду рад любым соображениям - я сам пока в тупике...
Я писал автору скрипта, пытался уточнить некоторые непонятные для меня моменты (отчего слетает сеть и т.д.), чтобы сориентироваться с решением - но он пока не ответил. Поэтому задумал поправлять сеть через C#.

С уважением, Павел.
0
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
30.03.2014, 14:28
Ответы с готовыми решениями:

Включить или выключить сетевой адаптер
Как из кода на C# включить или отключить сетевой интерфейс? Я нашел класс NetworkInterface, но с...

Как программно вкл/выкл сетевой адаптер?
Самое печальное, что я когда-то уже это делал, но совершенно забыл как, а исходник форматнулся....

Сетевой адаптер не видит сетевой кабель
Проблема возникла после грозы. Проверка сетевого адаптера и драйверов ни чего не дала, на разъеме...

Сетевой адаптер "Сетевой кабель не подключен"
Ребят выручайте. Появилась проблема после чистки компа и не понятно с чем она связанна.До этого все...

Сетевой адаптер "Сетевой кабель не подключен"
Доброго времени суток! Проблема с сетевым адаптером Realtek PCI GBE Family Controller #2...

3
Psilon
Master of Orion
Эксперт .NET
6036 / 4890 / 903
Регистрация: 10.07.2011
Сообщений: 14,477
Записей в блоге: 5
Завершенные тесты: 4
30.03.2014, 18:43 2
Pablitto, можешь с помощью Spy++ посмотреть hwnd контролов и с помощью winapi по ним щелкать.
1
Pablitto
1 / 1 / 1
Регистрация: 20.12.2011
Сообщений: 21
30.03.2014, 19:39  [ТС] 3
Цитата Сообщение от Psilon Посмотреть сообщение
Pablitto, можешь с помощью Spy++ посмотреть hwnd контролов и с помощью winapi по ним щелкать.
В моём проекте думаю такой подход будет слишком радикальным решением...

У меня там всё управление на C# HyperV WMI Provider (смена состояний, снапшоты).

Да и взглянул на методику использования spy++ - думаю в моём случае будет проще
руками править сеть (или склонировать/пересоздать вм через WMI), чем так хакать-дебажить hyperV )))

С благодарностью, Павел.
0
Pablitto
1 / 1 / 1
Регистрация: 20.12.2011
Сообщений: 21
09.08.2014, 09:16  [ТС] 4
Лучший ответ Сообщение было отмечено NickoTin как решение

Решение

Вообщем так и не смог разобраться с WMI HyperV Provider по этому функционалу...
Но нашёл PowerShell библиотеку "PowerShell management Library for Hyper-V" на codeplex: https://pshyperv.codeplex.com/
В ней очень удобные командлеты для управления HyperV 2008R2. Вызываю функционал этих командлетов через C#.


C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
        public static string SetupNicSwitch(string vmName, string nicInstanceID, string switchName)
        {
            Process ps = new Process(); // PowerShell
            ps.StartInfo.FileName = "powershell.exe"; 
            string param = "(Set-VMNICSwitch -vm '" + vmName + "' -nic (Get-VMNIC '" + vmName + "' -legacy -vmbus | where {$_.InstanceID -eq '" + nicInstanceID + "'})" +
            " (Get-Vmswitch -server . | where {$_.Name -eq '" + switchName + "'})).InstanceID";
 
            ps.StartInfo.Arguments = param;
            ps.StartInfo.UseShellExecute = false;
            
            ps.StartInfo.UserName = CFG.localCredentialsAcc;        
            var pass = new SecureString();
            foreach(char pasCh in CFG.localCredentialsPass)
            pass.AppendChar(pasCh);
            ps.StartInfo.Password = pass;
            
            ps.StartInfo.RedirectStandardOutput = true;
            ps.Start();
            ps.WaitForExit();
            return ps.StandardOutput.ReadToEnd().Replace("\r\n",String.Empty);
        }
 
 
        public static string GetVMNicSwitch(string vmName, string nicName)
        {
            Process ps = new Process(); // PowerShell
            ps.StartInfo.FileName = "powershell.exe"; 
            ps.StartInfo.Arguments = "(Get-VMNIC '" + vmName + "' | where {$_.InstanceID -eq '" + nicName + "'}) | get-vmNicSwitch | foreach { $_.Name }";
 
            ps.StartInfo.UseShellExecute = false;
            
            ps.StartInfo.UserName = CFG.localCredentialsAcc;        
            var pass = new SecureString();
            foreach(char pasCh in CFG.localCredentialsPass)
            pass.AppendChar(pasCh);
            ps.StartInfo.Password = pass;
            
            ps.StartInfo.RedirectStandardOutput = true;
            ps.Start();
            ps.WaitForExit();
 
            return ps.StandardOutput.ReadToEnd().Replace("\r\n",String.Empty);
        }
Как я понял, суть в том, что при теневом копировании-восстановлении (VBS скриптом) иногда слетает SwitchPort (как я понял, абстрактно, при восстановлении, вм пытается вставить свой виртуальный LAN провод обратно в свой порт виртуального комутатора, а там его уже заняли за время отсутвия вм).

Я реализовал такую логику: сохраняю настройки адаптера вм в XML, делаю теневое бэкап-восстановление (VBS скриптом) и назначаю адаптер вм, в соответствии с сохранёнными данными.

С уважением Павел...
0
09.08.2014, 09:16
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
09.08.2014, 09:16

Сетевой адаптер
Неожиданно пропал интернет ,диагностика неполадок написала что windows не удалось обнаружить...

Сетевой адаптер
Доброго времени суток! Проблема с сетевым адаптером Realtek PCI GBE Family Controller #2...

сетевой адаптер
Всем привет, помогите пожалуйста разобраться. Комп Lenovo IdeaCentre H520, чипсет intel H61...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru