Получить имя хоста удаленного клиента RDP

В случае, если Вам понадобилось с помощью PowerShell узнать имя хоста, с которого выполняется подключение к удаленному рабочему столу, то для этого можно использовать системную переменную %clientname% .
$env:clientname
К примеру, так можно вывести сообщение с именем хоста, с которого выполняется подключение через RDP:
[System.Windows.MessageBox]::Show($env:clientname)
VBScript
В случае с помощью VBScript, так же проще всего использовать системную переменную %clientname% .
Set objShell = CreateObject("WScript.Shell") strClient = objShell.ExpandEnvironmentStrings("%clientname%")
После этого, можно использовать полученную переменную в любых целях, например — вывести на экран сообщением с именем хоста.
MsgBox(strClient)
Данный способ может не корректно работать, если у пользователя в свойствах стоит «Запускать окна с папками в отдельном процессе».
Как узнать имя пользователя на удаленном компьютере?

25.03.2021

itpro

Active Directory, PowerShell, Windows 10, Windows Server 2016

комментариев 7
Довольно часто администратору нужно быстро узнать имя пользователя, который выполнил вход на удаленном компьютере Windows. В это статье мы рассмотрим несколько утилит и PowerShell скриптов, которые помогут вам узнать имена пользователей, залогиненых на удаленных компьютерах в сети.
Утилиты PSLoggedOn и Qwinsta
В комплекте утилит SysInternals PSTools от Microsoft есть консольная утилита PSLoggedOn.exe, которую можно использовать для получения имени пользователя, который вошел на удаленный компьютер, а также список подключенных к нему SMB сеансов.
Скачайте утилиту и запустите ее в формате:

Как вы видите, утилита вернула имя залогиненного пользователя (Users logged on locally), а также список пользователей, которые по сети используют ресурсы с этого компьютера (Users logged on via resource shares).
Если нужно получить только имя пользователя, вошедшего локально, используйте опцию –l:
Psloggedon.exe \\wks215s1 –l
Утилита Psloggedon подключается к реестру и проверяет в нем имя пользователя, вошедшего локально. Для этого должна быть включена служба RemoteRegistry. Вы можете запустить ее и настроить автозапуск службы с помощью PowerShell:
Set-Service RemoteRegistry –startuptype automatic –passthru
Start-Service RemoteRegistry
Также можно получить список сессий на удаленном компьютере с помощью встроенной утилиты qwinsta . Эта утилита должна быть знакома любому администратору, управляющему терминальными серверами с Remote Desktop Services. Чтобы получить список сессий с удаленного компьютера, выполнит команду:

Утилита возвращает список всех сессий (активных и отключенных по таймауту) на RDS сервере или десктопной редакции Windows 10 (даже если вы разрешили к ней множественные RDP подключения).
Если при подключении к удаленному серверу через qwinsta вы получаете ошибку Error 5 Access Denied, проверьте что на удаленном компьютере разрешено удаленное управление пользователями через RPC. Включите, если нужно через реестр следующей командой или через GPO:
reg add «HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Terminal Server» /v «AllowRemoteRPC» /t «REG_DWORD» /d «1» /f
Получаем имя пользователя на удаленном компьютере через PowerShell
Вы можете получить имя пользователя, который залогинен на компьютере через WMI класс Win32_ComputerSystem. Откройте консоль PowerShell и выполните команду:
Get-WmiObject -class Win32_ComputerSystem | Format-List Username
Команда вернула имя пользователя, который выполнил вход на компьютер.

У командлета Get-WmiObject есть параметр –ComputerName, который можно использовать для получения доступа к WMI объектам на удаленном компьютере. Следующая команда вернет имя пользователя с удаленного компьютера:
(Get-WmiObject -class Win32_ComputerSystem –ComputerName wks215s1).Username

Данная команда показывает только пользователя, вошедшего на консоль (не через RDP).
Также для получения информации с удаленных компьютеров можно использовать PSRemoting с помощью командлета Invoke-Command.
Если нужно получить только имя пользователя на компьютере (без домена), воспользуетесь следующими командами:
$userinfo = Get-WmiObject -ComputerName ‘wks215s1’ -Class Win32_ComputerSystem
$user = $userinfo.UserName -split ‘\\’
$user[1]

В современных версиях PowerShell Core (pwsh.exe) вместо Get-WmiObject нужно использовать CIM командлет Get-CimInstance:
Get-CimInstance –ComputerName wks215s1 –ClassName Win32_ComputerSystem | Select-Object UserName
(Get-CimInstance -ComputerName wks215s1 -ClassName Win32_ComputerSystem).CimInstanceProperties | where| select value
![]()
GetCiminstance использует WinRM для подключения к удаленным компьютерам, поэтому на них нужно включить и настроить WinRM через GPO или командой:
PowerShell скрипт для проверки пользователей на удаленных компьютерах
Если вам нужно собрать информацию о пользователях сразу с нескольких компьютерах, можете использовать следующую PowerShell функцию получить имена пользователей.
function Get-LoggedUser < [CmdletBinding()] param ( [string[]]$ComputerName ) foreach ($comp in $ComputerName) < $output = @$output.UserName = (Get-WmiObject -Class win32_computersystem -ComputerName $comp).UserName [PSCustomObject]$output > >
На вход функции Get-LoggedUser нужно передать имена компьютеров, на которых нужно проверить имена пользователей:

Если для какого-то компьютера функция вернула пустое имя пользователя, значит на компьютер никто не залогинен.
Можно получить имена пользователей, которые работают на компьютерах в домене Active Directory. Для получения списка компьютеров нужно использовать командлет Get-ADComputer. В следующем примере мы получим имена пользователей, которые работают за активными компьютерами в определенном OU домена. Чтобы скрипт работал быстрее перед тем, как обратится к обратится к удаленному компьютеру, я добавил проверку его доступности по сети через ICMP пинг с помощью командлета Test-NetConnection:
function Get-LoggedUser < [CmdletBinding()] param ( [string[]]$ComputerName ) foreach ($comp in $ComputerName) < if ((Test-NetConnection $comp -WarningAction SilentlyContinue).PingSucceeded -eq $true) < $output = @$output.UserName = (Get-WmiObject -Class win32_computersystem -ComputerName $comp).UserName > else < $output = @$output.UserName = "offline" > [PSCustomObject]$output > > $computers = (Get-AdComputer -Filter -SearchBase 'OU=Kazan,DC=winitpro,DC=loc').Name Get-LoggedUser $computers |ft -AutoSize

Также обратите внимание, что вы можете хранить в свойствах компьютеров в AD имя пользователя, который выполнил вход. Для этого можно использовать логон скрипт, описанный в статье “Set-ADComputer: добавляем информацию о пользователе в свойства компьютеров AD”
После этого вам не нужно сканировать все компьютеры, чтобы найти где залогинен определенный пользователь. Можно найти компьютер пользователя простым запросом к Active Directory:
$user=’dvpetrov’
$user_cn=(get-aduser $user -properties *).DistinguishedName
Get-ADComputer -Filter «ManagedBy -eq ‘$user_cn'» -properties *|select name,description,managedBy|ft
Предыдущая статья Следующая статья
Получить имя компьютера через IP адрес
Даже если в сети развернута AD, то не факт что правильно настроена обратная зона. Поэтому при DNS-запросах адрес может не резолвится. Однако в стандартной конфигурации Windows сети включена поддержка протокола NetBIOS. И используя встроенную консольную утилиту nbtstat, можно попытаться узнать имя удаленного компьютера. Как вариант использовать ping -a 192.168.1.1. P.S. Кстати логично, что от пользователя System скрипт не работает — нет прав у этого пользователя для обращения к удаленному компьютеру по протоколу SMB.
4 апр 2019 в 8:46
2 ответа 2
Сортировка: Сброс на вариант по умолчанию
Поскольку используется AD, то я предлагаю использовать источником для создания базы данных рабочих станций журнал аудита контроллера домена. Вот пример сведений из записи (EventID=4624 / вход в систему), которая возникает при загрузке рабочей станции домена и её попытке связаться с контроллером доменом (на базе W2K8).
Имя учетной записи: COMPUTER0$ Домен учетной записи: DOMAIN-A Код входа: 0x316d2639 GUID входа: Сведения о процессе: Идентификатор процесса: 0x0 Имя процесса: - Сведения о сети: Имя рабочей станции: Сетевой адрес источника: 192.168.1.170
Как видно из текста, доступно имя станции (с добавленным символом $ в конце). И самое необходимое — IP-адрес узла, который общался с контроллером домена.
Дальше дело техники:
- Использовать техническую учетную запись с правами локального администратора контроллера домена, чтобы прочесть записи с журнала «Безопасность»
- Распарсить XML-данные записей журнала.
- Задать соответствие имени и IP, и занести это в базу.
P.S. Альтернативным решением было бы поднять службу WINS, которая работает в автоматическом режиме, практически не требуя настроек. Но, если мне не изменяет память, данный сервис имеет крупные уязвимости, вплоть до RTE.
Либо все же правильно настроить службу DNS. Так чтобы обратные имена корректно регистрировались в базе DNS.
ВНИМАНИЕ. «Имя компьютера, за которым Вы работаете?»
Вопрос, на который пользователи часто затрудняются дать ответ, что увеличивает время на решение их задач или проблем при удаленной поддержке.
Для того чтобы узнать имя компьютера необходимо сделать следующее:
В ОС Windows XP:
Нажать правую кнопку мышки на значок Мой компьютер, находящийся на Рабочем столе, и в контекстном меню выбрать пункт Свойства и нажать на него Левой кнопкой мышки:

В открывшемся окне выбрать вкладку Имя Компьютера:
Во вкладке Имя Компьютера Вы можете прочитать Полное имя:
В ОС Windows Vista и Windows 7:
Нажать правую кнопку мышки на значок Мой компьютер, находящийся на Рабочем столе, и в контекстном меню выбрать пункт Свойства и нажать на него Левой кнопкой мышки:

В открывшемся окне Вы можете увидеть Полное имя Вашего компьютера:

НО! Имя компьютера и Имя пользователя могут не совпадать:
В меню Пуск пишется Имя пользователя! Это видно на скриншоте ниже:

Также имя пользователя при подключении к Удаленному рабочему столу сервера терминалов (в нашей организации это сервера Titan, Appolo итд) может не совпадать с именем пользователя локального компьютера или его Полным именем.

Красной стрелочкой — это Имя пользователя на Сервере терминалов!
Если ВЫ не желаете, каждый раз набирать пароль при подключении к Удаленному рабочему столу Сервера терминалов, Вы можете забить пароль и поставить «галочку» Сохранить мой пароль (указано зеленой стрелочкой).