Поделиться через


Автоматизация и управление виртуальными машинами с помощью PowerShell

С помощью PowerShell Direct можно запускать произвольные powerShell в Windows 10 или более поздней версии, а также windows Server 2016 или более поздней версии виртуальной машины с узла Hyper-V. Используйте PowerShell Direct независимо от конфигурации сети или параметров удаленного управления.

Ниже приведены некоторые способы запуска PowerShell Direct:

Требования

Требования к операционной системе:

  • Узел: Windows 10, Windows Server 2016 или более поздней версии под управлением Hyper-V.
  • Гостевая или виртуальная машина: Windows 10, Windows Server 2016 или более поздней версии.

Если вы управляете старыми виртуальными машинами, используйте подключение к виртуальной машине (VMConnect) или подключитесь через сетевое подключение.

Требования к конфигурации:

  • Виртуальная машина должна выполняться локально на хосте.
  • Виртуальная машина должна быть включена и запущена по крайней мере с одним настроенным профилем пользователя.
  • Необходимо войти на главный компьютер в качестве администратора Hyper-V.
  • Необходимо указать допустимые учетные данные пользователя для виртуальной машины.

Создание и выход из интерактивного сеанса PowerShell

Самый простой способ запустить команды PowerShell на виртуальной машине — запустить интерактивный сеанс.

При запуске сеанса команды, которые вы вводите на виртуальной машине, так же, как если бы вы ввели их непосредственно в сеанс PowerShell на самой виртуальной машине.

Чтобы запустить интерактивный сеанс, выполните приведенные действия.

  1. На узле Hyper-V откройте PowerShell от имени администратора.

  2. Выполните одну из следующих команд, чтобы создать интерактивный сеанс с помощью имени виртуальной машины или GUID:

    Enter-PSSession -VMName <VMName>
    Enter-PSSession -VMId <VMId>
    

    При появлении запроса введите учетные данные для виртуальной машины.

  3. Выполните команды на виртуальной машине. Имя виртуальной машины должно отображаться в качестве префикса для запроса PowerShell следующим образом:

    [VMName]: PS C:\>
    

    Любая команда, которую вы запускаете, выполняется на вашей виртуальной машине. Чтобы протестировать, выполните ipconfig или hostname убедитесь, что эти команды выполняются на виртуальной машине.

  4. По завершении выполните следующую команду, чтобы закрыть сеанс:

     Exit-PSSession 
    

Замечание

Если сеанс не подключится, см. сведения об устранении неполадок , связанных с потенциальными причинами.

Дополнительные сведения об этих командлетах см. в разделе ВВОД-PSSession и Exit-PSSession.

Запуск скрипта или команды с помощью Invoke-Command

PowerShell Direct с Invoke-Command идеально подходит для ситуаций, когда необходимо выполнить одну команду или один скрипт на виртуальной машине, но не нужно продолжать взаимодействовать с виртуальной машиной за пределами этой точки.

Чтобы выполнить одну команду, выполните следующую команду:

  1. На узле Hyper-V откройте PowerShell от имени администратора.

  2. Выполните одну из следующих команд, чтобы создать сеанс с помощью имени виртуальной машины или GUID:

    Invoke-Command -VMName <VMName> -ScriptBlock { command } 
    Invoke-Command -VMId <VMId> -ScriptBlock { command }
    

    При появлении запроса введите учетные данные для виртуальной машины.

    Команда выполняется на виртуальной машине. Если команда создает выходные данные, вы увидите их в консоли. Подключение закрывается автоматически после выполнения команды.

Чтобы запустить скрипт, выполните следующие действия:

  1. На узле Hyper-V откройте PowerShell от имени администратора.

  2. Выполните одну из следующих команд, чтобы создать сеанс с помощью имени виртуальной машины или GUID:

    Invoke-Command -VMName <VMName> -FilePath C:\host\script_path\script.ps1 
    Invoke-Command -VMId <VMId> -FilePath C:\host\script_path\script.ps1 
    

    При появлении запроса введите учетные данные для виртуальной машины.

    Сценарий выполняется на виртуальной машине. Подключение закрывается автоматически после выполнения команды.

Дополнительные сведения об этом командлете см. в разделе Invoke-Command.

Копирование файлов с помощью New-PSSession и Copy-Item

Замечание

PowerShell Direct поддерживает только постоянные сеансы в сборках Windows 14280 и более поздних версий.

Постоянные сеансы PowerShell невероятно полезны при написании скриптов, которые координирует действия на одном или нескольких удаленных компьютерах. После создания постоянные сеансы существуют в фоновом режиме, пока не решите удалить их. Это означает, что вы можете ссылаться на один и тот же сеанс снова и снова с Invoke-Command помощью или Enter-PSSession без передачи учетных данных.

По тому же маркеру сеансы удерживают состояние. Учитывая, что постоянные сеансы сохраняют свое состояние, любые переменные, которые вы создаете в сеансе или передаете в него, сохраняются при нескольких вызовах. Для работы с постоянными сеансами можно использовать ряд средств. В этом примере используйте New-PSSession и Copy-Item для перемещения данных с узла на виртуальную машину и с виртуальной машины на узел.

Чтобы создать сеанс, скопируйте файлы:

  1. На узле Hyper-V откройте PowerShell от имени администратора.

  2. Выполните одну из следующих команд, чтобы создать постоянный сеанс PowerShell для виртуальной машины с помощью New-PSSession.

    $s = New-PSSession -VMName <VMName> -Credential (Get-Credential)
    $s = New-PSSession -VMId <VMId> -Credential (Get-Credential)
    

    При появлении запроса введите учетные данные для виртуальной машины.

    Предупреждение

    Существует ошибка в сборках до 14500. Если вы явно не указываете учетные данные с флагом -Credential , служба в гостевом случае завершается сбоем и должна быть перезапущена. Если возникла эта проблема, см. раздел "Ошибка: удаленный сеанс может завершиться для обходных инструкций".

  3. Скопируйте файл в виртуальную машину.

    Чтобы скопировать C:\host_path\data.txt на виртуальную машину с узла, выполните следующую команду:

    Copy-Item -ToSession $s -Path C:\host_path\data.txt -Destination C:\guest_path\
    
  4. Скопируйте файл из виртуальной машины (на узел).

    Чтобы скопировать C:\guest_path\data.txt на узел с виртуальной машины, выполните следующую команду:

    Copy-Item -FromSession $s -Path C:\guest_path\data.txt -Destination C:\host_path\
    
  5. Остановите постоянный сеанс с помощью Remove-PSSession.

    Remove-PSSession $s
    

Устранение неполадок

PowerShell Direct предоставляет небольшой набор распространенных сообщений об ошибках. В следующих разделах описываются наиболее распространенные сообщения об ошибках, некоторые причины и средства диагностики проблем.

-VMName или параметры -VMID не существуют

Проблема:

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 не может обрабатывать. Удаленный сеанс может завершиться.

Возможные причины:

  • Виртуальная машина существует, но не запущена.
  • Гостевая ОС не поддерживает PowerShell Direct. См. требования.
  • PowerShell пока недоступен в гостевом приложении
    • Операционная система не завершила загрузку
    • Операционная система не может правильно загрузиться
    • Некоторые события времени загрузки требуют ввода пользователем

Используйте командлет Get-VM , чтобы проверить, какие виртуальные машины выполняются на узле.

Сообщение об ошибке:

New-PSSession: произошла ошибка, которую Windows PowerShell не может обрабатывать. Удаленный сеанс может завершиться.

Возможные причины:

  • Одна из причин, перечисленных ранее, - все они применяются к New-PSSession
  • Ошибка в текущих сборках, когда необходимо явно передавать учетные данные с помощью -Credential. При возникновении этой ошибки вся служба зависает в гостевой операционной системе и должна быть перезапущена. Можно проверить, доступен ли сеанс с помощью enter-PSSession.

Чтобы обойти проблему с учетными данными, войдите на виртуальную машину с помощью VMConnect, откройте PowerShell и перезапустите службу vmicvmsession с помощью следующей команды PowerShell:

Restart-Service -Name vmicvmsession

Ошибка: не удается разрешить набор параметров

Сообщение об ошибке:

Enter-PSSession: невозможно определить набор параметров с помощью указанных именованных параметров.

Возможные причины:

  • Невозможно использовать -RunAsAdministrator при подключении к виртуальным машинам.

    При подключении к контейнеру -RunAsAdministrator Windows флаг разрешает подключения администратора без явных учетных данных. Так как виртуальные машины не предоставляют узлу подразумеваемый доступ администратора, необходимо явно ввести учетные данные.

Учетные данные администратора можно передать виртуальной машине с параметром -Credential или ввести вручную при появлении запроса.

Ошибка: недопустимые учетные данные

Сообщение об ошибке:

Enter-PSSession: недопустимые учетные данные.

Возможные причины:

  • Не удалось проверить учетные данные гостя

Ошибка: Входной параметр VMName не соответствует ни одной виртуальной машине.

Сообщение об ошибке:

Enter-PSSession. Входной параметр VMName не разрешается для любой виртуальной машины.

Возможные причины:

  • Вы не являетесь администратором Hyper-V.
  • Виртуальная машина не существует.

Используйте командлет Get-VM , чтобы убедиться, что учетные данные, которые вы используете, имеют роль администратора Hyper-V и чтобы узнать, какие виртуальные машины выполняются локально на узле и загружаются.

Примеры и пользовательские руководства

PowerShell Direct поддерживает JIT-администрирование (JEA).

Ознакомьтесь с примерами на сайте GitHub.