Любой сисадмин слышал про PsExec.
Однако на практике далеко не все знают нюансы использования этой утилиты.
Разберем несколько примеров команд и эти самые нюансы в работы с ней.
PsExec это утилита Марка Руссиновича из написанного им пакета программ Sysinternals, которая позволяет выполнять команды на удаленных компьютерах, в том числе и с системными правами.
PsExec работает только с повышенными привилегиями:
сеанс необходимо запускать под администратором
Для теста можете попробовать создать папку в сеансе без привилегий:
psexec cmd /c md C:\windows\test
В результате вы увидите ошибку Couldn’t install PSEXESVC service
Кстати, если у вас не отображается нормально шрифт, а вместо него видны кракозябры, то можно воспользоваться этим сайтом как переводчиком.
Запуск от имени системы
Так как права System имеют наивысший приоритет, в редких случаях пригодится возможность запуска программ с такими привилегиями.
Например запустить regedit, в котором будут доступны два, по умолчанию скрытых раздела: HKLM\SAM и HKLM\SECURITY
Для это необходимо запустить PsExec с ключом -s
psexec -i -s regedit
Т.е. ключ -i определяет будет ли выведен GUI на экран и возможность взаимодействия с ним.
В противном же случае, если не указать ключ -i, окно запуститься в фоновом режиме, и увидеть и завершить его мы сможет только через диспетчер задач.
Примеры команд
Запуск команды CMD через PsExec на удаленном хосте:
psexec \\host1138 net start "Zabbix Agent"
Получим размер папки Temp на удаленном компьютере с помощью PoSh:
psexec \\host1138 powershell -ExecutionPolicy RemoteSigned -command "'{0:N2}' -f ((gci C:\Windows\Temp | measure Length -Sum).Sum/1MB)"
Скрыть баннер
Что бы при выполнении каждой команды psexec не появлялся баннер с копирайтом, используйте ключ
-nobanner
Массовое выполнение команд
Предварительно создаем файл со списком имен компьютеров.
Используем параметр @ и сразу за ним вводим путь к файлу.
Либо переходим в папку с файлом и обращаемся к нему по относительному пути.
psexec @C:\comps.txt hostname
Команда выполнит поочередно команды на этих ПК.
Так же можно перечислить имена компьютеров через запятую
psexec \\comp01,comp02 hostname
PSexec в Powershell
Весьма удобно использовать PsExec в сценариях Powershell.
Например в скрипте для удаленной установки обновления Skype (8 версии):
# Получаем имя активного пользователя на компьютере и удаляем его доменную часть $Names = (Get-ADComputer -f *).Name foreach($Name in $Names){ $User = ( gwmi Win32_ComputerSystem -ComputerName $Name ).UserName -replace 'DOMAIN\\' $Command = 'cmd /c cd "C:\Users\$User\AppData\Roaming\Microsoft\Skype for Desktop" & start Skype-Setup.exe /VERYSILENT /SP- /NOCANCEL /NORESTART /SUPPRESSMSGBOXES /NOLAUNCH' # Подставляем в основную команду имя активного пользователя $Command = $Command -replace '\$User', $User # Выполняем заготовленную команду на удаленной машине psexec -i -s powershell.exe -inputformat none -Command $Command }
Важный момент
По умолчанию PsExec, в сеансе PowerShell, после выполнения каждой команды возвращает в консоль код ошибки.
В случае отсутствии ошибки кодом будет 0.
Тем не менее оболочка, для того что бы вывести приглашение к вводу, будет ожидать нажатия Enter.
В противном случае выполнение программы остановится и будет висеть, пока вы не остановите ее выполнение вручную.
Понятное дело что на удаленном компьютере мы не желаем ничего нажимать или чего то дожидаться.
Что бы PsExec не зависал,
нам нужно использовать powershell.exe вместе с ключом
-inputformat none
В продолжении темы PsExec предлагаю ознакомиться со статьей по удаленной установке и деинсталляции программ