В этой статье мы рассмотрим, как получить и проанализировать логи RDP подключений в Windows. Логи RDP подключений позволяют администраторам терминальных RDS серверов/ферм получить информацию о том, какие пользователи подключались к серверу, когда был выполнен вход и когда сеанс завершен, с какого устройства (имя или IP адрес) подключался пользователь.
События RDP подключений в журналах Windows (Event Viewer)
Когда пользователь удаленно подключается к RDS серверу или удаленному столу Windows (RDP), информация об этих событиях сохраняется в журналы Windows. Рассмотрим основные этапы RDP подключения и связанные с ними события в Event Viewer.
- Network Connection
- Authentication
- Logon
- Session Disconnect/Reconnect
- Logoff
Network Connection: – событие установления сетевого подключение к серверу от RDP клиента пользователя. Событие с EventID – 1149 (Remote Desktop Services: User authentication succeeded). Наличие этого события не свидетельствует об успешной аутентификации пользователя. Этот журнал находится в разделе Applications and Services Logs -> Microsoft -> Windows -> Terminal-Services-RemoteConnectionManager -> Operational. Включите фильтр по данному событию (ПКМ по журналу-> Filter Current Log -> EventId 1149).
С помощью PowerShell можно вывести список всех попыток RDP подключений:
$RDPAuths = Get-WinEvent -LogName 'Microsoft-Windows-TerminalServices-RemoteConnectionManager/Operational' -FilterXPath '<QueryList><Query Id="0"><Select>*[System[EventID=1149]]</Select></Query></QueryList>'
[xml[]]$xml=$RDPAuths|Foreach{$_.ToXml()}
$EventData = Foreach ($event in $xml.Event)
{ New-Object PSObject -Property @{
TimeCreated = (Get-Date ($event.System.TimeCreated.SystemTime) -Format 'yyyy-MM-dd hh:mm:ss K')
User = $event.UserData.EventXML.Param1
Domain = $event.UserData.EventXML.Param2
Client = $event.UserData.EventXML.Param3
}
} $EventData | FT
В результате у вас получится список с историей всех сетевых RDP подключений к данному серверу. В событии содержится имя пользователя, домен (если используется NLA аутентификация, при отключенном NLA текст события выглядит иначе) и IP адрес компьютера пользователя.
Authentication: – успешная или неудачная аутентификация пользователя на сервере. Журнал Windows -> Security. Здесь нас могут интересовать события с EventID – 4624 (успешная аутентификация — An account was successfully logged on) или 4625 (ошибка аутентификации — An account failed to log on). Обратите внимание на значение LogonType в событии.
- LogonType = 10 или 3 — при входе через терминальную службу RDP —.
- LogonType = 7, значит выполнено переподключение к уже существующему RDP сеансу.
- LogonType = 5 – событие RDP подключения к консоли сервера (в режиме mstsc.exe /admin)
При этом имя пользователя содержится в описании события в поле Account Name, имя компьютера в Workstation Name, а имя пользователя в Source Network Address.
Вы можете получить список событий успешных авторизаций по RDP (событие 4624) с помощью такой команды PowerShell.
Get-EventLog security -after (Get-date -hour 0 -minute 0 -second 0) | ?{$_.eventid -eq 4624 -and $_.Message -match 'logon type:\s+(10)\s'} | Out-GridView
Logon: – RDP вход в систему, EventID – 21 (Remote Desktop Services: Session logon succeeded. Это событие появляется после успешной аутентификации пользователя. Этот журнал находится в разделе Applications and Services Logs -> Microsoft -> Windows -> TerminalServices-LocalSessionManager -> Operational. Как вы видите, здесь можно узнать идентификатор RDP сессии для пользователя — Session ID.
Событие с EventID – 21 (Remote Desktop Services: Shell start notification received) означает успешный запуск оболочки Explorer (появление окна рабочего стола в RDP сессии).
Session Disconnect/Reconnect – события отключения и переподключения к сессии имеют разные коды в зависимости от того, что вызвало отключение пользователя (отключение по неактивности, заданному в таймаутах для RDP сессий; выбор пункта Disconnect в сессии; завершение RDP сессии другим пользователем или администратором и т.д.). Эти события находятся в разделе журналов Applications and Services Logs -> Microsoft -> Windows -> TerminalServices-LocalSessionManager -> Operational. Рассмотрим RDP события, которые могут быть полезными:
- EventID – 24 (Remote Desktop Services: Session has been disconnected) – пользователь отключился от RDP сессии.
- EventID – 25 (Remote Desktop Services: Session reconnection succeeded) – пользователь переподключился к своей имеющейся RDP сессии на сервере.
- EventID – 39 (Session <A> has been disconnected by session <B>) – пользователь сам отключился от своей RDP сессии, выбрав соответствующий пункт меню (а не просто закрыл окно RDP клиента). Если идентификаторы сессий разные, значит пользователя отключил другой пользователь (или администратор).
- EventID – 40 (Session <A> has been disconnected, reason code <B>). Здесь нужно смотреть на код причины отключения в событии. Например:
- reason code 0 (No additional information is available) – обычно говорит о том, что пользователь просто закрыл окно RDP клиента.
- reason code 5 (The client’s connection was replaced by another connection) – пользователь переподключился к своей старой сессии.
- reason code 11 (User activity has initiated the disconnect) – пользователь сам нажал на кнопку Disconnect в меню.
Событие с EventID – 4778 в журнале Windows -> Security (A session was reconnected to a Window Station). Пользователь переподключился к RDP сессии (пользователю выдается новый LogonID).
Событие с EventID 4779 в журнале Windows -> Security (A session was disconnected from a Window Station). Отключение от RDP сеанса.
Logoff: – выход пользователя из системы. При этом в журнале Applications and Services Logs -> Microsoft -> Windows -> TerminalServices-LocalSessionManager -> Operational регистрируется событие с EventID 23 (Remote Desktop Services: Session logoff succeeded).
При этом в журнале Security нужно смотреть событие EventID 4634 (An account was logged off).
Событие Event 9009 (The Desktop Window Manager has exited with code (<X>) в журнале System говорит о том, что пользователь инициировал завершение RDP сессии, и окно и графический shell пользователя был завершен.
EventID 4647 — User-initiated logoff
Получаем логи RDP подключений в Windows с помощью PowerShell
Ниже представлен небольшой PowerShell скрипт, который выгружает из журналов терминального RDS сервера историю всех RDP подключений за текущий день. В полученной таблице указано время подключения, IP адрес клиента и имя пользователя (при необходимости вы можете включить в отчет другие типы входов).
Get-EventLog -LogName Security -after (Get-date -hour 0 -minute 0 -second 0)| ?{(4624,4778) -contains $_.EventID -and $_.Message -match 'logon type:\s+(10)\s'}| %{
(new-object -Type PSObject -Property @{
TimeGenerated = $_.TimeGenerated
ClientIP = $_.Message -replace '(?smi).*Source Network Address:\s+([^\s]+)\s+.*','$1'
UserName = $_.Message -replace '(?smi).*\s\sAccount Name:\s+([^\s]+)\s+.*','$1'
UserDomain = $_.Message -replace '(?smi).*\s\sAccount Domain:\s+([^\s]+)\s+.*','$1'
LogonType = $_.Message -replace '(?smi).*Logon Type:\s+([^\s]+)\s+.*','$1'
})
} | sort TimeGenerated -Descending | Select TimeGenerated, ClientIP `
, @{N='Username';E={'{0}\{1}' -f $_.UserDomain,$_.UserName}} `
, @{N='LogType';E={
switch ($_.LogonType) {
2 {'Interactive - local logon'}
3 {'Network conection to shared folder)'}
4 {'Batch'}
5 {'Service'}
7 {'Unlock (after screensaver)'}
8 {'NetworkCleartext'}
9 {'NewCredentials (local impersonation process under existing connection)'}
10 {'RDP'}
11 {'CachedInteractive'}
default {"LogType Not Recognised: $($_.LogonType)"}
}
}}
Можно экспортировать логи RDP подключений из журнала в CSV файл (для дальнейшего анализа в таблице Excel). Экспорт журнала можно выполнить из консоли Event Viewer (при условии что логи не очищены) или через командную строку:
WEVTUtil query-events Security > c:\ps\security_log.txt
Или с помощью PowerShell:
get-winevent -logname "Microsoft-Windows-TerminalServices-LocalSessionManager/Operational" | Export-Csv c:\ps\rdp-log.csv -Encoding UTF8
Если ваши пользователи подключаются к RDS серверам через шлюз удаленных рабочих столов Remote Desktop Gateway, вы можете обрабатывать логи подключений пользователей по журналу Microsoft-Windows-TerminalServices-Gateway по EventID 302. Например, следующий PowerShell скрипт выведет полную историю подключений через RD Gateway указанного пользователя:
$rdpusername="kbuldogov"
$properties = @(
@{n='User';e={$_.Properties[0].Value}},
@{n='Source IP Adress';e={$_.Properties[1].Value}},
@{n='TimeStamp';e={$_.TimeCreated}}
@{n='Target RDP host';e={$_.Properties[3].Value}}
)
(Get-WinEvent -FilterHashTable @{LogName='Microsoft-Windows-TerminalServices-Gateway/Operational';ID='302'} | Select-Object $properties) -match $rdpusername
- 300 —
The user %1, on client computer %2, met resource authorization policy requirements and was therefore authorized to connect to resource %4
- 302 —
The user %1, on client computer %2, connected to resource %4
- 303 —
The user %1, on client computer %2, disconnected from the following network resource: %4. Before the user disconnected, the client transferred %6 bytes and received %5 bytes. The client session duration was %7 seconds.
Список текущих RDP сессий на сервере можно вывести командой:
qwinsta
Команда возвращает как идентификатор сессии (ID), имя пользователя (USERNAME)и состояние (Active/Disconnect). Эту команду удобна использовать, когда нужно определить ID RDP сессии пользователя при теневом подключении.
Список запущенных процессов в конкретной RDP сессии (указывается ID сессии):
qprocess /id:157
Логи RDP подключений на клиентах Windows
Также вы можете изучать логи исходящих подключений на стороне RDP клиента. Они доступны в журнале событий Application and Services Logs -> Microsoft -> Windows -> TerminalServices-ClientActiveXCore -> Microsoft-Windows-TerminalServices-RDPClient -> Operation.
Например, событие с Event ID 1102 появляется, когда компьютер устанавливает подключение с удаленным RDS хостом Windows Server или компьютером с Windows 10/11 с включенной службой RDP (десктопные версии Windows также поддерживают несколько одновременных rdp подключений).
The client has initiated a multi-transport connection to the server 192.168.31.102.
Следующий RDP скрипт выведет историю RDP подключений на указанном компьютере (для получения событий Event Log используется командлет Get-WinEvent):
$properties = @(
@{n='TimeStamp';e={$_.TimeCreated}}
@{n='LocalUser';e={$_.UserID}}
@{n='Target RDP host';e={$_.Properties[1].Value}}
)
Get-WinEvent -FilterHashTable @{LogName='Microsoft-Windows-TerminalServices-RDPClient/Operational';ID='1102'} | Select-Object $properties
Также история RDP подключений пользователя хранится в реестре.
Вот, что называется — вовремя! Только я тут озаботился плотным изучением логов именно RDP и …. р-раз, а вот и стетеечка 🙂 Спасибо.
Уже не первый раз твои мысли читаю! Пользуйся 🙂
Если — получится накопать еще что-то полезное или какие-то полезные скрипты для анализа RDP логов напишешь — не стесняйся, делись.
Да. леХХко 🙂 Я же сказал — копаю 🙂 Вот софтина, например, полезная не только для RDP — Intrusion Detection for Windows Systems. Free и Платная версии.
Живет тут — https://cyberarms.net/
Что делает, в двух словах. Касаемо RDP — ловит неправльные пары логин/пароль и добавляет IP в свое собственное правило блокировки в Windows Firewall. Удобно. Но еще удобнее, если эти IP оттуда доставать и блокировать сразу на уровне входного Router/Firewall.
Что и делаю. По расписанию с помощью PowerShell вынимаю из правил Firewall IP адреса «стукачей» и отправляю в BLACKLIST на Firewall.
А вот и скриптик. Урезан, до «универсального». Кому интересно, допилят сами
$LogFile = "C:\BlockedIPs\blokip.txt"
$ip = "0.0.0.0"
$NetFirewallRule = Get-NetFirewallRule -DisplayName "Blocked by Cyberarms Intrusion Detection_BlockAttacker_AllPorts"
$tab = $NetFirewallRule | Get-NetFirewallAddressFilter
foreach($str in $tab){
$str.RemoteAddress.split("`n") | where { $_ -ne $ip } | Out-File -FilePath $LogFile -Encoding ASCII
}
$NetFirewallRule | Set-NetFirewallRule -LocalAddress Any -RemoteAddress $ip
Согласен, полезно.
В принципе если есть список ip+пользователь, можно сделать, чтобы при несоотвествии подключающийся ip блокировался в файерволе. Достаточно повесить на событие RDP логина задание планировщика с проверкой IP и учетки по текстовому файлу и блокировкой в случае отсуствия данных в файле.
Немного параноидально, но иногда заказчик хочет чего-то такого 🙂
Короче — возможны варианты. 🙂
А меня «пионеры» достали со своими брутфорсерами. Поэтому drop’аю их на внешнем firewall’e. Тоже скриптом и тоже через планировщик, дописываю новые IP в blacklist. А собирает их мне теперь софтина, которую я обозначил.
До этого делал тоже через ps. Выдергивал по Event’ам 140 и 4625 с чем лезут и кто лезет. Складывал в текстовые файлы и оттуда уже извлекал IP брутфорсеров. Делалось это по утрам, по состоянию «на вчера».
Теперь стало существенно проще. Да и софтина их IP «заранее» банит через Firewall, счетчик попыток на 50 выставлен.
а если ip не светится — идёт какое-то уведомление на почту или в события? Есть такой функционал в бесплатной версии?
кстать, сайт с софтиной не открывается… Ни с прокси, ни с тора, ни откуда 🙁
что-то не работает софтина… проинсталил её на десктоп свой, сервис её работает. Пробую ломиться по рдп на свой комп с виртуалки с неправильными логином и паролем — в логах софтины пусто….
в тему, как раз на прошлой недели понадобилось собрать логи по RDP соединениям, копаться в журналах винды не самое удобное, а ps скрипт вполне удобно. Спасибо)
При выполнения скрипта, выдается данная ошибка. 2012R2 Win.
Не удается вызвать эту команду с точкой, так как она была определена для другого языкового режима. Чтобы вызвать команду, не импортируя ее содержимое, опустите оператор ".".
+ CategoryInfo : InvalidOperation: (:) [RDPConnectionParser.ps1], NotSupportedException
+ FullyQualifiedErrorId : DotSourceNotSupported,RDPConnectionParser.ps1
Странно. Я как раз тестировал скрипт на 2012 R2 Eng. Проверяйте код своего скрипта.
У вас случаем не русская версия Windows?
А как «разгребать» все єто если РДС-ферма на 10+ хостов ?
Тут есть несколько вариантов:
1) Собрать все логи в одну кучу на один сервер через подписку: https://winitpro.ru/index.php/2011/01/17/centralizovannyj-event-log-v-windows-2008-server/
2) Если журналы RDP входов — критическая информация — можно писать их сразу в базу (например MySql — https://winitpro.ru/index.php/2016/04/19/vypolnenie-mysql-zaprosov-iz-powershell/)
3) Либо можно просто в скрипте перебирать все RDSH серверы по текстовому файлу. Что-то вроде
$list = gc C:\ps\complist.txt
Foreach ($server in $list) {
Get-EventLog -ComputerName $server -LogName Security -after (Get-date -hour 0 -minute 0 -second 0)| ?{(4624,4778) -contains $_.EventID -and $_.Message -match 'logon type:\s+(10)\s'}| %{
........
Скрипты не срабатывают. просто ничего не выводят
windows 2012r2 rus проверил на трёх системах.
видимо для русских версий надо заменить «logon type:» на «Тип входа:»
Все верно. В русских версиях текст в событиях на русском. Спасибо за дополненеи.
У меня и в Журнале событий совершенно пусто, и в PowerShell при запуске всё выполняется, но ничего не выдаёт. Не могу понять в чём причина. Возможно из-за пиратской Винды?..
Запустите консоль services.ms и проверьте, что запущена служба EventLog (Журнал событий Windowss \ Event Log Service). Служба должна быть настроена на автозапуск.
Если служба запущена, попробуйте сбросить настройки локальных политик https://winitpro.ru/index.php/2013/10/03/sbros-lokalnyx-gruppovyx-politik-v-windows/
Было бы очень интересно узнать как это можно сделать
У меня в модеме проброс портов. Как узнать с какого Ай-пи стучатся в Сервак? Кто-то стучиться, кто не знаю. Перебирают имена — пароли пользователей. Server 2008 R2. Событие с кодом 1149: это — Службы удаленных рабочих столов: Успешная проверка подлинности пользователя:
Информация об IP адреса, с которого выполняется подключение фиксируется в журнале событий. Посмотрите например EventID – 1149 — там указан IP source.
Совершенно верно. Событие с кодом 1149: это — Успешная проверка подлинности пользователя.
А если подключение не было успешным, то нет никакой информации откуда шло подключение. Или, как вариант, я просто этого не знаю. Не знаю где посмотреть.
По умолчанию в винде отключено логирование события типо «Fail» или «Неудачная попытка входа».
Включить можно или через «Локальные политики безопасности» -> локальные политики -> политики аудита -> Аудит входа в систему (там указываешь что логировать, успех или отказ, или все вместе).
Ну или gpedit.msc =)
ну не совсем так. Даже при включённом логгировании я вижу только примерно:
Учетной записи не удалось выполнить вход в систему.
Субъект:
ИД безопасности: NULL SID
Имя учетной записи: -
Домен учетной записи: -
Код входа: 0x0
Тип входа: 3
Учетная запись, которой не удалось выполнить вход:
ИД безопасности: NULL SID
Имя учетной записи: Camoxsanosa
Домен учетной записи: HVS
Сведения об ошибке:
Причина ошибки: Неизвестное имя пользователя или неверный пароль.
Состояние: 0xc000006d
Подсостояние: 0xc0000064
Сведения о процессе:
Идентификатор процесса вызывающей стороны: 0x0
Имя процесса вызывающей стороны: -
Сведения о сети:
Имя рабочей станции: Windows2012
Сетевой адрес источника: -
Порт источника: -
Сведения о проверке подлинности:
Процесс входа: NtLmSsp
Пакет проверки подлинности: NTLM
Промежуточные службы: -
Имя пакета (только NTLM): -
Длина ключа: 0
никаких айпишников. Это в вкладке «безопасность» по событиям отказа.
А в разделе Microsoft-Windows-TerminalServices-RemoteConnectionManager/Operational
и того скупое
Прослушиватель RDP-Tcp получил соединение
Тип входа: 3 (logon type 3) — это не RDP вход, а доступ через сеть к общим ресурсам (папки, принтеры) или какие-то локальные процессы.
и это никак не отследить?
Так вам что нужно-то отслеживать? Доступ к файлам?
айпишники, чтоб на роутере их банить.
На русской версии Server 2008 не работает. Уже все поля переиминовал на русский, все равно выводит пустоту скрипт. Автор, пожалуйста, прошу, сделай скрипт для русского сервера(
К сожалению у меня нет русской версии Windows Server.
Попробуйте руками собрать и перепроверить все поля и сообщения в событии авторизации.
Get-EventLog -LogName Security -after (Get-date -hour 0 -minute 0 -second 0)| ?{(4624,4778) -contains $_.EventID -and $_.Message -match ‘Тип входа:\s+(10)\s’}| %{
(new-object -Type PSObject -Property @{
TimeGenerated = $_.TimeGenerated
ClientIP = $_.Message -replace ‘(?smi).*Сетевой адрес источника:\s+([^\s]+)\s+.*’,’$1′
UserName = $_.Message -replace ‘(?smi).*Имя учетной записи:\s+([^\s]+)\s+.*’,’$1′
UserDomain = $_.Message -replace ‘(?smi).*Домен учетной записи:\s+([^\s]+)\s+.*’,’$1′
LogonType = $_.Message -replace ‘(?smi).*Тип входа:\s+([^\s]+)\s+.*’,’$1′
})
} | sort TimeGenerated | Select TimeGenerated, ClientIP `
, @{N=’Username’;E={‘{0}\{1}’ -f $_.UserDomain,$_.UserName}} `
, @{N=’LogType’;E={
switch ($_.LogonType) {
2 {‘Interactive — local logon’}
3 {‘Network conection to shared folder)’}
4 {‘Batch’}
5 {‘Service’}
7 {‘Unlock (after screensaver)’}
8 {‘NetworkCleartext’}
9 {‘NewCredentials (local impersonation process under existing connection)’}
10 {‘RDP’}
11 {‘CachedInteractive’}
default {«LogType Not Recognised: $($_.LogonType)»}
}
}}
такой вариант работает на русском сервере
как это работает? ( в PS вставляешь код, и всё, виснет…
C:\Windows\system32>powershell
Windows PowerShell
(C) Корпорация Майкрософт, 2009. Все права защищены.
PS C:\Windows\system32> Get-EventLog -LogName Security -after (Get-date -hour 0
-minute 0 -second 0)| ?{(4624,4778) -contains $_.EventID -and $_.Message -match
‘Тип входа:\s+(10)\s’}| %{
>> (new-object -Type PSObject -Property @{
>> TimeGenerated = $_.TimeGenerated
>> ClientIP = $_.Message -replace ‘(?smi).*Сетевой адрес источника:\s+([^\s]+)\s
+.*’,’$1?
>> UserName = $_.Message -replace ‘(?smi).*Имя учетной записи:\s+([^\s]+)\s+.*’,
‘$1?
>> UserDomain = $_.Message -replace ‘(?smi).*Домен учетной записи:\s+([^\s]+)\s+
.*’,’$1?
>> LogonType = $_.Message -replace ‘(?smi).*Тип входа:\s+([^\s]+)\s+.*’,’$1?
>> })
>> } | sort TimeGenerated | Select TimeGenerated, ClientIP `
>> , @{N=’Username’;E={‘{0}\{1}’ -f $_.UserDomain,$_.UserName}} `
>> , @{N=’LogType’;E={
>> switch ($_.LogonType) {
>> 2 {‘Interactive — local logon’}
>> 3 {‘Network conection to shared folder)’}
>> 4 {‘Batch’}
>> 5 {‘Service’}
>> 7 {‘Unlock (after screensaver)’}
>> 8 {‘NetworkCleartext’}
>> 9 {‘NewCredentials (local impersonation process under existing connection)’}
>> 10 {‘RDP’}
>> 11 {‘CachedInteractive’}
>> default {}
>> }
>> }}
>>
Неожиданный токен «(» в выражении или инструкции.
строка:5 знак:34
+ UserName = $_.Message -replace ‘( <<<
Неожиданный токен «(» в выражении или инструкции.
строка:5 знак:34
+ UserName = $_.Message -replace ‘( <<<
Переименование патернов не помогло.
UserName = $_.Message -replace ‘(?smi).*Имя учетной записи:\s+([^\s]+)\s+.*’,’$1′ — возвращает » — «, так как из текста берет «Сетевое имя учетной записи» вместо «Имя учетной записи». Как исправить?
Проблема тут в том, что в русской версии Windows есть два поля «Имя учетной записи» и «Сетевое имя учетной записи», оба попадают под pattern, соответственно в переменной сохраняется значение последнего совпадения.
Вероятно, вам проще взять содержимое поля «ИД безопасности»:
UserName = $_.Message -replace '(?smi).*Ид безопасности:\s+([^\s]+)\s+.*','$1'
Содержимое поля «ИД безопасности» в сообщении представлено кодом вида «S-1-5-21-4282205446-2772034979-302206999-1001» который дальше Event Viewer`ом преобразуется в формат «Имя компютера\Имя пользователя».
Как ограничить поиск по «Имя учетной записи»? возможно в поиск включить конец предыдущей строки и потом отсечь его ?
Помогите с синтаксисом регулярного Выражения.
Добрый день. Есть подозрения, что к компу подключаются через RDP. Windows 10. Подключения RDP запрещены в настройках. Также отключена служба удал. раб. столов. Но в журнале TerminalServices-LocalSesssionManager Operational есть записи с кодами события 21, 22, 23, 24, 32, 34, 39, 40, 41, 42, 54. В некоторых записях коды сеанса 2 и 3, но во всех отмечен пользователь: (мой комп)\User.
На самом деле подключения имеют место быть даже при отключенном RDP? Если да, то как запретить все подключения?
У классического RDP входа LogonType = 10. Если у вас этого события нет, не волнуйтесь.
Если параноить, можно закрыть входящий RDP порт TCP/3389 через брандмауэр. Можно заблокировать входящий командой PowerShell:
new-netfirewallrule -displayname BlockRDP -direction inbounf -action block -protocol tcp -LocalPort 3389
Хорошо, спасибо. Еще интересует такая запись: Подключаемый модуль RDSAppXPlugin успешно инициализирован. Что это такое, в гугле информации толком не нашел..
У кого не отображается имя пользователя:
UserName =(([regex]'(?<=Новый вход:.*[\s\S]*.*записи:.\s)([\s\S]*)(?=\s\n.*Домен)').match($_.message).value);
Все равно имя пользователя не отображается, При запуске отображает «-/-»
Как это исправить?
Терминальный сервер Windows Server 2012R2
При успешном входа пользователя в систему не появляется события 4624 в журнале Windows Logs -> Secyrity. Почему?
в логах LocalSessionManager все вышеописанные ивенты вижу, но мне нужно отловить причину завершения сессии — Sing Out пользователем или таймаут какой..
Как это вычислить?
Проверьте что включены все необходимые политики аудита. Можете посмотреть пример здесь: https://winitpro.ru/index.php/2020/04/23/user-domain-login-history-powershell/
Ребята, в комментариях код для русской версии Windows не работает. Как сделать, чтобы скрипт работал в русской Windows Server 2016? :/
Сам спросил, сам разгадал эту задачу с помощью всех комментариев:
Get-EventLog -LogName Security -after (Get-date -hour 0 -minute 0 -second 0)| ?{(4624,4778) -contains $_.EventID -and $_.Message -match ‘Тип входа:\s+(10)\s’}| %{
(new-object -Type PSObject -Property @{
TimeGenerated = $_.TimeGenerated
ClientIP = $_.Message -replace ‘(?smi).*Сетевой адрес источника:\s+([^\s]+)\s+.*’,’$1′
UserName =(([regex]'(?<=Новый вход:.*[\s\S]*.*записи:.\s)([\s\S]*)(?=\s\n.*Домен)').match($_.message).value);
UserDomain = $_.Message -replace '(?smi).*Имя рабочей станции:\s+([^\s]+)\s+.*','$1'
LogonType = $_.Message -replace '(?smi).*Тип входа:\s+([^\s]+)\s+.*','$1'
})
} | sort TimeGenerated -Descending | Select TimeGenerated, ClientIP `
, @{N='Username';E={'{0}\{1}' -f $_.UserDomain,$_.UserName}} `
, @{N='LogType';E={
switch ($_.LogonType) {
2 {'Interactive — local logon'}
3 {'Network conection to shared folder)'}
4 {'Batch'}
5 {'Service'}
7 {'Unlock (after screensaver)'}
8 {'NetworkCleartext'}
9 {'NewCredentials (local impersonation process under existing connection)'}
10 {'RDP'}
11 {'CachedInteractive'}
default {"LogType Not Recognised: $($_.LogonType)"}
}
}}
Правда не отображаются входы, если логины запомнены в системе и пароль не запрашивает. Не знаю пока как это побороть.
Добрый день, для инглиш версии 2012 не работает, при запуске просто тупо ничего не выдает. Не пойму что ему не нравится, события 4624 есть в логах
Мы переделали этот скрипт, он проверяет время изменения лог файла и и пишет в него все события. Запускается в планировщике раз в 15 минут.
В итоге имеем:
27.04.2020 12:54:24; 46.219.124.85; rita\HOMEPC; 3:Network conection to shared folder)
27.04.2020 12:52:20; 46.219.124.85; rita\MASTER; 10:RDP
$file = Get-Item ‘C:\logs\logons\logon2.txt’
$eventid = 4624
$logontypes = @{
2 = ‘Interactive — local logon’;
3 = ‘Network conection to shared folder)’;
4 = ‘Batch’;
5 = ‘Service’;
7 = ‘Unlock (after screensaver)’;
8 = ‘NetworkCleartext’;
9 = ‘NewCredentials (local impersonation process under existing connection)’;
10 = ‘RDP’;
11 = ‘CachedInteractive’
}
get-eventlog -LogName Security -InstanceId $eventid -after ($file.LastWriteTime) |
select TimeGenerated, ReplacementStrings |
where {$arr = $_.ReplacementStrings; $arr[18] -ne ‘-‘} | #IP
foreach {
$ip = $arr[18]
$domain_name = $arr[5] + @(», (‘\’ + $arr[11]))[[bool]$arr[11]]
$logontype = $arr[8] + ‘:’ + $logontypes[[int]$arr[8]]
$_.TimeGenerated, $ip, $domain_name, $logontype -join ‘; ‘
} >> C:\logs\logons\logon2.txt
Roman, можно поподробнее, с ходу вообще не разобрался. Что требуется для вашего скрипта? попробовал тупо скопировать и получил ошибку =))
Вы создали пустой файл C:\logs\logons\logon2.txt?
да создал
Get-EventLog security -after (Get-date -hour 0 -minute 0 -second 0) | ?{$_.eventid -eq 4624 -and $_.Message -match ‘logon type:\s+(10)\s’} | Out-GridView Тоже не работает на 2012r2 EN сервере, но работает на 2008r2 EN в чем проблема?
наконец то разобрался почему скрипт не работал на английской винде, ели на инглишь винде язык интерфейса по умолчанию русский, то скрипт работать не будет, для этого надо сменить язык интерфейса на английский и тогда скрипт отрабатывает.
не работает ничего… проще уже VPN развернуть чем в powershell разбираться.
Чего вы хотите добиться? Какая у вас цель? Причем VPN до анализа логов успешных подключений?
>Чего вы хотите добиться?
хочу добиться цели топика — чтоб скрипт заработал, но непонятно в чём причина неработоспособности, на ошибки выше никто не ответил.
> Какая у вас цель?
увидеть — к4акие же гады с каких айпи пытаются подключиться по рдп перебором логинов и паролей и забанить айпишники на пограничном маршрутизаторе
>Причем VPN до анализа логов успешных подключений?
разве ж только успешных? интересуют как раз НЕуспешные…
подняв VPN — сразу пресекаешь попытки брутфорса по портам. Ну по крайней мере не встречал ещё ни разу чтоб VPN порт пытались брутфорсить.
Я поставил в итоге RDP Guard 6.7.5. Поставьте и уверяю вас, вы не захотите больше никаких скриптов. Там очень много вкусного и работает на ура. И лог ведет и рубит на корню.
Вам сюда
https://winitpro.ru/index.php/2019/10/02/blokirovka-rdp-atak-firewall-powershell/
так в том-то и дело, что IP не показываются при брутфорсе. Плюс — при повторном перечитывании статьи зацепился за «При входе через терминальную службу RDP — LogonType = 10 или 3. »
просьба уточнить — вроде в самом событии указывается что 10 — это РДП, а 3 — сетевой вход, как смб, что подтверждается Вашим ответом выше :
«itpro 27.02.2020
Тип входа: 3 (logon type 3) — это не RDP вход, а доступ через сеть к общим ресурсам (папки, принтеры) или какие-то локальные процессы.»
Есть Windows Server 2019 Standart используется в качестве терминального сервера.
При подключении к 1С через RemAPP при первом подключении появляется окно выбора базы 1С, далее соединение рвется. На сервере сеанс в статусе отключен.
При повторном подключении в течении 2 мин. Подключается к уже запущенному сеансу.
В журнале событий вижу такие события:
1)
Службы удаленных рабочих столов: Успешный вход в систему:
/Пользователь: user
Код сеанса: 139
Адрес сети источника: 192.168.10.124
2)
Службы удаленных рабочих столов: Получено уведомление о запуске оболочки:
Пользователь: uer
Код сеанса: 139
Адрес сети источника: 192.168.10.124
3)
Сеанс 139 отключен сеансом 139
С чем это может быть связанно? Как исправить?
RDS сервер один? Или это ферма с Connection Broker?
Попрбуйте политиками принудительно ограничить количество сессий на пользователя:
Computer Configuration\Administrative Templates\Windows Components\Remote Desktop Services\Remote Desktop Session Host\Connections ->
Restrict each user to a single session -> enabled
И включить автоматическое переподключение в сесию:
Automatic reconnection -> enabled
Здравствуйте. Сидел на сервере и вылезло окно, что к удаленому рабочему столу подключился кто-то другой. Начал читать статьи и нашел в журнале событий это подключение, но оно было с моего айпи и моего компьютера! Как такое возможно, при том что пароль я поставил очень сложный и на сервере явно кто-то открывал файлы???
Буду рад абсолютно любым догадкам!
Время подозрительного входа и время в логе совпадает? вы возможно наши собственное событие.
А если абсолютно точно что левое подключение было конкретно с вашего компьютера, проверяйте его на трояны и бэкдоры.
Подскажите, есть один терминальный сервер WinSrv2016 в домене.
Нужно сделать так что бы некоторые пользователи могли на него входить только с конкретных IP, а все остальные с любых.
Пробовал получить вышеописанным скриптом IP адрес и по нему управлять сеансом, но не смог его запустить.
Скажите пожалуйста, а как узнать какие пароли вводят?
Логины отображаются, но интересно знать логин и пароль с которыми подключаются.
Возможно есть какой-то сторонний софт для сохранения всй полной информации?
Заранее спасибо
https://winitpro.ru/wp-content/uploads/2018/09/logi-rdp-podklyuchenij-k-rds-serveru-s-ip-adresami-i-768×686.png
Попробовал выплнить, видно, скрипт работат, но в окне консоли отображается только он сам, затем, видимо, по окончании работы, приглашение powershell. Нет ошибок, но нет и результата. События стандартные, что делаю не так? PowerShell запущена от администратора.
Выглядит так:
https://drive.google.com/open?id=1g7uTBmJLnH9Z3rxgu-PuwDwadklbCOUG
Значит, у вас в журналах отсутствуют события с кодами 4624 и 4778 по которым идет фильтрация.
А можно ли как-нибудь вывести результаты выполнения этого скрипта в тело письма и отправлять это по почте? Желательно без использования вложений к письму.
Присвойте ваш запрос переменной:
$mailbody=Get-EventLog -LogName Security -after ......
Отпраляйте письмо черех командлет Send-MailMessage https://winitpro.ru/index.php/2011/03/30/otpravka-pochty-iz-powershell/
В качестве тела (Body) письма используйте вашу переменную.
$MailMessage = @{
To = "[email protected]
Bcc = "[email protected]", "[email protected]"
From = "DC server "
Subject = "Отчет с сервера DC"
Body = $mailbody
Smtpserver = "smtp.winitpro.ru"
Port = 25
UseSsl = $false
BodyAsHtml = $true
Encoding = “UTF8”
}
Send-MailMessage @MailMessage -Credential $cred
Подскажите что добавить что бы увидеть статистику подключений не за текущий день а за весь период?
Если вы в скипте не ограничивали даты для выборки событий, выбираются все события из Event Viewer.
Не забывайте, что размер журнала ограничен, и старые события со временем перезатираютя.
А можно ли как то увеличить размер журнала? если да , то как? и сделать чтобы он вел только логи успешных авторизаций
есть бесплатный ipban , погуглите. Отлично работает.
Друзья, встала задача понять какие пользователи подключаются к серверу по RDP, а какие RemAPP. Ветку почитал, но именно решение по такому разделению не нашел ( 2012r2 rus. Пользователей 200+. Есть ли решение?
Не было такого опыта.
Вот нашел инфу, что на клиентах можно что-то собрать в Applications and Services Logs>Microsoft>Windows>RemoteApp and Desktop Connections>Operational -> Event ID 1040.
Сравните описанные здесь события для RDP входов и RemoteApp, можно там будут какие-то отличия, по которым их можно отличить.
Если во встроенных журналах нет, можно попробовать включить аудит запуска процессов и потом уже анализировать через parent process
https://winitpro.ru/index.php/2022/04/04/audit-zapuska-programm-v-windows/
Добрый день! Подскажите, а как посмотреть логи именно успешных заходов за все время , а не лишь за последние сутки-двое?
Нужно увеличить размер нужных вам журналов событий. Можно сделать вручную (правй щелчок по журналу, свойства -> Maximum log size) или через реестра HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\EventLog\LOGNAME создать параметр MaxSize и в нем задать макс размер журнала
PS C:\Users\sys> Get-EventLog security -after (Get-date -hour 0 -minute 0 -second 0) | ?{$_.eventid -eq 4624 -and
sage -match ‘logon type:\s+(10)\s’} | Out-GridView
Get-EventLog : Requested registry access is not allowed.
At line:1 char:1
+ Get-EventLog security -after (Get-date -hour 0 -minute 0 -second 0) | …
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : NotSpecified: (:) [Get-EventLog], SecurityException
+ FullyQualifiedErrorId : System.Security.SecurityException,Microsoft.PowerShell.Commands.GetEventLogCommand
что означает эта ошибка?
Консоль PowerShell запущена не из под админом, или у вашей учетки нет прав на чтение логов (добавьте пользователя в группу Event Log Readers)
Проще диспетчер задач открыть, закладку Пользователи.
$rdpusername=»EgovcevaTat»
$properties = @(
@{n=’User’;e={$_.Properties[0].Value}},
@{n=’Source IP Adress’;e={$_.Properties[1].Value}},
@{n=’TimeStamp’;e={$_.TimeCreated}}
@{n=’Target RDP host’;e={$_.Properties[3].Value}}
)
(Get-WinEvent -FilterHashTable @{LogName=’Microsoft-Windows-TerminalServices-Gateway/Operational’;ID=’302′} | Select-Object $properties) -match $rdpusername
Добрый день.
Не подскажите как указать что бы показал за две недели например ?
$StartDate = (Get-Date).AddDays(-14)
......
Get-WinEvent -FilterHashTable @{LogName=’Microsoft-Windows-TerminalServices-Gateway/Operational’;ID=’302′,StartTime=$StartDat} | Select-Object $properties)
......
Подробнее про использование Get-WinEvent описано в статье по ссылке
https://winitpro.ru/index.php/2022/11/16/poisk-sobytij-event-log-powershell/
Подскажите как в скрипте выводить не «имя сервере/имя пользователя»
а «Имя рабочей станции/имя пользователя»
Раньше в 2008R2 через диспетчер задач было видно кто откуда был подключен(С домашнего ПК или с рабочего или с сервера)
выгружает историю всех УСПЕШНЫХ подключений. А есть скрипт который кроме этой информации выдаст и неуспешные попытки входа, а то выше по тексту — опять же — упоминается как получать по id из логов историю успешных входов, а вот как понять, что именно перебор шёл/идёт — ни слова.
Спасибо большое.
Добрый день а можно еще узнать с какой версией Windows подключался пользователь к RDGW?