Powershell как узнать кто залогинен на пк
Перейти к содержимому

Powershell как узнать кто залогинен на пк

  • автор:

Как узнать имя пользователя на удаленном компьютере?

date

25.03.2021

user

itpro

directory

Active Directory, PowerShell, Windows 10, Windows Server 2016

comments

комментариев 7

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

Утилиты PSLoggedOn и Qwinsta

В комплекте утилит SysInternals PSTools от Microsoft есть консольная утилита PSLoggedOn.exe, которую можно использовать для получения имени пользователя, который вошел на удаленный компьютер, а также список подключенных к нему SMB сеансов.

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

утилита 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 - список сессий пользователей на компьютере

Утилита возвращает список всех сессий (активных и отключенных по таймауту) на 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 -class Win32_ComputerSystem Username

У командлета 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| select value

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

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 нужно передать имена компьютеров, на которых нужно проверить имена пользователей:

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 = @$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

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

Предыдущая статьяПредыдущая статья Следующая статья Следующая статья

Записки IT специалиста — Форум

Вернуться в блог

29 октября 2023, 12:21

Цитата дня:

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

  • Записки IT специалиста — Форум
  • ► Сети и инфрастуктура
  • ► Active Directory
  • ► Залогиненные пользователи на ПК в консоли Active Directory онлайн

Залогиненные пользователи на ПК в консоли Active Directory онлайн

Автор STALKER_SLX, 14 сентября 2019, 13:38

0 Пользователей и 1 Гость просматривают эту тему.

Узнать где залогинен пользователь в сети

Зная имя пользователя узнать на каком компьютере он залогинен в сети. (домен)
например, вводишь пользователя ISKoftun и скрипт должен выдать имя компьютера, где он залогинен.
заранее спасибо за помощь!

94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
Ответы с готовыми решениями:

Узнать имя компьютера на котором залогинен пользователь в сети (AD)
Всем привет! Как узнать имя компа, на который залогинен пользовательв сети (AD)? Например.

Авторизация через HttpWebRequest — В возвращённом HTML-файле пользователь всё ещё не залогинен
Авторизуюсь на сайте. При неправильных данных в возращаемом хтмле нахожу строчку, мол да.

Враги могут узнать где я бываю в сети! Что делать?
Я использую прокси-сервера, но это несколько тормозит соединение. Хотелось бы узнать по-подробнее.

Отслеживание трафика в сети или как узнать кто где шарил?
Возник вопрос по отслеживанию трафика в локальной сети с интернетом. Приведу вопросы в примерах.

403 / 86 / 8
Регистрация: 16.02.2013
Сообщений: 358
А что Вы сделали и у Вас не получилось?
221 / 174 / 73
Регистрация: 05.11.2015
Сообщений: 529
Cat2, я просто даже тупо не знаю с чего начать? вообще реально это сделать?
Регистрация: 04.03.2017
Сообщений: 23

Я бы начал с того, что информация о залогиненных пользователях не хранится в АД, а только на самих машинах (по умолчанию). Значит нужно сначала опросить все машины в сети, потом их пропинговать, а те что отвечают опросить на информацию о залогиненном пользователе, и сравнить с искомым.

начать можно так

1 2 3 4 5 6 7 8 9 10 11 12 13 14
cls #Запущенные компьютеры в АД записываем в переменную $Comp $Comp = Get-ADComputer -Filter * | Where-Object { $_.enabled -eq $true } | Select-Object name | Sort-Object Name #теперь смотрим кто пингуется foreach ($pc in $Comp) { if ( (Test-Connection -ComputerName $pc.Name -Count 1 -ErrorAction SilentlyContinue) -eq "True") { # тут пишем часть скрипта кто залогинен } }

Если компов в сети много, то для ускорения пинга можно воспользоваться распарралеливанием при помощи Measure-Command либо foreach -parallel

2618 / 548 / 109
Регистрация: 21.03.2012
Сообщений: 1,051

ЦитатаСообщение от bd_13 Посмотреть сообщение

. с чего начать? вообще реально это сделать?

bd_13, информация об открытии/закрытии сеанса пользователя домена всегда найдётся в журналах «Безопасность» контроллеров домена.
В случае многоконтроллерного домена, правда, придётся сводить в одно целое результаты запросов ко всем контроллерам, сопоставляя время входа и выхода одного и того же пользователя.
Если пользователю при начале сеанса назначается для работы некая папка на файловом ресурсе общего доступа, то можно запросить у службы «Сервер» соответствующего компьютера список открытых на текущий момент подключений.

Регистрация: 04.03.2017
Сообщений: 23

Dmitrii, интеерсная идея, я решил ее попробовать провернуть.
Ещё на первых этапах сбора логов возникли «трудности».
Пример:

Get-EventLog -logname Security -InstanceId 4624 -after (Get-Date -hour 0 -minute 0 -Second 0)| where {$_.message -match "Logon Type:\s+3"} | where {$_.message -match "ИмяПользователя"}

Во первых, как таковых «входов» в компьютер не фиксируется в эвентлоге домен контроллера (тип входа 2), а фиксируетя только «сетевой вход» (тип входа 3).
Во вторых, время обработки эвентлога занимает достаточно продолжительное время, и это в небольшой сети (до 300 пользователей), а если сеть больщая и таких сетевых входов в разы больше?

Может можно как-то останавливать выполнение задачи после получения первого нужного значения?

2618 / 548 / 109
Регистрация: 21.03.2012
Сообщений: 1,051

ЦитатаСообщение от DamNet Посмотреть сообщение

. фиксируетя только «сетевой вход» (тип входа 3).
Для обнаружения сеанса пользователя этого достаточно.

ЦитатаСообщение от DamNet Посмотреть сообщение

. время обработки эвентлога занимает достаточно продолжительное время.

А молниеносной работы обещано и не было.
Однако, во-первых, время, необходимое для выполнения выборки, сильно зависит от размера журнала (его ведь можно периодически очищать, предварительно сохраняя удаляемые сведения), во-вторых, время опроса всех станций домена может оказаться ничуть не меньшим, наконец, удалённые подключения к станциям могут блокироваться, скажем, брандмауэрами.

Кроме уже упомянутого есть и другие трудности:
— сопоставление данных из журналов всех контроллеров (если домен многоконтроллерный);
— сопоставление событиям входа событий выхода, т.к. в журнал вносятся служебные записи этой же категории, связанные с работой служб.

Задача эта сложнее, чем прямой опрос станций, но вполне решаемая.

Ищем, где залогинен пользователь [powershell]

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

В целом скрипт в какой то степени повторяет функционал ]]> psloggedon ]]> от sysinternals, но в отличие от этой утилиты – не требует, чтобы на целевом компе был включен удалённый реестр.

Традиционно скрипт доступен ]]> на github ]]> .

Для работы необходимо чтобы в папке со скриптом был размещен psexec, также, если планируется проходиться по всем компьютерам в домене, на машине, где запускается скрипт должен стоять модуль Active Directory для PowerShell.

Кратко опишу логику работы и параметры.

Параметр user – пользователь которого ищем, обязательный параметр.

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

Maxthreads – максимальное число одновременных потоков – по умолчанию 50, в зависимости от ситуации – можно уменьшить, или наоборот увеличить.

Allsevers – true/false – идёт поиск только по компьютерам, в чьем имени или пути в AD есть server.

Если не заданы allservers и comps – то поиск происходит по всем включённым компьютерам в AD.

Логика работы тут такая – составляется список компов, далее для каждого компа создается поток, вернее задание, сперва проверяется доступность компа, далее идёт попытка подключиться через remote powershell, если psremoting на компе не включен, то идёт подключение при помощи psexec.

к сожалению, из-за механизма работы, так нельзя проверить себя, вернее УЗ от имени которой выполняется скрипт, т.к. фактически – она будет залогинена на всех машинах. Так что, если нужно будет это проверить, нужно и скрипт выполнить от имени другой учётки.

На выходе формируется CSV файл, где указано, залогинен ли пользователь на компе, не залогинен, или произошла какая-то ошибка.

 param ( [PARAMETER(Mandatory=$True,Position=0)][String]$user, [PARAMETER(Mandatory=$False,Position=1)][String[]]$comps, [PARAMETER(Mandatory=$False,Position=2)][int]$maxthreads, [PARAMETER(Mandatory=$False,Position=3)][Bool]$AllServers ) import-module activedirectory $sid=get-aduser $user -erroraction stop if ($maxthreads -eq 0) < $maxthreads=50 >if ($comps -eq $null -and $AllServers -ne $True) < $comps=(get-adcomputer -filter -erroraction stop).name > if ($AllServers -eq $True) < $comps=(Get-ADComputer -Filter -erroraction stop | ?).name > $csvPath=".\result.csv" $pstoolsPath="$PSScriptRoot\" $total=$comps.count foreach ($comp in $comps) < $job=< $pstoolsPath=$args[2] if (!(test-path "$($pstoolspath)psexec.exe"))< write-host "psexec not found" return >$path="REGISTRY::HKEY_USERS\$($args[1])" if (Test-Connection $args[0] -Count 2) < try < $test=invoke-command -erroraction stop -computername $args[0] < param($path) Test-Path $path >-ArgumentList $path if ($test -eq $True) < $result="true" >elseif ($test -eq $False) < $result="false" >else < $result="powershell error" >> catch < cd $pstoolsPath $test=(.\psexec.exe -nobanner -accepteula \\$($args[0]) powershell.exe -nologo -NonInteractive -noprofile -command "Test-Path $path") if ($test -eq "True")< $result="true" >elseif ($test -eq "False") < $result="false" >else < $result="error" >> > else < $result="unavailable" >write-host "$($args[0]);$result" > $maxthreads Start-Job -Name $comp -ScriptBlock $job -argumentlist @($comp,$sid.sid,$pstoolsPath) While (@(Get-Job | Where < $_.State -eq "Running" >).Count -gt $maxthreads) < $completed=((Get-Job | Where < $_.State -ne "Running" >).Count) $percentCompleted=($completed*100/$total) Write-Progress -Activity "Search in progress. " -status "$percentCompleted% Completed" -PercentComplete $percentCompleted Start-Sleep -Seconds 3 > > While (@(Get-Job | Where < $_.State -eq "Running" >).Count -gt 0) < $completed=((Get-Job | Where < $_.State -ne "Running" >).Count) $percentCompleted=($completed*100/$total) Write-Progress -Activity "Search in progress. " -status "$percentCompleted% Completed" -PercentComplete $percentCompleted Start-Sleep -Seconds 3 > $final=get-job | receive-job 6>&1 get-job | remove-job "computer;result" | Out-File $csvPath -Encoding utf8 $final | Out-String | Out-File $csvPath -Encoding utf8 -append

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *