Кто залогинен на удаленном компьютере powershell
Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.
Сообщения: 1
Благодарности: 0
ваш способ работает, если вы запускаете с Comp1
если вы с Comp1 будете смотреть Comp2 — поле будет пустым Username
ваш способ к сожалению не актуален
Просмотр истории входа пользователя с помощью WindowsLogon Powershell
В настоящее время я пытаюсь выяснить, как просмотреть историю входа пользователей на определенную машину. Эта команда предназначена для локального запуска, чтобы увидеть, сколько времени тратит консультант на сервер.
В настоящее время у меня есть только знания об этой команде, которая извлекает полный EventLog, но мне нужно отфильтровать его, чтобы он мог отображать пользователя или конкретного пользователя.
Get-EventLog System -Source Microsoft-Windows-WinLogon -After (Get-Date).AddDays (-5) -ComputerName $ env: имя_компьютера
Способ 2.
Другой вариант, которым вы можете это сделать, является использование wmic . Введите ниже в окно командной строки, изменив имя COMPUTERNAME на целевую машину;
Также часто требуется знать с какого компьютера подключился терминальный пользователь. Самый быстрый способ – запустить диспетчер задач.
Через файл ntuser.dat
Каждый раз, как пользователь входит в систему все его настройки загружаются из файла ntuser.dat, который находится в домашнем каталоге ‘C:UsersUserName’. При выходе из системы все настройки записываются в этот же файл. То есть мы можем получить имя пользователя по дате изменения этого файла.
В этом примере вернутся все каталоги пользователей:
Получим даты изменения файлов ‘ntuser.dat’:
Извлечем из пути имя пользователя и уберем лишние колонки:
Как вы знаете к большинству компьютеров можно подключится используя следующие пути:
Это же мы можем использовать с командой Get-ChildItem. Соединим все это в функцию:
Далее мы можем использовать команду в таких вариациях:
Ключ ‘-ErrorAction SilentlyContinue’ нужен для игнорирования ошибок связанных с выключенными компьютерами. Если его не написать вы получите ошибки формата:
- Get-ChildItem : Cannot find path ‘\CL2C$Users’ because it does not exist.
Отмечу несколько моментов:
- В отличие от первого скрипта Get-ChildItem может принимать массивы. Изменив строки на массивы вы можете немного ускорить работу скрипта. То есть вы можете написать
«Get-Childitem -Path ‘\Computer1C$Users’, ‘\Computer2C$Users’ «; - LogoffDate — это отдельный тип данных даты и времени, а это значит, например, что мы можем увидеть кто вышел за последний час/сутки. Пример будет ниже.
- Если вы выполняете команды типа ‘Invoke-Command’ (удаленные команды) — они тоже могут изменить файл ntuser.dat. То есть вы возможно захотите исключить часть пользователей из финального списка. Пример ниже.
Представим, что мы захотим сформировать список из тех пользователей, которые выполнили выход за последний час. Это можно сделать так:
Исключить пользователей мы можем так же:
Экспорт для Excel аналогичен предыдущему примеру:
Через WMI
У WMI есть множество классов, которые хранят значения времени входа пользователей и их времена. Например класс ‘Win32_NetworkLoginProfile’ тоже хранит их, но при удаленном использовании — вернет время входа только локальных пользователей, а не доменных. Класс ‘Win32_UserProfile’ — тоже хранит ‘LastUseTime’, но это время не обозначает именно процесс успешного входа после ввода логина и пароля. Класс ‘win32_computersystem’ отображает только имя пользователя.
Я пробовал и другие классы, но каждый со своими проблемами. Решения так и не нашел.
PowerShell – Получение информации о локальных пользователях и группах
Чтобы быстро получить информацию о списке локальных пользователей на удалённом компьютере можно воспользоваться подключением через PowerShell к интерфейсу WMI с запросом в одну строку:
Get-WmiObject Win32_UserAccount -ComputerName MyPC -Filter «Domain= MyPC'»
Тоже самое, но уже при обращении к интерфейсу ADSI :
$computerName = «MyPC»
$computer = ADSI «WinNT://$computerName,computer»
$computer .psbase.Children | Where-Object < H1toH2
.psbase.schemaclassname -eq ‘user’ >| Format-Table Name, Description -autoSize
Если нужно получить информацию с локального компьютера в переменной $ computerName укажем значение «.»
По аналогии для получения списка локальных групп безопасности удалённого компьютера используем команду:
Get-WmiObject Win32_Group -ComputerName MyPC -Filter «Domain=’MyPC'»
$computerName = «MyPC»
$computer = ADSI «WinNT://$computerName,computer»
$computer .psbase.Children | Where-Object <
.psbase.schemaclassname -eq ‘group’ >| Format-Table Name, Description -autoSize
Если же мы хотим получить картину в целом по всем существующим группам безопасности и членам, входящим в эти группы используем более сложную конструкцию:
$computerName = «MyPC»
$computer = ADSI «WinNT:// $computerName,computer»
$computer .psbase.children | where <
.psbase.schemaClassName -eq ‘group’ >| foreachwrite-host «Group:»
.Namewrite-host «Descr:»
.Descriptionwrite-host «——«
$group = ADSI
.psbase.Path$group .psbase.Invoke( «Members» ) | foreach
$ADSIName =
.GetType().InvokeMember( «AdsPath» , ‘GetProperty’ , $null ,
, $null )if ( $ADSIName -match «^//^/» )
String :: Join ( «» , $ADSIName .Split( «/» ) — 2.. — 1)
>
else
$ADSIName .Split( «/» ) — 1
>
>
write-host
>
/H1toH2
Windows: узнаём, кто где залогинен
Хорошо, если у вас есть инструмент а-ля BgInfo или ваши пользователи знают про шорткат Windows+Pause/Break и умеют его нажимать. Встречаются даже редкие экземпляры, которые успели выучить имя своей машины. Но часто у звонящего вдобавок к его основной проблеме появляется вторая: узнать имя/IP-адрес компьютера. И нередко на решение этой второй проблемы уходит куда больше времени, чем первой (а надо было всего лишь обои поменять или вернуть пропавший ярлык :).
А ведь намного приятнее услышать что-то вроде:
— Татьяна Сергеевна, не беспокойтесь, уже подключаюсь…
А надо для этого не так уж и много. Специалисту техподдержки достаточно лишь выучить наизусть имена машин и помнить, кто за какой работает.
Перед описанием решения, которым мы пользуемся сейчас, я кратко рассмотрю другие варианты, чтобы раскритиковать их в пух и прах объяснить свой выбор.
-
, Desktop Info и им подобные. Если много денег, есть и платные. Суть в том, что на десктоп выводится техническая информация: имя машины, IP-адрес, логин и т.д. В Desktop Info можно даже графики производительности запилить на половину экрана.
- Ярлык а-ля «Кто я» (не пытайтесь добавить ему знак вопроса в конце :). Классический ярлык на рабочем столе, за которым прячется аккуратный или не очень скрипт, выводящий нужную информацию в виде диалогового окна. Иногда вместо ярлыка на рабочий стол кладут сам скрипт, что ИМХО моветон.
Недостаток в том, что для запуска ярлыка, как и в первом случае, нужно сворачивать все открытые окна (баловней судьбы, у которых на рабочей машине открыто единственное окно с пасьянсом, в расчет не берём). Кстати, а ваши пользователи знают, куда нужно тыкнуть, чтобы свернуть все окна?Правильно, пальцем в глаз админу.
Не устраивает то, что для того же Bginfo, например, пользователю нужно сворачивать окна, чтобы увидеть нужные данные. Еще мы с коллегами не раз наблюдали у BgInfo характерный артефакт, когда новый текст выводится поверх старого.
Некоторых пользователей раздражает тот факт, что админы
Душу излил, а теперь к делу.
За основу была взята идея хабровчанина mittel из этой статьи.
Суть задумки в том, что при входе пользователя в Windows логон-скрипт заносит нужную информацию (время и имя машины) в определенный атрибут учётной записи пользователя. А при выходе из системы отрабатывает аналогичный логофф-скрипт.
- Групповая политика, в которой прописаны логон- и логофф-скрипты для пользователей, применяется ко всему домену, поэтому скрипты будут отрабатывать на любой машине, на которую логинятся пользователи. Если у вас наряду с рабочими станциями используются терминальные решения (например, Microsoft RDS или продукты Citrix), такой подход будет неудобным.
- Данные заносятся в атрибут Department учетной записи пользователя, на который у рядового пользователя есть доступ только на чтение. Помимо атрибута учётной записи пользователя, скрипт также вносит изменения в атрибут Department учётной записи компьютера, который по умолчанию пользователи также менять не могут. Поэтому чтобы решение работало, автор предлагает изменить стандартые настройки безопасности для объектов AD.
- Формат даты зависит от настроек локализации на конечной машине, поэтому с одной машины можем получить 10 ноября 2018 14:53, а с другой 11/10/18 2:53 p.m.
- GPO линкуется не к домену, а к OU с машинами (я разделяю пользователей и машины по разным OU и другим советую). При этом для loopback policy processing mode выставлен режим merge.
- Скрипт будет заносить данные только в учетную запись пользователя в атрибут Info, который пользователь может менять самостоятельно для своей учётной записи.
- Изменен кусок кода, генерирующий значение атрибута
Теперь скрипты выглядят так:
Кто первым найдет все отличия между логон- и логофф-скриптом, тому плюс в карму. 🙂
Также для получения наглядной информации создан такой небольшой PS-скрипт:
- создаем GPO с нужными настройками и линкуем его к подразделению с рабочими станциями пользователей:
- идем пить чай (если AD с большим количеством пользователей, то чая нужно много 🙂
- запускам PS-скрипт и получаем результат:
В верхней части окна есть удобный фильтр, в котором можно отбирать данные по значениям одного или нескольких полей. Клик по столбцам таблицы сортирует записи по значениям соответствующих полей.
Можно красиво «упаковать» наше решение.
Для этого добавим ярлык для запуска скрипта специалистам техподдержки, у которого в поле «объект» будет что-то такое:
powershell.exe -NoLogo -ExecutionPolicy Bypass -File «\servershareScriptsGet-UsersByPCsInfo.ps1»
Если сотрудников техподдержки много, то можно раздать ярлык с помощью GPP.