Автоматизация и управление на виртуална машина с помощта на PowerShell
05/02/20167 минути за четенеМожете да използвате PowerShell Direct, за да стартирате произволен PowerShell във виртуална машина с Windows 10 или Windows Server 2016 от вашия Hyper-V хост, независимо от мрежовата конфигурация или настройки за дистанционно управление.
Ето няколко начина, по които можете да стартирате PowerShell Direct:
Изисквания за операционната система:
Хост: Windows 10, Windows Server 2016 или по-нова версия, изпълняваща Hyper-V.Guest/виртуална машина: Windows 10, Windows Server 2016 или по-нова версия.Ако управлявате по-стари виртуални машини, използвайте връзка с виртуална машина (VMConnect) или конфигурирайте виртуална мрежа за виртуалната машина.
Изисквания за конфигурация:
Виртуалната машина трябва да работи локално на хоста. Виртуалната машина трябва да е включена и да работи с поне един конфигуриран потребителски профил. Трябва да сте влезли в хост компютъра като Hyper-V администратор. Трябва да предоставите валидни потребителски идентификационни данни за виртуалната машина.Най-лесният начин да изпълните PowerShell команди във виртуална машина е да стартирате интерактивна сесия.
Когато сесията започне, командите, които въвеждате, се изпълняват на виртуалната машина, все едно сте ги въвели директно в сесия на PowerShell на самата виртуална машина.
За да започнете интерактивна сесия:
На хоста Hyper-V отворете PowerShell като администратор.
Изпълнете една от следните команди, за да създадете интерактивна сесия, като използвате името на виртуалната машина или GUID:
Въведете-PSSession -VMName Въведете-PSSession -VMIdПредоставете идентификационни данни за виртуалната машина, когато бъдете подканени.
Изпълнявайте команди на вашата виртуална машина.Трябва да видите VMName като префикс за подканата на PowerShell, както е показано:
[VMName]: PS C:\>Всяка стартирана команда ще се изпълнява на вашата виртуална машина. За да тествате, можете да изпълните ipconfig или име на хост, за да се уверите, че тези команди се изпълняват във виртуалната машина.
Когато сте готови, изпълнете следната команда, за да затворите сесията:
Exit-PSSessionЗабележка: Ако вашата сесия не се свързва, вижте отстраняването на неизправности за потенциални причини.
За да научите повече за тези командлети, вижте Enter-PSSession и Exit-PSSession.
PowerShell Direct с Invoke-Command е перфектен за ситуации, в които трябва да изпълните една команда или един скрипт на виртуална машина, но не е необходимо да продължите да взаимодействате с виртуалната машина отвъд тази точка.
За да изпълните една команда:
На хоста Hyper-V отворете PowerShell като администратор.
Изпълнете една от следните команди, за да създадете сесия, като използвате името на виртуалната машина или GUID:
Invoke-Command -VMName-ScriptBlock { команда } Invoke-Command -VMId-ScriptBlock { команда }Предоставете идентификационни данни за виртуалната машина, когато бъдете подканени.
Командата ще се изпълни на виртуалната машина, ако има изход към конзолата, той ще бъде отпечатан на вашата конзола. Връзката ще бъде затворена автоматично веднага щом командата се изпълни.
За да стартирате скрипт:
На хоста Hyper-V отворете PowerShell като администратор.
Изпълнете една от следните команди, за да създадете сесия, като използвате името на виртуалната машина или GUID:
Invoke-Command -VMName-FilePath C:\host\script_path\script.ps1 Invoke-Command -VMId-FilePath C:\host\script_path\script.ps1Предоставете идентификационни данни за виртуалната машина, когато бъдете подканени.
Скриптът ще се изпълни на виртуалната машина. Връзката ще се затвори автоматично веднага щом командата се изпълни.
За да научите повече за тази кратка команда, вижте Invoke-Command.
Забележка: PowerShell Direct поддържа постоянни сесии само в компилации на Windows 14280 и по-нови
Постоянните PowerShell сесии са невероятно полезни при писане на скриптове, които координират действията между една или повече отдалечени машини. Веднъж създадени, постоянните сесии съществуват във фонов режим, докато не решите да ги изтриете. Това означава, че можете да препращате към една и съща сесия отново и отново с Invoke-Command или Enter-PSSession без предаване на идентификационни данни.
По същия начин сесиите поддържат състояние. Тъй като постоянните сесии продължават, всички променливи, създадени в сесия или предадени на сесия, ще бъдат запазени при множество извиквания. Налични са редица инструменти за работа с постоянни сесии. За този пример ще използваме New-PSSession и Copy-Item, за да преместим данни от хост към виртуална машина и от виртуална машина към хост.
За да създадете сесия, след това копирайте файлове:
На хоста Hyper-V отворете PowerShell като администратор.
Изпълнете една от следните команди, за да създадете постоянна PowerShell сесия към виртуалната машина с помощта на New-PSSession.
$s = New-PSSession -VMName-Credential (Get-Credential)$s = New-PSSession -VMId-Credential (Get-Credential)Предоставете идентификационни данни за виртуалната машина, когато бъдете подканени.
Предупреждение: Има грешка в компилации преди 14500. Ако идентификационните данни не са изрично посочени с -Credential флаг, услугата в госта ще се срине и ще трябва да се рестартира. Ако срещнете този проблем, са налични инструкции за заобиколно решение тук.
Копирайте файл във виртуалната машина.За да копирате C:\host_path\data.txt във виртуалната машина от хост машината, изпълнете:
Copy-Item -ToSession $s -Path C:\host_path\data.txt -Destination C:\guest_path\Копирайте файл от виртуалната машина (на хоста).За да копирате C:\guest_path\data. txt към хоста от виртуалната машина, изпълнете:
Copy-Item -FromSession $s -Path C:\guest_path\data.txt -Destination C:\host_path\Stop the persistent session using Remove-PSSession.Remove-PSSession $sТам са малък набор от често срещани съобщения за грешка, появяващи се чрез PowerShell Direct. Ето най-често срещаните, някои причини и инструменти за диагностициране на проблеми.
Проблем:Enter-PSSession, Invoke-Command или New-PSSession нямат параметър -VMName или -VMId.
Потенциални причини: Най-вероятният проблем е, че PowerShell Direct не се поддържа от вашата хост операционна система.
Можете да проверите компилацията на Windows, като изпълните следната команда:
[System.Environment]::OSVersion.VersionАко използвате поддържана компилация, също е възможно вашата версия на PowerShell да не изпълнява PowerShell Direct. За PowerShell Direct и JEA основната версия трябва да е 5 или по-нова.
Можете да проверите компилацията на вашата версия на PowerShell, като изпълните следната команда:
$PSVersionTable.PSVersionЗабележка: За Enter-PSSession между компилации на хост 10240 и 12400, всички грешки по-долу са докладвани като „Отдалечена сесия може да е приключила“.
Съобщение за грешка:
Enter-PSSession : Възникна грешка, която Windows PowerShell не може да обработи. Отдалечена сесия може да е приключила.Възможни причини:
Виртуалната машина съществува, но не работи. OS за гости не поддържа PowerShell Direct (вижте изискванията) PowerShell все още не е наличен в системата за гости Операционната система не е завършила зареждането Операционната система не може да се зарежда правилно Някое събитие по време на зареждане изисква въвеждане от потребителяМожете да използвате cmdlet Get-VM, за да проверите кои виртуални машини се изпълняват на хоста.
Съобщение за грешка:
New-PSSession : Възникна грешка, която Windows PowerShell не може да обработи. Отдалечена сесия може да е приключила.Възможни причини:
Една от причините, изброени по-горе -- всички те са еднакво приложими за грешка New-PSSessionA в текущи компилации, където идентификационните данни трябва да бъдат изрично предадени с -Credential. Когато това се случи, цялата услуга виси в операционната система за гости и трябва да се рестартира. Можете да проверите дали сесията все още е налична с Enter-PSSession.За да заобиколите проблема с идентификационните данни, влезте във виртуалната машина с помощта на VMConnect, отворете PowerShell и рестартирайте услугата vmicvmsession, като използвате следния PowerShell:
Restart-Service -Name vmicvmsessionСъобщение за грешка:
Enter-PSSession: Наборът от параметри не може да бъде разрешен с помощта на посочените именувани параметри.Потенциални причини:
-RunAsAdministrator не се поддържа при свързване към виртуални машини.
Когато се свързвате към контейнер на Windows, флагът -RunAsAdministrator позволява свързване на администратор без изрични идентификационни данни. Тъй като виртуалните машини не дават подразбиращ се администраторски достъп на хоста, трябва изрично да въведете идентификационни данни.
Администраторските идентификационни данни могат да бъдат предадени на виртуалната машина с параметъра -Credential или чрез ръчно въвеждане при подкана.
Съобщение за грешка:
Enter-PSSession: Идентификационните данни са невалидни.Потенциални причини:
Идентификационните данни на госта не можаха да бъдат валидирани. Предоставените идентификационни данни бяха неправилни. Няма потребителски акаунти в госта (ОС не е стартирана преди) Ако се свързвате като администратор: Администраторът не е зададен като активен потребител. Научете повече тук.< h3>Грешка: Входящият параметър VMName не се преобразува във виртуална машина.Съобщение за грешка:
Enter-PSSession: Входящият параметър VMName не се преобразува в нито една виртуална машина.Потенциални причини:
Вие не сте администратор на Hyper-V. Виртуалната машина не съществува.Можете да използвате командата Get-VM, за да проверите дали идентификационните данни, които използвате, имат ролята на администратор на Hyper-V и да видите кои виртуални машини са работи локално на хоста и се стартира.
PowerShell Direct поддържа JEA (Just Enough Administration). Вижте това ръководство за потребителя, за да го изпробвате.
Разгледайте мостри в GitHub.
PREV: Защо приложението Plex не може да намери или да се свърже с моя Plex Media Server?