Поиск активных сессий и залогиненных пользователей с powershell

Подробное описание

Удаленные команды можно выполнять на одном компьютере или на нескольких компьютерах, используя временное или постоянное подключение. Можно также запустить интерактивный сеанс с одним удаленным компьютером.

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

Примечание. чтобы использовать удаленное взаимодействие PowerShell, на локальном и удаленном компьютерах необходимо настроить удаленное взаимодействие. Дополнительные сведения см. в разделе about_Remote_Requirements.

Третий метод отправки сообщения пользователям RDS через Send-RDUserMessage

Безусловно самым популярным и универсальным методом отправки оповещений пользователям удаленного рабочего стола, являются командлеты PowerShell. Одним из таких командлетов выступает Send-RDUserMessage.

Справка по командлеты Send-RDUserMessage — https://docs.microsoft.com/en-us/powershell/module/remotedesktop/send-rdusermessage?view=win10-ps

Запускаем PowerShell от имени администратора или нужного пользователя. Синтаксис будет такой:

Еще есть скрипт от Microsoft инженера https://gallery.technet.microsoft.com/scriptcenter/Send-NetMessage-Net-Send-0459d235

Еще есть возможность воспользоваться скриптом гуляющем по интернету:

1 скрипт

Подробнее на https://blog.it-kb.ru/2013/11/15/remote-desktop-services-send-message-to-all-active-rds-farm-users-via-powershell

Кстати если вы неправильно развернули RDS ферму, то при выполнении скрипта получите сообщение

Get-RDUserSession : На svt2019s01.root.pyatilistnik.org не развернуты службы удаленных рабочих столов. Эту операцию можно выполнить после их развертывания. Для получения дополнительных сведений.

На этом у меня все. Мы рассмотрели несколько методов по массовой отправке сообщений пользователям удаленных рабочих столов. С вами был Иван Семин, автор и создатель IT портала Pyatilistnik.org.

Сохранение и отзыв последних расположений (Push-Location и Pop-Location)

При изменении расположения полезно отслеживать свое предыдущее расположение и иметь возможность вернуться к нему. Командлет в Windows PowerShell создает упорядоченный журнал («стек») путей к каталогам, которые вы открывали, чтобы можно было вернуться на шаг назад по журналу путей к каталогу, используя дополнительный командлет .

Например, Windows PowerShell обычно запускается в корневом каталоге пользователя.

Примечание

Слово стек имеет специальное значение во многих параметрах программирования, включая .NET Framework.
Например, в физическом стеке элементов последний элемент, помещенный в стек, является первым элементом, который можно извлечь из него. Добавление элемента в стек в разговорной речи называется «проталкиванием» элемента в стек. Извлечение элемента из стека в разговорной речи называется «выводом» элемента из стека.

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

После этого можно передать расположение локальных параметров в стек и переместить его в папку Temp, введя следующее:

Чтобы убедиться, что каталоги изменены, введите команду :

После этого можно перейти в последний открытый каталог, введя команду , и проверить изменение, введя команду :

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

Кроме того, можно использовать командлеты расположения с сетевыми путями. Если у вас есть сервер FS01 с общей папкой Public, можно изменить расположение, введя

или

Для изменения расположения на любой доступный диск можно использовать команды и . Например, если у вас есть локальный дисковод компакт-дисков с буквой диска D, содержащий компакт-диск с данными, вы можете изменить расположение на дисковод компакт-дисков, введя команду .

Если дисковод пуст, вы получите следующее сообщение об ошибке:

Как запустить скрипт PowerShell с помощью ярлыка?

Осуществить такую задачу можно двумя способами:

  1. Создать bat/cmd файл, в котором прописать команду для запуска скрипта (с параметрами вы ознакомились выше)
  2. Создать ярлык на PowerShell, который можно найти в папке c:\Windows\System32\WindowsPowerShell\v<версия>\ и в свойствах ярлыка в поле «Объект» дописать необходимые параметры.

Таким образом, например, чтобы запустить скрипт powershell при входе пользователя, можно просто создать ярлык, как описано во 2-м пункте и поместить его в автозагрузку. Так же, создание ярлыка одним из способов выше позволит легко запустить скрипт от имени администратора или от имени любого другого пользователя как обычную программу.

Скриптовый язык PowerShell — довольно мощный инструмент для решения различных задач, но его можно использовать не только для хороших вещей, но и во вред, поэтому, пользуйтесь им с умом ;)

Сохранение и отзыв последних расположений (Push-Location и Pop-Location)

При изменении расположения полезно отслеживать свое предыдущее расположение и иметь возможность вернуться к нему. Командлет в Windows PowerShell создает упорядоченный журнал («стек») путей к каталогам, которые вы открывали, чтобы можно было вернуться на шаг назад по журналу путей к каталогу, используя дополнительный командлет .

Например, Windows PowerShell обычно запускается в корневом каталоге пользователя.

Примечание

Слово стек имеет специальное значение во многих параметрах программирования, включая .NET Framework.
Например, в физическом стеке элементов последний элемент, помещенный в стек, является первым элементом, который можно извлечь из него. Добавление элемента в стек в разговорной речи называется «проталкиванием» элемента в стек. Извлечение элемента из стека в разговорной речи называется «выводом» элемента из стека.

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

После этого можно передать расположение локальных параметров в стек и переместить его в папку Temp, введя следующее:

Чтобы убедиться, что каталоги изменены, введите команду :

После этого можно перейти в последний открытый каталог, введя команду , и проверить изменение, введя команду :

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

Кроме того, можно использовать командлеты расположения с сетевыми путями. Если у вас есть сервер FS01 с общей папкой Public, можно изменить расположение, введя

или

Для изменения расположения на любой доступный диск можно использовать команды и . Например, если у вас есть локальный дисковод компакт-дисков с буквой диска D, содержащий компакт-диск с данными, вы можете изменить расположение на дисковод компакт-дисков, введя команду .

Если дисковод пуст, вы получите следующее сообщение об ошибке:

Решение проблемы

Ошибка вроде очевидная, что не включен RDP доступ, если бы это был рядовой сервер я бы понял, но тут служба удаленного доступа точно работала и была включена, так как на данный сервер так же распространялась групповая политика делающая, это автоматически, я проверил применение GPO, все было хорошо. Первым делом я полез смотреть логи Windows, это можно сделать классическим методом или через модный Windows Admin Center.

Журналы которые нас будут интересовать находятся в таких расположениях:

  • Microsoft-Windows-RemoteDesktopServices-RdpCoreTS/Operational
  • Microsoft-Windows-TerminalServices-RemoteConnectionManager/Operational
  • Microsoft-Windows-TerminalServices-SessionBroker/Admin
  • Microsoft-Windows-TerminalServices-SessionBroker/Operational
  • Microsoft-Windows-TerminalServices-SessionBroker-Client/Operational

Строим алгоритм обычного пользователя работающего удаленно. Сотрудник подключается к VPN серверу, после успешного подключения, он запускает клиента удаленного рабочего стола и производит подключение к RDS ферме. Далее сотрудник проходит успешно аутентификацию, его логин и пароль принимается брокерами RDS, далее идет процесс подключения, который заканчивается представленной выше ошибкой.

Первое, что мне бросилось в глаза, это предупреждение с кодом ID 101:

ID 101 RemoteDesktopServices-RdpCoreTS: The network characteristics detection function has been disabled because of Reason Code: 2(Server Configuration).

Далее было такое предупреждение:

Событие с кодом ID 226: RDP_UDPLOSSY: An error was encountered when transitioning from UdpLossyStateSynRecv in response to UdpEventErrorHandshakeTO (error code 0x80040004).

Далее нужно посмотреть, как RDCB брокеры взаимодействовали с сессией пользователя. В журнале «Microsoft-Windows-TerminalServices-RemoteConnectionManager/Operational» я обнаружил событие с кодом ID 1149, в котором я вижу, что определенный пользователь был успешно аутентифицирован на RDS ферме, он получил некий IP адрес.

Remote Desktop Services: User authentication succeeded: User: vpn_user Domain: Root.PYATILISTNIK.ORG Source Network Address: 10.10.31.47

Далее я стал изучать информацию из журнала «Microsoft-Windows-TerminalServices-SessionBroker/Operational». Тут я так же обнаружил, что брокер успешно ответил и отправил пользователя на определенный RDSH хост. Тут есть событие с кодом ID 787.

Событие с кодом ID 787: Session for user ROOT\vpn_user successfully added to RD Connection Broker’s database. Target Name = term01.root.pyatilistnik.org Session ID = 18 Farm Name = TermRoot

За ним я видел событие с кодом ID 801, которое имело вот такое сообщение:

RD Connection Broker successfully processed the connection request for user ROOT\vpn_user. Redirection info: Target Name = TERM01 Target IP Address = 10.10.31.47 Target Netbios = TERM01 Target FQDN = term01.root.pyatilistnik.org Disconnected Session Found = 0x0

тут видно, что брокер даже смог обнаружить предыдущую сессию на данном терминале, о чем говорит строка Disconnected Session Found = 0x0

И вы увидите событие с кодом ID 800:

RD Connection Broker received connection request for user ROOT\vpn-user. Hints in the RDP file (TSV URL) = tsv://MS Terminal Services Plugin.1.TermRoot Initial Application = NULL Call came from Redirector Server = TERMRDCB.root.pyatilistnik.org Redirector is configured as Virtual machine redirector

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

Далее переходим в журнал «Microsoft-Windows-TerminalServices-SessionBroker-Client/Operational» тут будет два события,об успешном общении RDS брокера и клиента.

Событие с кодом ID 1307: Remote Desktop Connection Broker Client successfully redirected the user ROOT\vpn-user to the endpoint term01.root.pyatilistnik.org. Ip Address of the end point = 10.10.31.47

Remote Desktop Connection Broker Client received request for redirection. User : ROOT\vpn-user RDP Client Version : 5

Исходя из данной информации я точно вижу, что брокер подключения все успешно обработал и перенаправил пользователя на хост RDSH.

Запуск

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

  1. Пользователь (администратор) запускает первый экземпляр: PSService.ps1 –Start.
  2. Этот первый экземпляр сообщает SCM запустить службу: Start-Service $serviceName.
  3. SCM выполняет PSService.exe. Ее процедура Main создает объект службы, а затем вызывает его метод Run.
  4. SCM вызывает метод OnStart объекта службы.
  5. C#-метод OnStart запускает второй экземпляр скрипта: PSService.ps1 –Start.
  6. Этот второй экземпляр, теперь выполняемый в фоне как системный пользователь, запускает третий экземпляр, который останется в памяти как настоящая служба: 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 отримати скріншот робочого столу користувача на віддаленому комп’ютері / сервері. Це може бути як окремий комп’ютер з Windows 10, так і RDS сервер.

Якщо ви хочете отримати скріншот робочого столу з RDS сервера (або деськтопной Windows, на якій дозволені множинні RDP підключення), спочатку потрібно отримати ID сесії користувача на віддаленому комп’ютері. У наступному скрипті потрібно вказати ім’я віддаленого сервера і обліковий запис користувача.

Для зручності потрібно зберегти файл з PowerShell скриптом отримання скріншота в мережевий каталог. Для цього відредагуйте скрипт PS-Capture-Local-Screen.ps1, змініть шлях на:

У цей каталог будуть збережуться скріншоти користувачів. Надайте права на запис в цей каталог для доменної групи Authenticated Users.

Після того, як ви отримали ID сесії користувача, можна віддалено підключитися в його сесію через PsExec і запустити скрипт:

Тепер, співробітник HelpDesk може запустити цей скрипт зі свого комп’ютера, і в зазначеному каталозі з’явиться скріншот поточного зображення робочого столу користувача віддаленого комп’ютера.

Удаленное управление компьютером с помощью PsExec

Psexec будет очень полезна для решения задач связанных с удаленным администрированием. Она позволяет удаленно выполнять команды командной строки Windows и незаметно устанавливать программы на любой компьютер в сети со воего компьютера. Для наглядности рассмотрим работу программы на некоторых примерах.

Для того чтобы psexec смог беспрепятственно подключиться к удаленной рабочей станции с Windows версии 7 и позднее, на этих самых удаленных компьютерах должны быть включены административные ресурсы C$ D$ IPC$ Admin$.

Для включения административных шар добавляем в реестр запись: reg add «HKLMSOFTWAREMicrosoftWindowsCurrentVersionPoliciesSystem» /v «LocalAccountTokenFilterPolicy» /t REG_DWORD /d 1 /f

Например нужно узнать конфигурацию сетевого интерфейса компьютера в сети.

Запускаем коммандную строку CMD и набираем комманду

psexec \172.16.0.121 ipconfig

Можно запустить исполняемый файл со своего компьютера на удаленный или даже несколько удаленных ПК. Ключ /c использовался, чтобы указать путь к файлу на локальной машине.

Если psexec нужно выполнить на большом числе компьютерах, то при помощи праметра @ можно указать текстовый файл, в котором будет указан список ip адресов компьютеров:

psexec @ip-list.txt cmd -c c:patch.bat

При помощи PsExec можно поменять пароль учетной записи в удаленной системе

Параметры запуска Psexec

Указывает программе PsExec, что нужно запустить приложение на всех компьютерах, перечисленных в заданном текстовом файле.

-a

Процессоры, на которых можно запустить приложение, отделяются запятыми, при этом процессоры нумеруются, начиная с 1. Например, чтобы запустить приложение на процессорах втором и четвертом, введите «-a 2,4»

-c

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

-d

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

-e

Указанный профиль учетной записи не загружается.

-f

Указанная программа копируется в удаленную систему, даже если такой файл в удаленной системе уже есть.

-i

Запускаемая программа получает доступ к рабочему столу указанного сеанса в удаленной системе. Если сеанс не задан, то процесс выполняется в консольном сеансе.

-l

При запуске процесса пользователю предоставляются ограниченные права (права группы администраторов отменяются, и пользователю предоставляются только права, назначенные группе «пользователи»). В ОС Windows Vista процесс запускается с низким уровнем благонадежности.

-n

Позволяет задать задержку подключения к удаленным компьютерам (в секундах).

-p

Позволяет указать необязательный пароль для имени пользователя. Если этот параметр опущен, то будет выдан запрос на ввод пароля, при этом пароль не будет отображаться на экране.

-s

Удаленный процесс запускается из системной учетной записи.

-u

Позволяет указать необязательное имя пользователя для входа в удаленную систему.

-v

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

-w

Позволяет указать для процесса рабочий каталог (путь внутри удаленной системы).

-x

Отображает интерфейс пользователя на рабочем столе Winlogon (только в локальной системе).

Устранение проблем политики и предпочтений

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

Изменение политики выполнения для Import-PSSession и Import-Module

Командлеты и создают модули, которые содержат неподписанные файлы скриптов и файлы форматирования.

Чтобы импортировать модули, созданные этими командлетами, с помощью или , политика выполнения в текущем сеансе не может быть ограничена или AllSigned. Дополнительные сведения о политиках выполнения PowerShell см. в разделе about_Execution_Policies.

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

Например, следующая команда запускает процесс с политикой выполнения. Изменение политики выполнения влияет только на текущий процесс и не изменяет параметр реестра PowerShell ExecutionPolicy .

Кроме того, с помощью параметра ExecutionPolicy можно запустить один сеанс с менее ограниченной политикой выполнения.

Дополнительные сведения о политиках выполнения см. в разделе about_Execution_Policies. Для получения дополнительных сведений введите .

Как задать и изменить квоты

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

В базовой конфигурации доступны следующие квоты.

  • Поставщик WSMan (WSMan:) предоставляет несколько параметров квот, таких как параметры максенвелопесизекб и макспровидеррекуестс в узле, а также параметры максконкуррентоператионс, свойств maxconcurrentoperationsperuser и MaxConnections в узле.

  • Защитить локальный компьютер можно с помощью параметров максимумрецеиведдатасизеперкомманд и максимумрецеиведобжектсизе командлета и переменной предпочтений.

  • Защитить удаленный компьютер можно, добавив ограничения в конфигурации сеанса, например с помощью параметров максимумрецеиведдатасизеперкоммандмб и максимумрецеиведобжектсиземб командлета.

При конфликте квот с помощью команды PowerShell создает ошибку.

Чтобы устранить эту ошибку, измените удаленную команду так, чтобы она соответствовала квоте. Или определите источник квоты, а затем увеличьте квоту, чтобы завершить выполнение команды.

Например, следующая команда увеличивает квоту размера объекта в конфигурации сеанса Microsoft. PowerShell на удаленном компьютере с 10 МБ (значение по умолчанию) до 11 МБ.

Дополнительные сведения о командлете см. в разделе .

Дополнительные сведения о WS-Management квотах см. в разделе about_WSMan_Provider.

Устранение ошибок времени ожидания

Можно использовать время ожидания для защиты локального компьютера и удаленного компьютера от чрезмерного использования ресурсов, как случайных, так и вредоносных. Если время ожидания задано как на локальном, так и на удаленном компьютере, PowerShell использует самые короткие параметры времени ожидания.

В базовой конфигурации доступны следующие тайм-ауты.

  • Поставщик WSMan (WSMan:) предоставляет несколько параметров времени ожидания на стороне клиента и службы, например параметр макстимеаутмс в узле и параметры енумератионтимеаутмс и макспаккетретриевалтимесекондс в узле.

  • Защитить локальный компьютер можно с помощью параметров канцелтимеаут, IdleTimeout, OpenTimeout и OperationTimeout командлета и переменной предпочтений.

  • Кроме того, можно защитить удаленный компьютер, задавая значения времени ожидания программным способом в конфигурации сеанса для сеанса.

Если значение времени ожидания не позволяет завершить операцию, PowerShell завершает операцию и создает ошибку.

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

Например, следующие команды используют командлет для создания объекта параметра сеанса со значением OperationTimeout , равным 4 минутам (в мс), а затем используйте объект параметра сеанса для создания удаленного сеанса.

Дополнительные сведения об истечении времени ожидания WS-Management см. в разделе справки по поставщику WSMan (тип ).

Дополнительные сведения о командлете см. в разделе New-PSSessionOption.

ВЫПОЛНЕНИЕ УДАЛЕННОЙ КОМАНДЫ

Чтобы выполнить другие команды на удаленных компьютерах, используйте командлет Invoke-Command.

Чтобы выполнить одну команду или несколько несвязанных команд, используйте параметр ComputerName параметра Invoke-Command, чтобы указать удаленные компьютеры. Используйте параметр ScriptBlock для указания команды.

Например, следующая команда выполняет команду Get-Culture на компьютере Server01.

Параметр ComputerName предназначен для ситуации, когда на одном или нескольких компьютерах выполняется одна команда или несколько несвязанных команд. Чтобы установить постоянное подключение к удаленному компьютеру, используйте параметр Session.

Рейтинг
( Пока оценок нет )
Понравилась статья? Поделиться с друзьями:
Ваша ОС
Добавить комментарий

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