Как запускать команды powershell на удаленных компьютерах

Настраиваем windows remote desktop в командной строке. подключение к удаленному рабочему столу с помощью встроенного в windows rdp-клиента

Если вы интересуетесь использованием Windows Remote Desktop, то вы уже наверняка знаете, что эта служба делает, но, возможно, у вас нет полного представления о ее возможностях. Windows Remote Desktop позволяет вам удаленно контролировать практически любой ПК или сервер с Windows. Вы можете удаленно управлять ПК с ПК, сервером с сервера, ПК с сервера или сервером с ПК.

Серверный компонент RDP встроен в операционную систему Windows — в XP, Vista и Windows 7 (но вы должны включить remote desktop на целевом компьютере). Если вы удаленно работаете с компьютером, это соединение с ПК является единственным, и вы при этом контролируете консоль.

Если же вы работаете с сервером (скажем, с Windows 2003 или 2008), вы можете подключить многих пользователей к серверу с помощью службы Terminal Services.

Однако, вне зависимости от того, используете ли вы серверную ОС или нет, клиентская часть одна и та же — Remote Desktop Connection или клиент Remote Desktop, как я ее называю. Исполняемый файл для удаленного соединения называется mstsc.exe, он располагается в %systemroot%/system32/mstsc.exe.

Давайте же разберемся с тем, что вы можете сделать с помощью mstsc.exe»

Управление byod при помощи powershell

Одна из самых больших проблем, с которыми сталкиваешься при работе с моделью BYOD, – отсутствие управления устройствами пользователей. В Win2021R2 этим заправляет Device Registration Service (DRS), при регистрации на устройство устанавливается сертификат, а в AD создается новый объект устройства.

Этот объект устанавливает связь между пользователем и устройством, создавая нечто вроде двухфакторной аутентификации. Пользователи получают доступ к корпоративным ресурсам, которые были недоступны, когда они работали за пределами доменной сети. Для работы потребуется роль Active Directory Federation Services (AD FS) и собственно служба DRS (устанавливается при помощи командлета Install-AdfsFarm). Теперь инициализируем службу и приступаем к регистрации устройств пользователей.

PS> Initialize-ADDeviceRegistration -ServiceAccountName exampleadfsfarm PS> Enable-AdfsDeviceRegistration

В консоли AD FS Management переходим к Authentication Policies, выбираем Edit Global Primary Authentication и активируем Enable Device Authentication. Теперь, используя командлет Get-AdfsDeviceRegistration, можем просматривать и подтверждать устройства ().

RDCMan: Доступ к консоли виртуальных машин Hyper-V

В RDCMan 2.7 вы можете настроить прямое подключения к консолям виртуальных машин, запущенных на Hyper-V хосте (используется режим Enhanced Session Mode). Для этого вам нужно получить идентификатор виртуальной машины на сервере Hyper-V. Используйте команду:

После того, как вы получили идентификатор ВМ, вы можете использовать его при настройке подключения в RDCMan. При добавлении нового сервера в консоли RDCMan укажите имя Hyper-V хоста, поставьте галку “VM console connect” и в поле ID скопируйте полученный идентификатор ВМ. Подключение выполняется под учетной записью с правами администратора Hyper-V, через шину VMBus (т.е. вам не нужен сетевой доступ к IP адресу гостевой ОС – доступ работает через Hyper-V хост по порту 2701).

RDCMan имеет простой пользовательский интерфейс и очень прост в использовании. Есть также версия для установки на Linux.

Если вам просто нужен менеджер RDP соединений, то это отличный и простой в использовании повседневный инструмент Windows администратора.

Привет, Хабр! Данный пост написан исключительно с целью пролить свет на незаслуженно затерянную в дебрях Microsoft программку, а не для обзора всех ее возможностей. Здесь даже не будет ссылки на скачивание. Но обо всем по порядку.

Предисловие

Пост хабражителя навеял размышления об удобстве удаленного управления серверами. И в частности оными под управлением Windows Server. Для *nix систем использую старушку putty и идея мега-комбайна мне не по душе. Но это, конечно же, сугубо личное мнение. Скажу честно, раньше я был достаточно ленив и пользовался стандартным клиентом удаленного рабочего стола аля mstsc.exe. Но перейдя в другую компанию, с количеством серверов на порядок больше, бесконечные окна терминалов стали утомлять. Программы наподобие Radmin и DWNTU устанавливают свои модули/службы на каждый компьютер, которым необходимо управлять. А так хотелось чего-то родного (т.е. работающего по протоколу rdp), а также бесплатного. Не буду перечислять список монстроидальных комбайнов и простых программ, которые были протестированы, также воздержусь от перечислений их плюсов и минусов, достойных хватает.

Случайная находка

Отдельно хочу остановиться на программке, на которую я наткнулся случайно. Эта легковесная (менее 800 Кб) и, как оказалось, весьма удобная программка не требует настройки сотни параметров, не поддерживает скины и не просит отдельную БД для хранения параметров подключений. Зато выполняет свое основное предназначение на отлично. Зовут ее Remote Desktop Connection Manager или rdcm или RDCMan, как называет ее сама Microsoft. Последняя версия датируется 2010 годом, но это никак не сказывается на функциональности. Проверил ее в работе и с 2000 и с 2008R2 серверами (с 2012 пока не было возможности протестировать). Помимо стандартного набора функций типа хранения и подстановки логина/пароля, избранного и т.д. т.п. в программе есть своя изюминка, а точнее три.

  • Возможность подключиться к консоли. Для меня это очень полезно, т.к. компания строго соблюдает лицензионную политику поэтому служба терминалов установлена далеко не на каждом сервере. По-умолчанию Windows Server разрешает два одновременных подключения remote desktop. Эта же функция позволяет «поднять» ограничение до трех. Да-да, это есть и в стандартном клиенте, но далеко не у всех конкурентов.
  • Интерактивные миниатюры открытых подключений, обновляющиеся в реальном времени. Т.е. можно не только наблюдать за происходящим на нескольких серверах одновременно, но и нажать, например, ОК в выскочившем окне, прямо в миниатюре. Не ключевая функция, конечно, но у конкурентов не замечена.
  • Древовидное представление списка серверов и открытых подключений. Стоит немного привыкнуть и оно оказывается гораздо удобнее вкладок. Опять же IMHO, поэтому на третьем месте.

Не хватает разве что функции добавления серверов через сканирование сети.

Никому не известная

Основной фактор побудивший написать данную статью это то, что программка малоизвестна, редко кто ею пользуется и с моей точки зрения это не заслуженно. Никто из моих коллег не слышал о такой. Конечно не показатель, но все же. Обошли ее стороной и в Википедии. Найти rdcm можно на английской версии сайта Microsoft

Если заинтересовались, ищите по полному названию.Спасибо за внимание.

Управление WFAS

Настройка брандмауэра Windows в режиме повышенной безопасности WFAS (Windows Firewall with Advanced Security) традиционно производится при помощи netsh advfirewall, появившейся в ОС начиная с Win2k8/Vista и практически не изменившейся с тех пор. Контекст advfirewall позволяет использовать семь команд (export, import, dump, reset, set, show и help) и четыре субконтекста (consec, firewall, mainmode и monitor). Просмотреть подробности можно, использовав ключ help или ‘/?’, да и в Сети доступно достаточное количество примеров. Например, команда set позволяет сконфигурировать профили, show — просмотреть состояние. Смотрим настройки по умолчанию, активируем профили и для Domain действием по умолчанию установим блокировку.

Официальная информация гласит, что в следующих релизах netsh может пропасть, а использовать следует командлеты PowerShell, позволяющие к тому же контролировать еще больше функций. Командлеты NetSecurity доступны только в PS 3.0, для их использования в Win2012/8 их необходимо импортировать Import-Module NetSecurity. При помощи Get-Command firewall получим список из 27 командлетов (полный список командлетов модуля — goo.gl/Aj9Mg4). Ситуацию упрощает то, что названия командлетов пересекаются с командами netsh.

Теперь тот же пример, но средствами PS:

Как видим, командлеты выглядят даже проще. Вместо параметра All можно указать на конкретный профиль: –Profile Domain,Public,Private.

Доступны и прочие функции. Например, можем исключить Ethernet-интерфейс из профиля Public.

Чтобы вернуть настройки в исходное состояние, достаточно вместо Ethernet установить NotConfigured. Дополнительные параметры командлета Set-NetFirewallProfile позволяют настроить журналирование, добавить IP, порт, протокол и многое другое. Все манипуляции с правилами производятся при помощи семи командлетов: New|Set|Copy|Enable|Disable|Remove|Rename-NetFirewallRule. Чтобы просмотреть установленные правила, используем командлет Get-NetFirewallRule, при помощи фильтров мы можем легко отобрать нужные. Например, блокирующие и все, что касается IE:

Создадим правило, блокирующее исходящие соединения для IE в двух профилях.

Теперь к правилу можем добавить протокол, порт и IP удаленной и локальной системы.

Выполнить одну удаленную команду

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

  Invoke-Command -ComputerName COMPUTER -ScriptBlock {COMMAND} -credential USERNAME 

«КОМПЬЮТЕР» представляет имя или IP-адрес удаленного ПК. «КОМАНДА» — это команда, которую вы хотите выполнить. «ИМЯ ПОЛЬЗОВАТЕЛЯ» — это имя пользователя, для которого вы хотите выполнить команду, как на удаленном компьютере. Вам будет предложено ввести пароль для имени пользователя.

Вот пример. Я хочу просмотреть содержимое каталога C: \ на удаленном компьютере с IP-адресом 10.0.0.22. Я хочу использовать имя пользователя «wjgle», поэтому я бы использовал следующую команду:

  Invoke-Command -ComputerName 10.0.0.22 -ScriptBlock {Get-ChildItem C: \} -credential wjgle 

Создание соединений, символических и жестких ссылок

Командлеты: New-Item, Remove-Item, Get-ChildItem

У меня в блоге хватает рассказов про ссылки NTFS, поэтому я не мог обойти вниманием возможность их создания в PowerShell

#Символическая ссылка на файл
New-Item -ItemType SymbolicLink -Path C:\test\MySymLinkFile.txt -Target C:\test\1.txt
#Символическая ссылка на папку
New-Item -ItemType SymbolicLink -Path C:\test\MySymLinkFolder -Target C:\Windows\
#Жесткая ссылка на файл
New-Item -ItemType HardLink -Path C:\Test\MyHardLinkFile.txt -Target C:\test\1.txt
#Соединение
New-Item -ItemType Junction -Path C:\Temp\MyJunctionDir -Target C:\Windows

Честно говоря, синтаксис команды mklink запомнить проще, поэтому быстрее может получиться так:

Командлеты для работы с Active Directory (AD)

Windows PowerShell, конечно же, позволяет работать со службой каталогов Active Directory. Для этих целей существует немало командлетов, вот некоторые из них:

  • New-ADUser – создание нового пользователя в Active Directory;
  • Get-ADUser – выводит информацию о пользователях Active Directory;
  • Set-ADUser — изменяет пользователя Active Directory;
  • Remove-ADUser — удаляет пользователя Active Directory;
  • New-ADGroup – командлет создает группу в Active Directory;
  • Get-ADGroup – выводит информацию о группе или выполняет поиск, чтобы получить несколько групп из Active Directory;
  • Set-ADGroup – командлет изменяет группу в Active Directory;
  • Remove-ADGroup — удаление группы в Active Directory;
  • Add-ADGroupMember — командлет добавляет учетные записи пользователей, компьютеров или групп в качестве новых членов группы Active Directory;
  • Get-ADGroupMember — выводит информацию о членах группы Active Directory;
  • Remove-ADGroupMember — удаление элементов из группы Active Directory;
  • Set-ADAccountPassword — сброс пароля учетной записи Active Directory;
  • Disable-ADAccount — отключает учетную запись Active Directory.
  • Enable-ADAccount — включает учетную запись Active Directory;
  • Unlock-ADAccoun — разблокирует учетную запись Active Directory;
  • New-ADComputer — создание новой учетной записи компьютера в Active Directory;
  • Get-ADComputer — выводит информацию об одном или нескольких компьютерах в Active Directory;
  • Set-ADComputer — изменение учетной записи компьютера в Active Directory;
  • Remove-ADComputer — удаление компьютера из Active Directory.

Зачем вам нужен PowerShell

Просто так изучать PowerShell нет смысла, и это верно для любого языка – скриптового, программного и даже человеческого. Как и многие решения Microsoft, PowerShell делается с прицелом на бизнес для автоматизации задач по управлению ПК и серверами в организациях.

В основе скриптового языка лежит мощная программная платформа .NET, поэтому возможности PowerShell простираются намного дальше администрирования.

Как-то раз мне понадобилось удалить один столбец из множества книг Excel 2013. Ручная работа претила, а гугление не давало готового решения. Я создал тему на форуме (да, я тоже иногда задаю вопросы на OSZone :). Мне подходил любой язык, но решение неожиданно для меня оказалось на PowerShell. Как выяснилось, можно загрузить Excel в качестве COM-объекта и манипулировать им дальше.

Впоследствии я не раз использовал модификацию того скрипта для автоматического обновления десятков книг Excel, подтягивающих данные из других файлов. Это сэкономило мне массу времени и сил.

Думаю, идея понятна, и можно уже переходить к новинкам PowerShell 5.0.

Как выключить компьютер через командную строку

Для начала давайте я вам напомню, как производилось выключение компьютера из командной строки, если вы постоянный читатель моего блога, то помните, что мы уже создавали задание по выключению систему по таймеру, там мы так же использовали cmd. Что мы делаем, открываем окно командной строки, желательно в режиме администратора, чтобы все команды у вас точно отработали.

Есть такая замечательная команда Shutdown, она имеет два режима работы, первый это консольный, а второй графический, да не удивляйтесь. Давайте для начала посмотрим справку по данной утилите, для этого выполните команду:

shutdown /?

Утилита имеет большое количество ключей для различных сценариев.

Самый простой сценарий, нужно завершить работы локального компьютера и для того, чтобы выключить компьютер через командную строку вы вводите:

shutdown /s

У вас появится всплывающее окно, где будет указано, что ваш сеанс будет завешен. Для завершения работы Windows осталось менее 1 минуты. Тут вам дают возможность успеть сохранить важные данные в программах и документах.

Теперь давайте поиграемся с таймером, у вас может быть желание немедленного завершения работы или наоборот вы хотите задать время превышающее стандартную минуту, тут нам поможет ключ /t, в там случае команда будет выглядеть так:

shutdown -s -t 0

При t = 0 у меня будет произведено моментальное выключение компьютера, если же я например задам 180, что равносильно трем минутам, то вы увидите вот такое окно:

shutdown -s -t 180

Если у вас время в ключе /f задано более , то вы можете столкнуться с ситуацией, что какие-то приложения могут не дать завершить работу системы и выключить компьютер. В таких сценариях вы можете принудительно их завершать, для этого есть ключ /f:

shutdown -s -t 180 -f

Или вы вообще можете захотеть, выключить компьютер через 2 часа. это в секундах 7200. Так же есть отдельный ключ, который сразу завершает работу вашей системы, без ввода времени, этот ключ /p. В итоге можно выключить компьютер командой

shutdown /p

Если вы хотите задать комментарий при выключении компьютера из командной строки и задать причину, то есть ключи /c и /d. Ключ /c задает комментарий, который не может быть длиннее, чем 512 символов. Ключ /d указывает причину, тут может быть совместный ключ «p», означающий запланированное завершение или же ключ «u», означающий что причину указывает пользователь.

shutdown -s -t 0 -c «Мне так захотелось» -d p:4:1

В логах Windows вы можете обнаружить событие 1074 с нашим комментарием. Согласитесь, что это отличный инструмент выключить компьютер без помощи мышки.

How to Run PowerShell Command from PSexec?

You can use the PsExec tool from Sysinternals to run PowerShell commands against a remote computer. In this case, you don’t need to enable and configure WinRM on the remote host.

To execute a PowerShell command on a remote Windows host:

  1. Download and extract the PsExec (https://docs.microsoft.com/en-us/sysinternals/downloads/psexec);
  2. Open a command prompt as an administrator and change to the directory with psexec.exe: cd c:\ps\tools
  3. Now you can run a single PowerShell command on a remote computer:
    psexec.exe \\SrvNY01 powershell.exe -command "& {get-process}"

You can run several commands at once:

psexec.exe \\SrvNY01 powershell.exe -command "& {get-process;Get-Services; Get-CimInstance -ClassName Win32_OperatingSystem | Select LastBootUpTime

Your PowerShell commands will be run on the remote machine and psexec will return exit code 0.

If you need to remotely run a local PS1 script file:

psexec -s \\ SrvNY01 Powershell -ExecutionPolicy Bypass -File \\dc1\netlogon\scripts\Get-Info.ps1

Also, note that many built-in PowerShell commands have a ComputerName parameter that allows you to directly access a remote computer over the network. You can get a list of such commands:

Get-Command | Where-Object {$_.parameters.keys -contains "ComputerName"}

For example, you can get Event Logs from a remote computer:

Get-EventLog -LogName System -computername SrvNY01| where {$_.EventId -eq 1074}

Or reboot remote hosts:

Restart-Computer -ComputerName SrvNY03, SrvNY02, SrvNY01

As you can see, PowerShell provides ample opportunities for running scripts and commands on remote computers.

Как работать с командлетами, которые имеют параметр ComputerName для дистанционного получения данных

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

Поскольку эти командлеты не используют WS-Management на базе Windows PowerShell Remoting, вы можете использовать параметр ComputerName этих командлетов на любом компьютере под управлением Windows PowerShell. Компьютеры могут быть не настроены для работы Windows PowerShell Remoting, и компьютеры могут не отвечать требованиям к системам для удаленного доступа.

Ниже приведён список командлетов имеющих параметр ComputerName:
Clear-EventLog
Get-Counter
Get-EventLog
Get-HotFix
Get-Process
Get-Service
Get-WinEvent
Get-WmiObject
Limit-EventLog
New-EventLog
Remove-EventLog
Restart-Computer
Stop-Computer
Show-EventLog
Test-Connection
Write-EventLog

Для примера, следующая команда получает службы на удаленном компьютере Server01:

PowerShell

Get-Service -ComputerName Server01

1 Get-Service-ComputerNameServer01

Обычно командлеты, поддерживающие удаленную работу без специальной настройки, имеют параметр ComputerName и не имеют параметра Session. Чтобы отобразить эти командлеты надо выполнить следующую команду:

PowerShell

Get-Command | where { $_.Parameters.Keys -contains «ComputerName» -and $_.Parameters.Keys -NotContains «Session»}

1 Get-Command|where{$_.Parameters.Keys-contains»ComputerName»-and$_.Parameters.Keys-NotContains»Session»}

Включите удаленно PowerShell на ПК, на котором вы хотите получить доступ удаленно

Ваш первый шаг — включить PowerShell Remoting на ПК, для которого вы хотите сделать удаленные подключения. На этом ПК вам нужно будет открыть PowerShell с правами администратора.

В Windows 10 нажмите Windows + X, а затем выберите PowerShell (Admin) в меню Power User.

В Windows 7 или 8 нажмите «Пуск», а затем введите «powershell». Щелкните правой кнопкой мыши результат и выберите «Запуск от имени администратора».В окне PowerShell введите следующий командлет (имя PowerShell для команды), а затем нажмите Enter:

Эта команда запускает службу WinRM, заставляет ее автоматически запускаться с вашей системой и создает правило брандмауэра, которое позволяет принимать входящие соединения.

часть командлета сообщает PowerShell выполнить эти действия, не запрашивая вас для каждого шага.

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

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

Импорт и экспорт

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

  • Export-Csv – экспорт данных в формат CSV;
  • Import-Csv – импортирует данные из CSV файла;
  • Export-Clixml — экспорт данных в формат XML;
  • Import-Clixml — импортирует файл CLIXML и создает соответствующие объекты в оболочке Windows PowerShell;
  • Out-File — посылает вывод результата работы командлета во внешний файл (например, в TXT);
  • Out-Printer — вывод результата работы команды на принтер;
  • Import-Module — добавляет модули в текущей сессии.

Configuring WinRM for PowerShell Remoting

To connect to a computer remotely via PowerShell, the WinRM (Windows Remote Management service) must be enabled and configured on the remote client device (it is disabled by default). Communication between computers is performed over HTTP or HTTPS protocols, and all network traffic between computers is encrypted. You can use NTLM and Kerberos to authenticate on a remote computer.

In order to quickly enable and configure the computer for remote management via PowerShell Remoting and WinRM, run the command:

Enable-PSRemoting

This command prepares the computer for remote management:

  • Starts the WinRM service and changes the startup type to Automatic;
  • Adds exceptions to Windows Defender Firewall;
  • Configures WinRM listener to accept remote connections;
  • Enables session configuration for PowerShell.

If the computer’s network connection is set to Public, you will receive an error when you run the Enable-PSRemoting command:

You can change the network type to Private using the command:

Get-NetConnectionProfile | Set-NetConnectionProfile -NetworkCategory Private

Or you can ignore the network profile for WinRM:

Enable-PSRemoting –SkipNetworkProfileCheck -Force

PowerShell Remoting uses TCP ports HTTP (5985) and HTTPS (5986) for network communications. If the remote computer is protected with the Windows Defender Firewall with Advanced Security, the following Windows Remote Management (HTTP-In) rules will be enabled automatically after running the Enable-PSRemoting command:

  • WINRM-HTTP-In-TCP
  • WINRM-HTTP-In-TCP-NoScope

You can enable Windows Defender rules manually from the graphical console or using PowerShell:

Set-NetFirewallRule -Name "WINRM-HTTP-In-TCP" -RemoteAddress Any

Set-NetFirewallRule -Name "WINRM-HTTP-In-TCP-NoScope" -RemoteAddress Any

If the remote computer is in a workgroup (not joined to the Active Directory domain), and a Public network profile is applied to LAN connection (instead of Domain or Private), you need to explicitly allow incoming WinRM traffic in Windows Firewall:

Set-NetFirewallRule -Name "WINRM-HTTP-In-TCP-PUBLIC" -RemoteAddress Any

Check the WinRM service state with the Get-Service command:

Get-Service WinRM

As you can see, the WS-Management service is running. You can now establish sessions with this remote host and send PowerShell commands.

To test the connection to a remote computer via WinRM use the following command:

Test-WSMan server1

If you get a response, then the remote computer is accessible through PowerShell Remoting.

In this case, you need to install an HTTPS certificate for PowerShell Remoting on the remote computer (the long way), or add this host to the trusted ones on your management computer:

Set-Item wsman:\localhost\Client\TrustedHosts -value 192.168.1.70

Then restart the WinRM service:

Restart-Service WinRM

By default, PSRemoting connections can be used by users with local administrator permissions or by local Remote Management Users group members. You can get the current registered session configuration settings for PowerShell with the command:

Get-PSSessionConfiguration -name microsoft.powershell

If you need to change the permissions of the remote PowerShell Endpoint on Windows, run the command:

Set-PSSessionConfiguration -Name Microsoft.PowerShell -ShowSecurityDescriptorUI -Force

Change the current ACL.

Понравилась статья? Поделиться с друзьями:
Быть в курсе нового
Добавить комментарий

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!: