
Довольно часто администратору необходимо быстро узнать имя пользователя, вошедшего в систему на удаленном компьютере Windows. В этой статье мы покажем несколько инструментов и сценариев PowerShell, которые помогут вам узнать имена пользователей, вошедших в систему на удаленном компьютере.
Проверка зарегистрированных пользователей с помощью PSLoggedOn и Qwinsta
В состав SysInternals PSTools от Microsoft входит консольная утилита под названием PSLoggedOn.exe с помощью которого можно получить имя пользователя, вошедшего в систему на удаленном компьютере, а также список подключенных к нему SMB-сессий.
Загрузите инструмент и запустите его:
psloggedon \\RemoteCompName
Как видите, инструмент вернул имя вошедшего в систему пользователя (Пользователи, вошедшие в систему локально) и список пользователей, которые получают доступ к SMB-ресурсам этого компьютера по сети (Пользователи, вошедшие в систему через общие ресурсы).
Если вы хотите получить только имя пользователя, вошедшего в систему локально, используйте команду -l вариант:
Psloggedon.exe \\pc1215wks1 –l
PSLoggedOn подключается к реестру и проверяет имя пользователя, вошедшего в систему локально. Для этого используется RemoteRegistry служба должна быть запущена. Запустить и настроить автоматический запуск службы можно с помощью PowerShell:
Set-Service RemoteRegistry –startuptype automatic –passthru
Start-Service RemoteRegistry
Вы также можете получить список сеансов на удаленном компьютере с помощью встроенной функции qwinsta
инструмент. Этот инструмент должен быть знаком любому администратору, управляющему терминальной средой Remote Desktop Services (RDS). Чтобы получить список зарегистрированных пользовательских сессий с удаленного компьютера, выполните команду:
qwinsta /server:be-rdsh01
Инструмент возвращает список всех сессий (активных и отключенных по таймауту RDP) на RDS-сервере или на рабочем столе Windows 10 (11) редакции (даже если вы разрешили несколько RDP-подключений к нему).
reg add "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Terminal Server" /v "AllowRemoteRPC" /t "REG_DWORD" /d "1" /f
Как получить текущего пользователя на удаленном компьютере с помощью PowerShell?
Вы можете получить имя пользователя, вошедшего в систему на компьютере, используя команду Win32_ComputerSystem WMI-класс. Откройте консоль PowerShell и выполните команду:
Get-WmiObject -class Win32_ComputerSystem | Format-List Username
Команда возвращает имя пользователя, вошедшего в систему на компьютере.
Команда Get-WmiObject имеет следующие функции -ComputerName опция, которую можно использовать для доступа к объектам WMI на удаленном компьютере. Следующая команда вернет имя пользователя, вошедшего в систему на удаленном компьютере:
(Get-WmiObject -class Win32_ComputerSystem –ComputerName pc1215wks1).Username
Команда показывает только пользователя, вошедшего в консоль (не через RDP).
Если вы можете получить только имя пользователя на удаленном компьютере (без домена), используйте эти команды:
$userinfo = Get-WmiObject -ComputerName pc1215wks1 -Class Win32_ComputerSystem
$user = $userinfo.UserName -split '\\'
$user[1]
Get-CimInstance –ComputerName pc1215wks1 –ClassName Win32_ComputerSystem | Select-Object UserName
Или:
(Get-CimInstance -ComputerName pc1215wks1 -ClassName Win32_ComputerSystem).CimInstanceProperties | where{$_.Name -like "UserName"}| select value
GetCiminstance использует WinRM для подключения к удаленным компьютерам, поэтому вам необходимо включить и настроить WinRM на них с помощью GPO или следующей команды:
WinRM quickconfig
Сценарий PowerShell для поиска зарегистрированных пользователей на удаленных компьютерах
Если вам нужно собрать информацию о вошедших в систему пользователях с нескольких компьютеров, вы можете использовать следующую функцию PowerShell для получения имен пользователей.
function Get-LoggedUser { [CmdletBinding()] param ( [string[]]$ComputerName ) foreach ($comp in $ComputerName) { $output = @{'Computer' = $comp } $output.UserName = (Get-WmiObject -Class win32_computersystem -ComputerName $comp).UserName [PSCustomObject]$output } }
Укажите имена компьютеров, на которых вы хотите проверить имена пользователей с помощью Get-LoggedUser:
Get-LoggedUser pc1215wks1,pc1215wks2,mun-dc01
Если функция возвращает пустое имя пользователя для компьютера, это означает, что никто не вошел в систему.
Вы можете получить имена пользователей, вошедших в систему на компьютерах в домене Active Directory. Используйте команду Get-ADComputer, чтобы получить список компьютеров в домене. В приведенном ниже примере мы получим имена пользователей, зарегистрированных на активных компьютерах в определенном OU домена. Чтобы сценарий работал быстрее, прежде чем получить доступ к удаленному компьютеру, я добавил проверку его доступности с помощью ICMP ping и команды Test-NetConnection:
function Get-LoggedUser { [CmdletBinding()] param ( [string[]]$ComputerName ) foreach ($comp in $ComputerName) { if ((Test-NetConnection $comp -WarningAction SilentlyContinue).PingSucceeded -eq $true) { $output = @{'Computer' = $comp } $output.UserName = (Get-WmiObject -Class win32_computersystem -ComputerName $comp).UserName } else { $output = @{'Computer' = $comp } $output.UserName = "offline" } [PSCustomObject]$output } } $computers = (Get-AdComputer -Filter {enabled -eq "true"} -SearchBase 'OU=Berlin,DC=woshub,DC=com').Name Get-LoggedUser $computers |ft -AutoSize
Также обратите внимание, что вы можете хранить имя вошедшего в систему пользователя в свойствах компьютера в AD. Для этого можно использовать сценарий входа в систему, описанный в статье «Set-ADComputer: Как добавить информацию о пользователе в свойства компьютера AD».
После этого вам не нужно будет сканировать все компьютеры, чтобы найти, где определенный пользователь вошел в систему. Вы можете найти компьютер пользователя с помощью простого запроса к Active Directory:
$user="m.smith"
$user_cn=(Get-ADuser $user -properties *).DistinguishedName
Get-ADComputer -Filter "ManagedBy -eq '$user_cn'" -properties *|select name,description,managedBy|ft