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


Автоматизация и управление виртуальными машинами с помощью 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.