Автоматизация виртуальных машин и управление ими с помощью PowerShell Virtual Machine automation and management using PowerShell
С помощью PowerShell Direct можно запускать произвольный код PowerShell на виртуальной машине с Windows 10 или Windows Server 2016 с узла Hyper-V независимо от конфигурации сети и параметров удаленного управления. You can use PowerShell Direct to run arbitrary PowerShell in a Windows 10 or Windows Server 2016 virtual machine from your Hyper-V host regardless of network configuration or remote management settings.
Запустить PowerShell Direct можно несколькими способами. Here are some ways you can run PowerShell Direct:
Требования Requirements
Требования к операционной системе: Operating system requirements:
- Узел: Windows 10, Windows Server 2016 или более поздней версии с Hyper-V. Host: Windows 10, Windows Server 2016, or later running Hyper-V.
- Гость/виртуальная машина: Windows 10, Windows Server 2016 или более поздней версии. Guest/Virtual Machine: Windows 10, Windows Server 2016, or later.
Если вы управляете виртуальными машинами более ранних версий, используйте средство «Подключение к виртуальной машине» (VMConnect) или настройте для этой машины виртуальную сеть. If you’re managing older virtual machines, use Virtual Machine Connection (VMConnect) or configure a virtual network for the virtual machine.
Требования к конфигурации: Configuration requirements:
- Виртуальная машина должна работать на узле локально. The virtual machine must be running locally on the host.
- Виртуальная машина должна быть включена и иметь хотя бы один настроенный профиль пользователя. The virtual machine must be turned on and running with at least one configured user profile.
- Необходимо войти в учетную запись администратора Hyper-V на хост-компьютере. You must be logged into the host computer as a Hyper-V administrator.
- Необходимо указать действительные учетные данные пользователя для виртуальной машины. You must supply valid user credentials for the virtual machine.
Создание и завершение интерактивного сеанса PowerShell Create and exit an interactive PowerShell session
Для выполнения команд PowerShell на виртуальной машине проще всего запустить интерактивный сеанс. The easiest way to run PowerShell commands in a virtual machine is to start an interactive session.
При запуске сеанса вводимые команды выполняются на виртуальной машине, как если бы вы вводили их непосредственно в сеансе PowerShell на самой виртуальной машине. When the session starts, the commands that you type run on the virtual machine, just as though you typed them directly into a PowerShell session on the virtual machine itself.
Запуск интерактивного сеанса: To start an interactive session:
На узле Hyper-V откройте PowerShell от имени администратора. On the Hyper-V host, open PowerShell as Administrator.
Выполните одну из указанных ниже команд, чтобы создать интерактивный сеанс, используя имя или GUID виртуальной машины: Run one of the following commands to create an interactive session using the virtual machine name or GUID:
Укажите учетные данные для виртуальной машины при отображении соответствующего запроса. Provide credentials for the virtual machine when prompted.
- Выполните команды на виртуальной машине. Run commands on your virtual machine.
Для вашей командной строки PowerShell должен отображаться префикс VMName, как показано ниже: You should see the VMName as the prefix for your PowerShell prompt as shown:
Любая выполненная команда выполняется на виртуальной машине. Any command run will be running on your virtual machine. Для проверки можно выполнить ipconfig или hostname , чтобы убедиться, что эти команды выполняются на виртуальной машине. To test, you can run ipconfig or hostname to make sure that these commands are running in the virtual machine.
После завершения работы выполните следующую команду, чтобы закрыть сеанс: When you’re done, run the following command to close the session:
Примечание. Если сеанс не подключается, см. раздел Диагностика для определения возможных причин. Note: If your session won’t connect, see the troubleshooting for potential causes.
Дополнительные сведения об этих командлетах см. в разделах Enter-PSSession и Exit-PSSession. To learn more about these cmdlets, see Enter-PSSession and Exit-PSSession.
Запуск сценария или команды с помощью командлета Invoke-Command Run a script or command with Invoke-Command
PowerShell Direct с Invoke-Command идеально подходит для ситуаций, когда нужно выполнить одну команду или один сценарий на виртуальной машине, после чего можно прекратить взаимодействие с виртуальной машиной. PowerShell Direct with Invoke-Command is perfect for situations where you need to run one command or one script on a virtual machine but do not need to continue interacting with the virtual machine beyond that point.
Запуск одной команды: To run a single command:
На узле Hyper-V откройте PowerShell от имени администратора. On the Hyper-V host, open PowerShell as Administrator.
Выполните одну из указанных ниже команд, чтобы создать сеанс, используя имя или GUID виртуальной машины: Run one of the following commands to create a session using the virtual machine name or GUID:
Укажите учетные данные для виртуальной машины при отображении соответствующего запроса. Provide credentials for the virtual machine when prompted.
Команда выполняется на виртуальной машине. При наличии выходных данных они выводятся на вашу консоль. The command will execute on the virtual machine, if there is output to the console, it’ll be printed to your console. Подключение будет закрыто автоматически сразу после запуска команды. The connection will be closed automatically as soon as the command runs.
Запуск скрипта: To run a script:
На узле Hyper-V откройте PowerShell от имени администратора. On the Hyper-V host, open PowerShell as Administrator.
Выполните одну из указанных ниже команд, чтобы создать сеанс, используя имя или GUID виртуальной машины: Run one of the following commands to create a session using the virtual machine name or GUID:
Укажите учетные данные для виртуальной машины при отображении соответствующего запроса. Provide credentials for the virtual machine when prompted.
Сценарий выполняется на виртуальной машине. The script will execute on the virtual machine. Подключение будет закрыто автоматически сразу после запуска команды. The connection will be closed automatically as soon as the command runs.
Дополнительные сведения об этом командлете см. в статье Invoke-Command. To learn more about this cmdlet, see Invoke-Command.
Копирование файлов с помощью New-PSSession и Copy-Item Copy files with New-PSSession and Copy-Item
Примечание. В сборках Windows 14280 и более поздних версий PowerShell Direct поддерживает только постоянные сеансы. Note: PowerShell Direct only supports persistent sessions in Windows builds 14280 and later
Постоянные сеансы PowerShell чрезвычайно полезны при написании сценариев, координирующих действия для одного или нескольких удаленных компьютеров. Persistent PowerShell sessions are incredibly useful when writing scripts that coordinate actions across one or more remote machines. После создания постоянные сеансы выполняются в фоновом режиме, пока вы не решите удалить их. Once created, persistent sessions exist in the background until you decide to delete them. Это означает, что можно снова и снова ссылаться на один и тот же сеанс с помощью Invoke-Command или Enter-PSSession без передачи учетных данных. This means you can reference the same session over and over again with Invoke-Command or Enter-PSSession without passing credentials.
По той же причине сеансы сохраняют состояние. By the same token, sessions hold state. Так как постоянные сеансы сохраняются, все созданные или переданные в них переменные сохраняются между вызовами. Since persistent sessions persist, any variables created in a session or passed to a session will be preserved across multiple calls. Существует несколько средств для работы с постоянными сеансами. There are a number of tools available for working with persistent sessions. В этом примере мы будем использовать New-PSSession и Copy-Item для перемещения данных с узла в виртуальную машину и из виртуальной машины на узел. For this example, we will use New-PSSession and Copy-Item to move data from the host to a virtual machine and from a virtual machine to the host.
Создание сеанса с последующим копированием файлов: To create a session then copy files:
На узле Hyper-V откройте PowerShell от имени администратора. On the Hyper-V host, open PowerShell as Administrator.
Выполните одну из указанных ниже команд, чтобы создать постоянный сеанс PowerShell для виртуальной машины с помощью New-PSSession . Run one of the following commands to create a persistent PowerShell session to the virtual machine using New-PSSession .
Укажите учетные данные для виртуальной машины при отображении соответствующего запроса. Provide credentials for the virtual machine when prompted.
Предупреждение: Warning:
В сборках, предшествующих 14500, имеется ошибка. There is a bug in builds before 14500. Если учетные данные не указаны явно с помощью флага -Credential , служба у гостя завершается со сбоем и потребуется перезапустить ее. If credentials aren’t explicitly specified with -Credential flag, the service in the guest will crash and will need to be restarted. Если вы столкнулись с этой проблемой, инструкции по ее устранению см. здесь. If you hit this issue, workaround instructions are available here.
- Скопируйте файл на виртуальную машину. Copy a file into the virtual machine.
Чтобы скопировать C:\host_path\data.txt на виртуальную машину с хост-компьютера, выполните следующую команду: To copy C:\host_path\data.txt to the virtual machine from the host machine, run:
- Скопируйте файл с виртуальной машины (на узел). Copy a file from the virtual machine (on to the host).
Чтобы скопировать C:\guest_path\data.txt на узел с виртуальной машины, выполните следующую команду: To copy C:\guest_path\data.txt to the host from the virtual machine, run:
- Остановите постоянный сеанс с помощью Remove-PSSession . Stop the persistent session using Remove-PSSession .
Поиск и устранение неисправностей Troubleshooting
В PowerShell Direct выводится небольшой набор сообщений о распространенных ошибках. There are a small set of common error messages surfaced through PowerShell Direct. Ниже приведены наиболее распространенные ошибки, возможные причины и средства диагностики. Here are the most common, some causes, and tools for diagnosing issues.
Параметры -VMName или -VMID не существуют -VMName or -VMID parameters don’t exist
Проблема: Problem:
Enter-PSSession , Invoke-Command или New-PSSession не имеют параметра -VMName или -VMId . Enter-PSSession , Invoke-Command , or New-PSSession do not have a -VMName or -VMId parameter.
Возможные причины: Potential causes:
Скорее всего, проблема состоит в том, что PowerShell Direct не поддерживается операционной системой сервера виртуальных машин. The most likely issue is that PowerShell Direct isn’t supported by your host operating system.
Проверить сборку Windows можно с помощью следующей команды: You can check your Windows build by running the following command:
Если применяется поддерживаемая сборка, возможно, ваша версия PowerShell не использует PowerShell Direct. If you are running a supported build, it is also possible your version of PowerShell does not run PowerShell Direct. Для PowerShell Direct и JEA требуется основной номер версии 5 или выше. For PowerShell Direct and JEA, the major version must be 5 or later.
Проверить версию PowerShell можно с помощью следующей команды: You can check your PowerShell version build by running the following command:
Ошибка: «Возможно, удаленный сеанс был завершен» Error: A remote session might have ended
Примечание. Note:
Для Enter-PSSession в сборках узла с 10240 по 12400 все описанные ниже ошибки регистрируются как «Возможно, удаленный сеанс был завершен». For Enter-PSSession between host builds 10240 and 12400, all errors below reported as «A remote session might have ended».
Сообщение об ошибке: Error message:
Возможные причины: Potential causes:
- Виртуальная машина существует, но не выполняется. The virtual machine exists but is not running.
- Гостевая ОС не поддерживает PowerShell Direct (см. требования). The guest OS does not support PowerShell Direct (see requirements)
- Оболочка PowerShell еще не доступна на гостевой виртуальной машине. PowerShell isn’t available in the guest yet
- Загрузка операционной системы не завершена. The operating system hasn’t finished booting
- Правильная загрузка операционной системы невозможна. The operating system can’t boot correctly
- Во время загрузки требуется ввод данных пользователем. Some boot time event needs user input
Можно использовать командлет Get-VM, чтобы узнать, какие виртуальные машины выполняются на узле. You can use the Get-VM cmdlet to check to see which VMs are running on the host.
Сообщение об ошибке: Error message:
Возможные причины: Potential causes:
- Одна из указанных выше причин. Все они в равной мере применимы для New-PSSession . One of the reasons listed above — they all are equally applicable to New-PSSession
- Ошибка в текущих сборках, когда требуется явная передача учетных данных с помощью -Credential . A bug in current builds where credentials must be explicitly passed with -Credential . Когда это происходит, в операционной системе на виртуальной машине зависает вся служба и ее требуется перезапустить. When this happens, the entire service hangs in the guest operating system and needs to be restarted. Доступность сеанса можно проверить с помощью Enter-PSSession. You can check if the session is still available with Enter-PSSession.
Чтобы обойти эту проблему с учетными данными, войдите на виртуальную машину с помощью VMConnect, откройте PowerShell и перезапустите службу vmicvmsession, используя следующую команду PowerShell: To work around the credential issue, log into the virtual machine using VMConnect, open PowerShell, and restart the vmicvmsession service using the following PowerShell:
Ошибка: набор параметров не может быть разрешен Error: Parameter set cannot be resolved
Сообщение об ошибке: Error message:
Возможные причины: Potential causes:
-RunAsAdministrator не поддерживается при подключении к виртуальным машинам. -RunAsAdministrator is not supported when connecting to virtual machines.
Флаг -RunAsAdministrator позволяет администратору подключиться к контейнеру Windows без явного указания учетных данных. When connecting to a Windows container, the -RunAsAdministrator flag allows Administrator connections without explicit credentials. Поскольку виртуальные машины не предоставляют неявный доступ администратора к узлу, в этом случае необходимо явно предоставить учетные данные. Since virtual machines do not give the host implied administrator access, you need to explicitly enter credentials.
Можно передать учетные данные администратора на виртуальную машину с помощью параметра -Credential либо вручную при поступлении запроса. Administrator credentials can be passed to the virtual machine with the -Credential parameter or by entering them manually when prompted.
Ошибка. Недопустимые учетные данные. Error: The credential is invalid.
Сообщение об ошибке: Error message:
Возможные причины: Potential causes:
- Не удается проверить учетные данные для гостевой виртуальной машины. The guest credentials couldn’t be validated
- Предоставлены неправильные учетные данные. The supplied credentials were incorrect.
- Учетные записи пользователей отсутствуют на гостевой виртуальной машине (операционная система не загружалась) There are no user accounts in the guest (the OS hasn’t booted before)
- В случае подключения от имени администратора: администратор не был установлен как активный пользователь. If connecting as Administrator: Administrator has not been set as an active user. Дополнительные сведения см. здесь. Learn more here.
Ошибка. Входной параметр VMName не разрешается ни в одну виртуальную машину. Error: The input VMName parameter does not resolve to any virtual machine.
Сообщение об ошибке: Error message:
Возможные причины: Potential causes:
- Вы не являетесь администратором Hyper-V. You are not a Hyper-V Administrator.
- Виртуальная машина не существует. The virtual machine doesn’t exist.
С помощью командлета Get-VM можно проверить, имеется ли у используемых учетных данных роль администратора Hyper-V, а также просмотреть, какие виртуальные машины запущены локально и загружены. You can use the Get-VM cmdlet to check that the credentials you’re using have the Hyper-V administrator role and to see which VMs are running locally on the host and booted.
Примеры и руководства пользователя Samples and User Guides
PowerShell Direct поддерживает JEA (Just Enough Administration). PowerShell Direct supports JEA (Just Enough Administration). Чтобы оценить эту функцию, воспользуйтесь этим руководством пользователя. Check out this user guide to try it.
См. примеры на веб-сайте GitHub. Check out samples on GitHub.