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

Утиліти PSLoggedOn і Qwinsta

У комплекті утиліт SysInternals PSTools від Microsoft є консольна утиліта PSLoggedOn.exe, Яку можна використовувати для отримання імені користувача, який увійшов на віддалений комп’ютер, а також список підключених до нього SMB сеансів.

Скачайте утиліту і запустіть її в форматі:

psloggedon \RemoteCompName

утиліта PSLoggedOn

Як ви бачите, утиліта повернула ім’я залогіненним користувача (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. Щоб отримати список сесій з віддаленого комп’ютера, виконає команду:

qwinsta /server:dc01

qwinsta - список сесій користувачів на комп'ютері

Утиліта повертає список всіх сесій (активних і відключених з таймаут) на RDS сервері або деськтопной редакції Windows 10 (навіть якщо ви дозволили до неї множинні RDP підключення).

Якщо при підключенні до віддаленого сервера через qwinsta ви отримуєте помилку Error 5 Access Denied, перевірте що на віддаленому комп’ютері дозволено віддалене керування користувачами через RPC. Увімкніть, якщо потрібно через реєстр наступною командою або через GPO:

reg add "HKEY_LOCAL_MACHINESYSTEMCurrentControlSetControlTerminal Server" /v "AllowRemoteRPC" /t "REG_DWORD" /d "1" /f

Отримуємо ім’я користувача на віддаленому комп’ютері через PowerShell

Ви можете отримати ім’я користувача, який залягання на комп’ютері через WMI клас Win32_ComputerSystem. Відкрийте консоль PowerShell і виконайте команду:

Get-WmiObject -class Win32_ComputerSystem | Format-List Username

Команда повернула ім’я користувача, який виконав вхід на комп’ютер.

Get-WmiObject -клас Win32_ComputerSystem Ім'я користувача

У командлет Get-WmiObject є параметр -ComputerName, який можна використовувати для отримання доступу до WMI об’єктів на віддаленому комп’ютері. Наступна команда поверне ім’я користувача з віддаленого комп’ютера:

(Get-WmiObject -class Win32_ComputerSystem –ComputerName wks215s1).Username

Get-WmiObject ComputerName Username ім'я користувача з віддаленого комп'ютера windows

Дана команда показує тільки користувача, який перебуває на консоль (не через RDP).

Також для отримання інформації з віддалених комп’ютерів можна використовувати PSRemoting за допомогою командлета Invoke-Command.

Якщо потрібно отримати тільки ім’я користувача на комп’ютері (без домена), скористаєтеся наступними командами:

$userinfo = Get-WmiObject -ComputerName 'wks215s1' -Class Win32_ComputerSystem
$user = $userinfo.UserName -split '\'
$user[1]

powershell скрипт вивести ім'я користувача з віддаленого комп'ютера

У сучасних версіях 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{$_.Name -like "UserName"}| select value

Get-CimInstance дізнатися ім'я користувача з віддаленого комп'ютера

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 wks215s1,wks215s2,dc01

Get-LoggedUser - powershell скрипт для отримання імені залогіненним користувачів

Якщо для якогось комп’ютера функція повернула порожнє ім’я користувача, значить на комп’ютер ніхто не залягання.

Можна отримати імена користувачів, які працюють на комп’ютерах в домені 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 = @{'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=Kazan,DC=winitpro,DC=loc').Name
Get-LoggedUser $computers |ft -AutoSize

powershell скрипт отримати інформацію по користувачів з комп'ютерів в домені active directory

Також зверніть увагу, що ви можете зберігати у властивостях комп’ютерів в 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

Leave a Reply

Your email address will not be published. Required fields are marked *