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


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

Примечание.

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

Постоянные сеансы 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

Ошибка: удаленный сеанс, возможно, завершился

Примечание.

Для ввода-PSSession между сборками узла 10240 и 12400 все ошибки ниже, как "Удаленный сеанс, возможно, завершился".

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

Ввод-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

Ошибка: невозможно разрешить набор параметров

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

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

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

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

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

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

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

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

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

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

  • Не удалось проверить учетные данные гостя
    • Предоставленные учетные данные были неверны.
    • В гостевой системе нет учетных записей пользователей (операционная система не загрузилась раньше)
    • В случае подключения от имени администратора: администратор не был установлен как активный пользователь. Дополнительные сведения см. в разделе "Включение и отключение встроенной учетной записи администратора".

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

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

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

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

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

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

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

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

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