Удаленное выполнение PowerShell с помощью Invoke-Command
Командлет Invoke-Command позволяет выполнить команду на одном или нескольких удаленных компьютерах.
Например, для запуска одиночной команды на удаленном компьютере можно использовать такую команду:
Invoke-Command -ComputerName dc01 -ScriptBlock {$PSVersionTable.PSVersion}
1 | Invoke-Command-ComputerNamedc01-ScriptBlock{$PSVersionTable.PSVersion} |
Эта команда выведет в вашу консоль значение версии PowerShell, установленной на удаленном компьютере, имя которого указано в параметре
-ComputerName. В блоке
-ScriptBlock{cmdlet} указывается команда, которую нужно запусть на удаленном компьютере.
По-умолчанию команда, посланная через Invoke-Command выполняется на удалённом компьютере от текущего пользователя. Если нужно выполнить команду от имени другого пользователя, сначала нужно запросить учетные данные пользователя и сохранить их в переменную:
$cred = Get-Credential
Invoke-Command -ComputerName comp-buh2 -Credential $cred -ScriptBlock {Get-NetAdapter}
1 |
$cred=Get-Credential Invoke-Command-ComputerNamecomp-buh2-Credential$cred-ScriptBlock{Get-NetAdapter} |
Эта PowerShell команда выведет список сетевых интерфейсов на удаленном компьютере:
Можно задать несколько команд в блоке ScriptBlock, их нужно разделить точкой с запятой. Например следующая команда выведет текущий часовой пояс и изменит его на другой:
Invoke-Command -Computername dc01 -ScriptBlock {Get-TimeZone| select DisplayName;Set-TimeZone -Name «Astrakhan Standard Time”}
1 | Invoke-Command-Computernamedc01-ScriptBlock{Get-TimeZone|select DisplayName;Set-TimeZone-Name»Astrakhan Standard Time”} |
Invoke-Command позволяет выполнять не только отдельные команды, но и запускать скрипты PowerShell. Для этого используется аргумент
-FilePath (вместо –ScriptBlock). При этом вы указываете путь к локальному PS1 файлу скрипта на вашем компьютере (вам не нужно копировать файл скрипт на удаленный компьютер):
Invoke-Command -ComputerName Server01 -FilePath c:\PS\Scripts\GetComputerInfo.ps1
1 | Invoke-Command-ComputerName Server01-FilePathc\PS\Scripts\GetComputerInfo.ps1 |
Запуск
За управление службами отвечает SCM. Каждая операция запуска должна проходить через SCM, чтобы он мог отслеживать состояния служб. Поэтому, даже если пользователь хочет вручную инициировать запуск через скрипт службы, этот запуск должен быть выполнен как запрос к SCM. В этом случае последовательность операция перечислена ниже.
- Пользователь (администратор) запускает первый экземпляр: PSService.ps1 –Start.
- Этот первый экземпляр сообщает SCM запустить службу: Start-Service $serviceName.
- SCM выполняет PSService.exe. Ее процедура Main создает объект службы, а затем вызывает его метод Run.
- SCM вызывает метод OnStart объекта службы.
- C#-метод OnStart запускает второй экземпляр скрипта: PSService.ps1 –Start.
- Этот второй экземпляр, теперь выполняемый в фоне как системный пользователь, запускает третий экземпляр, который останется в памяти как настоящая служба: PSService.ps1 –Service. Этот экземпляр и работает как служба.
В итоге будут выполняться две задачи: PSService.exe и экземпляр PowerShell.exe, выполняющий PSService.ps1 –Service.
За управление службами отвечает SCM.
Все это реализуется тремя частями кода в скрипте.
Определение ключа –Start в блоке Param в начале скрипта:
В процедуре Main в конце скрипта блок if обрабатывает ключ –Start:
Фрагмент исходного кода на C#, процедура Main и обработчик для OnStart, который выполняет команду PSService.ps1 –Start, как показано на рис. 4.
Рис. 4. Обработчик стартового кода
Как запустить скрипт PowerShell?
Есть несколько различных способов запуска скрипта, ниже приведены основные:
- Запустить оболочку PowerShell и в ней запустить скрипт (ввести путь до файла и имя файла, например, так: C:\Scripts\test.ps1, или перейти в папку скрипта командой cd C:\Scripts и запустить его командой .\test.ps1)Оболочку можно найти и запустить множеством способов. Один из способов — через меню «Пуск». Для Windows 7 — нужно зайти во «Все программы» — «Стандартные» — «Windows PowerShell» и запустить оболочку «Windows PowerShell». Для Windows 10 — нужно найти группу на букву «W» и в ней вы найдете «Windows PowerShell».
- Запустить «Интегрированную среду сценариев Windows PowerShell ISE» — это программа — среда разработки, позволяющая редактировать и отлаживать скрипты PowerShell, которая так же есть по-умолчанию вместе с самим PowerShell. Запустив ее, нужно просто нажать кнопку «Открыть» или зайти в меню Файл — Открыть и выбрать нужный скрипт, затем нажать F5 или кнопку «Выполнить скрипт».Найти Windows PowerShell ISE можно там же, где и оболочку PowerShell — в меню «Пуск».
- Запустить стандартную коммандную строку и в ней написать:powershell -file <имя_скрипта> (пример: powershell -file myscript.ps1)
Если вы раньше не запускали скрипты PowerShell, то скорее всего, вы получите сообщение: Не удается загрузить файл <имя_скрипта>, так как выполнение скриптов запрещено для данной системы. Введите «get-help about_signing» для получения дополнительных сведений. Связано это с тем, что из соображений безопасности и недопущения случайного выполнения вредоносного кода, все скрипты должны быть подписаны цифровой подписью.
Как открыть командную строку от имени администратора в Windows 10
Пуск
В первых версиях операционной системы Windows 10 была возможность открыть командную строку от имени администратора выбрав соответствующий пункт в контекстном меню пуск. После нескольких обновлений, а именно начиная с обновления Windows 10 версии 1703, пункт выбора командной строки был заменен на оболочку Windows PowerShell, которая обладает более широким функционалом.
Ранее мы уже рассматривали как вернуть командную строку вместо оболочки Windows PowerShell в инструкции: Как удалить PowerShell в Windows 10. После чего можно будет запустить командную строку от имени администратора используя контекстное меню кнопки пуск.
- Переходим в Пуск > Параметры > Персонализация > Панель задач.
- Дальше изменяем значение пункта Заменить командную строку оболочкой Windows PowerShell в меню, которое появляется при щелчке правой кнопкой мыши по кнопке Пуск на Отключено.
Теперь для запуска командной строки от имени администратора достаточно нажать правой кнопкой мыши на иконку меню пуск и выбрать пункт Командная строка (администратор). А также возможность открыть контекстное меню кнопки пуск можно используя комбинацию клавиш Win+X.
Если же оболочка Windows PowerShell Вас полностью устраивает, тогда можно запустить командную строку через Windows PowerShell от имени администратора. После запуска оболочки Windows PowerShell с правами администратора, командная строка также будет запущена в окне оболочки PowerShell с правами администратора.
- Нажимаем сочетание клавиш Win+X и в контекстном меню выбираем пункт Windows PowerShell (администратор).
- В открывшемся окне выполняем команду cmd, после чего можно будет пользоваться окном PowerShell, как командной строкой.
Поиск
Обновленный поиск позволяет быстро найти и запустить любое приложение в операционной системе Windows 10. Пользователю достаточно нажать кнопку Пуск и начать вводить название Командная строка для быстрого поиска. После чего в результатах поиска нажать правой кнопкой на классическое приложение Командная строка и в контекстном меню выбрать пункт Запуск от имени администратора.А также есть возможность закрепить командную строку на начальном экране или панели задач. Там также после открытия контекстного меню на иконке командной строке будет возможность выбрать пункт запуск от имени администратора.
Проводник
Ранее мы рассматривали как запустить программу от имени администратора Windows 10. Так как командная строка является классическим приложением, то способ с использованием проводника можно также использовать. Поэтому пользователю достаточно перейти по пути: C:\ Windows\ System32 и найти классическое приложение командной строки с названием cmd.exe. Дальше необходимо нажать правой кнопкой мыши на текущее приложение и в открывшемся контекстном меню выбрать пункт Запуск от имени администратора.
Диспетчер задач
Диспетчер задач позволяет отключать, перезапускать и создавать новые задачи. Примером отключения и повторного запуска есть перезапуск Проводника в Windows 10. Текущий способ использует окно выполнить вызываемое комбинацией клавиш Win+R, но уже с возможностью запускать классические приложения с правами администратора.
- Пользователю достаточно открыть диспетчер задач используя комбинацию Ctrl+Shift+Esc или выбрав пункт Диспетчер задач в контекстном меню панели задач.
- Дальше в открывшемся окне диспетчера задач нажать копку меню Файл > Запустить новую задачу.
- В открывшемся окне создания задачи вводим команду Cmd, и отметив пункт Создать задачу с правами администратора нажимаем кнопку ОК.
Заключение
Для запуска любых приложений и командной строки от имени администратора необходимо обладать правами администратора в операционной системе Windows 10. Если же Вы являетесь администратором устройства, тогда у Вас есть возможность открыть командную строку от имени администратора для полноценного использования.
Обратите внимание что после перехода на операционную систему Windows 10 версии 1703 и новее пункт командной строки был заменен на Windows PowerShell. Именно поэтому если Вы привыкли пользоваться командной строкой обратите внимание как вернуть командную строку вместо PowerShell в Windows 10
Как альтернатива можно выбрать другой способ как можно открыть командную строку от имени администратора в Windows 10.
Адаптация службы
Чтобы создать собственную службу, просто сделайте следующее.
- Скопируйте службу-пример в новый файл с новым базовым именем, например C:\Temp\MyService.ps1.
- Измените длинное название службы в разделе глобальных переменных.
- Замените блок TO DO в обработчике –Service в конце скрипта. На данный момент блок while ($true) просто содержит макетный код, который пробуждается через каждые 10 секунд и записывает в файл журнала одно сообщение:
Установите и приступайте к тестированию:
В остальной части скрипта ничего изменять не следует, кроме добавления поддержки новых средств SCM вроде состояния Paused.
Улучшенные возможности редактирования с помощью Visual Studio Code
Visual Studio Code (VS Code) с расширением PowerShell — поддерживаемая среда написания скриптов для PowerShell 7. Интегрированная среда сценариев (ISE) Windows PowerShell поддерживает только Windows PowerShell.
Обновленное расширение PowerShell включает в себя:
- новый режим совместимости ISE;
- PSReadLine в интегрированной консоли, в том числе выделение синтаксиса, многострочное редактирование и обратный поиск;
- повышенную стабильность работы и производительность;
- интеграцию с CodeLens;
- усовершенствованное автоматическое заполнение пути.
Чтобы упростить переход на Visual Studio Code, используйте возможность Enable ISE Mode (Включить режим ISE), доступную в палитре команд. Эта функция переключает VS Code в режим макета в стиле ISE. Режим макета в стиле ISE предоставляет все новые функции и возможности PowerShell в знакомом пользовательском интерфейсе.
Чтобы переключиться на новый макет ISE, нажмите клавиши CTRL+SHIFT+P, чтобы открыть палитру команд, введите и выберите PowerShell: Enable ISE Mode (PowerShell: включить режим ISE).
Чтобы задать исходный макет, откройте палитру команд и выберите PowerShell: Disable ISE Mode (restore to defaults) (PowerShell: выключить режим ISE (восстановить значения по умолчанию)).
Дополнительные сведения о настройке макета VS Code для ISE см. в статье Репликация функций интегрированной среды скриптов в Visual Studio Code.
Примечание
Добавление в ISE новых возможностей сейчас не планируется. Теперь ISE в последних версиях Windows 10 или Windows Server 2019 и более поздних может удалить пользователь. Окончательное удаление ISE сейчас не планируется. Команда PowerShell и ее партнеры по работе сейчас работают над совершенствованием возможностей написания скриптов с использованием расширения PowerShell для Visual Studio Code.
Развертывание в Windows 10 IoT КорпоративнаяDeploying on Windows 10 IoT Enterprise
Windows 10 IoT Корпоративная поставляется со средой Windows PowerShell, которую можно использовать для развертывания PowerShell 7.Windows 10 IoT Enterprise comes with Windows PowerShell, which we can use to deploy PowerShell 7.
-
Создайте для целевого устройстваCreate to target device
-
Скопируйте ZIP-файл на устройствоCopy the ZIP package to the device
-
Присоединитесь к устройству и извлеките архивConnect to the device and expand the archive
-
Настройте удаленное взаимодействие с PowerShell 7Set up remoting to PowerShell 7
-
Подключение к конечной точке PowerShell 7 на устройствеConnect to PowerShell 7 endpoint on device
Используем Invoke-Command для параллельного запуска команд на нескольких компьютерах
Командлет Invoke-Command можно использовать для параллельного выполнения команд на нескольких удаленных компьютерах.
В самом просто случае имена компьютеров, на которых нужно выполнить команды указываются через запятую:
Invoke-Command server1, server2, server3 -ScriptBlock {get-date}
1 | Invoke-Command server1,server2,server3-ScriptBlock{get-date} |
Список компьютеров можно поместить в переменную (массив):
$servers = @(″server1″,″server2″,″server3″)
Invoke-Command -ScriptBlock { get-date} -ComputerName $servers
1 |
$servers=@(″server1″,″server2″,″server3″) Invoke-Command-ScriptBlock{get-date}-ComputerName$servers |
Или получить из текстового файла:
Invoke-Command -ScriptBlock {Restart-Service spooler} -ComputerName(Get-Content c:\ps\servers.txt)
1 | Invoke-Command-ScriptBlock{Restart-Service spooler}-ComputerName(Get-Contentc\ps\servers.txt) |
Также можно получить список компьютеров в ADс помощью командлета Get-ADComputer из модуля AD PowerShell:
Чтобы выполнить команду на всех Windows Server в домене, исопльзуйте такой код:
$computers = (Get-ADComputer -Filter ‘operatingsystem -like «*Windows server*» -and enabled -eq «true»‘).Name
Invoke-Command -ComputerName $computers -ScriptBlock {get-date} -ErrorAction SilentlyContinue
1 |
$computers=(Get-ADComputer-Filter’operatingsystem -like «*Windows server*» -and enabled -eq «true»‘).Name Invoke-Command-ComputerName$computers-ScriptBlock{get-date}-ErrorAction SilentlyContinue |
Если компьютер выключен, или недоступен, благодаря параметру SilentlyContinue скрипт не будет остановлен и продолжит выполнение на других компьютерах.
Чтобы понять с какого компьютера получены результаты, нужно использовать специальную переменную окружения PSComputerName.
$results = Invoke-Command server1, server2, server3 -ScriptBlock {get-date}
$results | Select-Object PSComputerName, DateTime
1 |
$results=Invoke-Command server1,server2,server3-ScriptBlock{get-date} $results|Select-ObjectPSComputerName,DateTime |
При запуске команды через Invoke-Command на нескольких компьютерах она выполняется параллельно. В Invoke-Command есть ограничение на максимальное количество компьютеров, которыми можно управлять одновременно (ограничение на количество одновременных PSSession). Оно определяется параметром ThrottleLimit (по умолчанию 32). Если вам нужно выполнить команду одновременно более чем на 32 компьютерах (например, на 128), используйте параметр –ThrottleLimit 128 (но это вызывает повышенную нагрузку на ваш компьютер).
Для запуска команд на удаленных компьютерах через Invoke-Command в фоновом режиме используется специальный атрибут
–AsJob. В этом случае результат выполнения команды не возвращается в консоль. Чтобы получить результаты нужно использовать командлет
Receive-Job.
Способ №4 — упрощаем запуск для избранных приложений при помощи планировщика заданий (запрос UAC не отображается)
Важно! Этот способ работает только для учетных записей, входящих в группу Администраторы. У обычных пользователей он не сработает, потому что их потолком являются ограниченные права
Переходим к самому интересному способу. Если есть приложение, которое Вы постоянно запускаете, и оно получено от надёжного производителя ПО, например, это приложение Windows — можно упростить запуск. Создание ярлыка для нужной программы не занимает более 2-х минут и это позволит избавиться от лишних действий в дальнейшем. Запускаем планировщик заданий (Пуск —> Все программы —> Стандартные —> Служебные —> Планировщик заданий) и нажимаем «Создать задачу»:
Указываем Имя для новой задачи и ставим флажок «Выполнять с наивысшими правами»:
Переходим на вкладку Действия, нажимаем «Создать», в следующем окне нажимаем «Обзор»:
Указываем путь к нужному приложению и нажимаем «Открыть»:
Нажимаем «ОК»:
И ещё раз «ОК»:
Закрываем планировщик и переходим к созданию ярлыка.
Чтобы создать ярлык на рабочем столе, щёлкаем правой клавишей мыши, выбираем «Создать» —> «Ярлык»:
В поле Расположение объекта вводим:
schtasks /run /tn cmd_admin
где cmd_admin — имя созданной нами задачи. Если имя содержит пробелы, его необходимо указывать в кавычках.
Задаём название ярлыка:
Ярлык создан и готов к использованию.
Чтобы сменить значок — нажмите правой клавишей мыши по ярлыку, выберите «Свойства»:
Перейдите на вкладку «Ярлык» и нажмите «Сменить значок»:
«Обзор…»
Указываем путь к программе:
Выбираем нужный значок и закрываем оба окна кнопкой «ОК»:
Теперь запуск нужного приложения от имени администратора выполняется двойным щелчком по созданному ярлыку, при этом запрос UAC не отображается и безопасность остаётся в сохранности.
Утилита для автоматизации «Способа №4»
В случае, если требуется создать ярлыки для большого количества программ, удобно воспользоваться утилитой Elevated Shortcut.
Работа с утилитой сводится к двум простым шагам:
- Установка
- Перетаскивание исполняемого файла (*.exe, *.bat, *.cmd) на ярлык утилиты:
Выражаю благодарность автору программы — hb860.
Автоперевод фокуса на запущенную программу
Специфика запуска приложений из планировщика состоит в том, что фокус на окно не переводится и, например чтобы набрать команду в командной строке приходится дополнительно щёлкать по окну. Такое поведение может помочь в автоматизации рутинных операций по расписанию, но для «Способа №4» это не всегда удобно.
Для «обхода» существует несколько методов. Работают они немного по-разному, так что выбирайте наиболее подходящий. Первый более удобен для запуска программ, а второй для запуска скриптов.
Добавляем при создании задачи:
Использование команды start
Программа или сценарий:
cmd.exe
Аргументы:
/c start /d "путь_к_программе" имя_файла.exe
Пример:
/c start /d "C:\Windows\System32\" cmd.exe
Использование утилиты NirCmd
Программа или сценарий:
путь_к_nircmd\nircmd.exe
Аргументы:
exec show "путь_к_программе\имя_файла.exe"
Пример:
exec show "C:\Windows\System32\cmd.exe"
Запуск диалога «Выполнить» от имени администратора
По аналогии с запуском командной строки можно настроить запуск диалогового окна «Выполнить», и введённые в него команды также будут запущены от имени администратора. Удобство этого подхода заключается в том, что список ранее использованных команд сохраняется, и можно выбрать нужную из списка.
При создании задачи в планировщике, в окне «Создание действия» укажите:
в поле «Программа или сценарий»:
rundll32
в поле «Добавить аргументы»:
shell32.dll,#61
В справочнике по командам Windows вы найдете множество команд, которые можно запускать из командной строки или окна «Выполнить».
Быстрое создание задания в планировщике из командной строки
Все вышеперечисленное делается за 30 секунд. В качестве примера используется задание, запускающие окно «Выполнить». В командной строке, запущенной с правами администратора, выполните:
Теперь остается создать ярлык, прописав в нем команду:
Все!
Запуск 32-разрядной версии Windows PowerShellStarting the 32-Bit Version of Windows PowerShell
При установке Windows PowerShell на 64-разрядном компьютере в дополнение к 64-разрядной версии устанавливается Windows PowerShell (x86) — 32-разрядная версия Windows PowerShell.When you install Windows PowerShell on a 64-bit computer, Windows PowerShell (x86), a 32-bit version of Windows PowerShell is installed in addition to the 64-bit version. При открытии Windows PowerShell по умолчанию запускается 64-разрядная версия.When you run Windows PowerShell, the 64-bit version runs by default.
Однако в некоторых случаях нужно запустить Windows PowerShell (x86) , например при использовании модуля, которому требуется 32-разрядная версия, или при удаленном подключении к 32-разрядному компьютеру.However, you might occasionally need to run Windows PowerShell (x86), such as when you’re using a module that requires the 32-bit version or when you’re connecting remotely to a 32-bit computer.
Для запуска 32-разрядной версии Windows PowerShell воспользуйтесь любой из следующих процедур.To start a 32-bit version of Windows PowerShell, use any of the following procedures.
Windows Server 2012 R2In Windows Server 2012 R2
- На экране Пуск щелкните Windows PowerShell (x86) .On the Start screen, type Windows PowerShell (x86). Щелкните плитку Windows PowerShell x86.Click the Windows PowerShell x86 tile.
- Выберите пункт Windows PowerShell (x86) в меню Сервис диспетчера сервера.In Server Manager, from the Tools menu, select Windows PowerShell (x86).
- На рабочем столе переместите курсор в правый верхний угол, щелкните элемент Поиск, введите PowerShell x86 и выберите Windows PowerShell (x86) .On the desktop, move the cursor to the upper right corner, click Search, type PowerShell x86 and then click Windows PowerShell (x86).
- В командной строке введите следующее: Via command line, enter:
Windows Server 2012In Windows Server 2012
- На экране Пуск введите PowerShell и выберите Windows PowerShell (x86) .On the Start screen, type PowerShell and then click Windows PowerShell (x86).
- Выберите пункт Windows PowerShell (x86) в меню Сервис диспетчера сервера.In Server Manager, from the Tools menu, select Windows PowerShell (x86).
- На рабочем столе переместите курсор в правый верхний угол, щелкните элемент Поиск, введите PowerShell и выберите Windows PowerShell (x86) .On the desktop, move the cursor to the upper right corner, click Search, type PowerShell and then click Windows PowerShell (x86).
- В командной строке введите следующее: Via command line, enter:
Windows 8.1In Windows 8.1
- На экране Пуск щелкните Windows PowerShell (x86) .On the Start screen, type Windows PowerShell (x86). Щелкните плитку Windows PowerShell x86.Click the Windows PowerShell x86 tile.
- Если вы используете средства удаленного администрирования сервера для Windows 8.1, можно также открыть Windows PowerShell x86 из меню Сервис диспетчера сервера.If you’re running Remote Server Administration Tools for Windows 8.1, you can also open Windows PowerShell x86 from the Server ManagerTools menu. Выберите Windows PowerShell (x86) .Select Windows PowerShell (x86).
- На рабочем столе переместите курсор в правый верхний угол, щелкните элемент Поиск, введите PowerShell x86 и выберите Windows PowerShell (x86) .On the desktop, move the cursor to the upper right corner, click Search, type PowerShell x86 and then click Windows PowerShell (x86).
- В командной строке введите следующее: Via command line, enter:
Windows 8In Windows 8
- На экране Пуск переместите курсор в правый верхний угол, щелкните Параметры, Плитки, а затем переместите ползунок Показать средства администрирования в значение Да.On the Start screen, move the cursor to the upper right corner, click Settings, click Tiles, and then move the Show Administrative Tools slider to Yes. Введите PowerShell и выберите Windows PowerShell (x86) .Then, type PowerShell and click Windows PowerShell (x86).
- Если вы используете средства удаленного администрирования сервера для Windows 8, можно также открыть Windows PowerShell x86 из меню Сервис диспетчера сервера.If you’re running Remote Server Administration Tools for Windows 8, you can also open Windows PowerShell x86 from the Server ManagerTools menu. Выберите Windows PowerShell (x86) .Select Windows PowerShell (x86).
- На экране Пуск или рабочем столе введите PowerShell (x86) и выберите Windows PowerShell (x86) .On the Start screen or the desktop, type PowerShell (x86) and then click Windows PowerShell (x86).
- В командной строке введите следующее: Via command line, enter:
Выводы статьи
Командная строка используется в операционной системе Windows для изменения настроек или решения различных проблем в работе компьютера. В некоторых ситуациях, пользователь может столкнутся с проблемами при запуске этого системного инструмента.
В окне командной строки появляется запись о том, что приглашение командной строки отключено вашим администратором. Чтобы решить эту проблему, пользователь может воспользоваться помощью встроенных системных средств Windows или сторонними программами.
Похожие публикации:
- Как отключить командную строку — 5 способов
- Команды командной строки Windows: список
- Как в командной строке Windows скопировать или вставить текст
- Диспетчер задач отключен администратором: 7 способов включить
- Экранный диктор: как включить или отключить чтение вслух в Windows