как узнать где залогинен пользователь ad
Windows: узнаём, кто где залогинен
— Ой, у меня ничего не работает, помогите!
— Не переживайте, сейчас всё исправим. Назовите имя компьютера…
(классика жанра из звонков в техподдержку)
Хорошо, если у вас есть инструмент а-ля BgInfo или ваши пользователи знают про шорткат Windows+Pause/Break и умеют его нажимать. Встречаются даже редкие экземпляры, которые успели выучить имя своей машины. Но часто у звонящего вдобавок к его основной проблеме появляется вторая: узнать имя/IP-адрес компьютера. И нередко на решение этой второй проблемы уходит куда больше времени, чем первой (а надо было всего лишь обои поменять или вернуть пропавший ярлык :).
А ведь намного приятнее услышать что-то вроде:
— Татьяна Сергеевна, не беспокойтесь, уже подключаюсь…
А надо для этого не так уж и много. Специалисту техподдержки достаточно лишь выучить наизусть имена машин и помнить, кто за какой работает.
Перед описанием решения, которым мы пользуемся сейчас, я кратко рассмотрю другие варианты, чтобы раскритиковать их в пух и прах объяснить свой выбор.
Душу излил, а теперь к делу.
За основу была взята идея хабровчанина mittel из этой статьи.
Суть задумки в том, что при входе пользователя в Windows логон-скрипт заносит нужную информацию (время и имя машины) в определенный атрибут учётной записи пользователя. А при выходе из системы отрабатывает аналогичный логофф-скрипт.
Теперь скрипты выглядят так:
Кто первым найдет все отличия между логон- и логофф-скриптом, тому плюс в карму. 🙂
Также для получения наглядной информации создан такой небольшой PS-скрипт:
Буду признателен, если вы пройдете короткий опрос ниже.
Получаем в Powershell активных сессий пользователей AD и их компьютеров
Когда появляется необходимость сделать работу на компьютере пользователя, по его заявке, иногда бывает сложно узнать имя компьютера для подключения к нему. В этой статье будет рассмотрена возможность сбора всех активных сеансов пользователей (тех кто прошел аутентификацию на определенном компьютере) на всех компьютерах AD. Конечно, есть сторонние программы, которые решают такие проблемы и встроенные средства, но тут будет рассмотрена реализация через Powershell. Такой список так же хорошо подойдет для аудита, если понадобится быстро узнать кто пользовался компьютером и когда.
Навигация по посту
Как получить список залогиненных пользователей
В Powershell есть несколько методов возврата списка активных пользователей. Каждый из способов имеет свои минусы и поэтому, в зависимости от цели, какой-то способ будет удобнее использовать локально (при входе пользователя), а какой-то удаленно. В случае с WMI это так и не получилось сделать, так нет класса, который бы хранил все нужные значение и работал бы везде.
Локально при входе пользователя
Можно создать политику, которая будет запускать скрипт при входе и экспортировать в CSV. Сам файл CSV может находится на удаленном компьютере. Следующая команда сделает это записав данные в конец существующий файл (т.е. не перезапишет файл):
Получится примерно следующий вид файла:
Как создавать команды и функции в Powershell вызывать их и передавать параметры
Системная утилита quser.exe
Мы можем использовать системную программу quser, которая возвращает имя текущего пользователя и время его входа. Выглядит это так:
Quser так же может работать удаленно используя следующий синтаксис:
Для примера, следующие команды исправят эти проблемы на одном компьютере, но скорее всего вы будете менять настройки через политики. Так же обратите внимание, что правило устанавливается на «Any», а не только «Domain»:
Метод substring убирает первый символ, так как программа возвращает имя пользователя либо с пробелом начали или символом «>».
Такой скрипт мы можем объединить в один командлет, который сможет работать локально и удаленно:
В функцию добавлено несколько деталей:
Мы можем вызывать скрипт несколькими приемами:
Легче всего такой скрипт запускать на компьютерах пользователей, по событию входа в систему. На примере ниже я экспортирую эти данные в единый, для всех пользователей, файл CSV расположенный в доступности для пользователей:
Сам файл будет выглядеть так:
Отмечу следующие моменты:
Через файл ntuser.dat
Каждый раз, как пользователь входит в систему все его настройки загружаются из файла ntuser.dat, который находится в домашнем каталоге ‘C:\Users\UserName\’. При выходе из системы все настройки записываются в этот же файл. То есть мы можем получить имя пользователя по дате изменения этого файла.
В этом примере вернутся все каталоги пользователей:
Получим даты изменения файлов ‘ntuser.dat’:
Извлечем из пути имя пользователя и уберем лишние колонки:
Как вы знаете к большинству компьютеров можно подключится используя следующие пути:
Это же мы можем использовать с командой Get-ChildItem. Соединим все это в функцию:
Далее мы можем использовать команду в таких вариациях:
Ключ ‘-ErrorAction SilentlyContinue’ нужен для игнорирования ошибок связанных с выключенными компьютерами. Если его не написать вы получите ошибки формата:
Отмечу несколько моментов:
Представим, что мы захотим сформировать список из тех пользователей, которые выполнили выход за последний час. Это можно сделать так:
Исключить пользователей мы можем так же:
Экспорт для Excel аналогичен предыдущему примеру:
Через WMI
Я пробовал и другие классы, но каждый со своими проблемами. Решения так и не нашел.
Узнать где залогинен пользователь в сети
Узнать имя компьютера на котором залогинен пользователь в сети (AD)
Всем привет! Как узнать имя компа, на который залогинен пользовательв сети (AD)? Например.
Враги могут узнать где я бываю в сети! Что делать?
Я использую прокси-сервера, но это несколько тормозит соединение. Хотелось бы узнать по-подробнее.
Отслеживание трафика в сети или как узнать кто где шарил?
Возник вопрос по отслеживанию трафика в локальной сети с интернетом. Приведу вопросы в примерах.
Я бы начал с того, что информация о залогиненных пользователях не хранится в АД, а только на самих машинах (по умолчанию). Значит нужно сначала опросить все машины в сети, потом их пропинговать, а те что отвечают опросить на информацию о залогиненном пользователе, и сравнить с искомым.
Во первых, как таковых «входов» в компьютер не фиксируется в эвентлоге домен контроллера (тип входа 2), а фиксируетя только «сетевой вход» (тип входа 3).
Во вторых, время обработки эвентлога занимает достаточно продолжительное время, и это в небольшой сети (до 300 пользователей), а если сеть больщая и таких сетевых входов в разы больше?
Может можно как-то останавливать выполнение задачи после получения первого нужного значения?
А молниеносной работы обещано и не было.
Однако, во-первых, время, необходимое для выполнения выборки, сильно зависит от размера журнала (его ведь можно периодически очищать, предварительно сохраняя удаляемые сведения), во-вторых, время опроса всех станций домена может оказаться ничуть не меньшим, наконец, удалённые подключения к станциям могут блокироваться, скажем, брандмауэрами.
Кроме уже упомянутого есть и другие трудности:
— сопоставление данных из журналов всех контроллеров (если домен многоконтроллерный);
— сопоставление событиям входа событий выхода, т.к. в журнал вносятся служебные записи этой же категории, связанные с работой служб.
Задача эта сложнее, чем прямой опрос станций, но вполне решаемая.
На каком компьютере залогинился пользователь?
На каком компьютере залогинился пользователь?
В какой ситуации нам может понадобиться узнать, на каком компьютере залогинился (выполнил вход) пользователь?
Как правило, это нужно для того, чтобы удаленно подключиться к компьютеру клиента, либо при составлении отчетности, в которой указывается имя сотрудника и компьютер, за которым он сидит. Так же информация может быть полезна при проектировании групповой политики.
На просторах интернета я нашел различные варианты, в которых предлагаю писать скрипты, однако мы с вами рассмотрим метод куда проще.
Использую стандартные средства серверной операционной системы, в моем примере будет рассматриваться Windows Server 2008 R2.
Рассмотрим примерный сценарий задачи по поиску компьютера, на котором залоигнился (выполнил вход) пользователь.
Пользователь звонит вам в поисках решения определенного вопроса, и первым делом мы узнаем (если не знаем) фамилию и имя сотрудника. Далее, для подключения к компьютеру нам нужно, по полученным данным, выяснить за каким компьютером сидит данный сотрудник. Для этого заходим в (Пуск \ Администрирование \ Диспетчер сервера \ Роли \ Доменные службы Active Directory \ Active Directory – пользователи и компьютеры \ ваш домен.local \ ПКМ \ Найти)
Вводим имя сотрудника, которое нас интересует и жмем кнопку «Найти»
Из полученных данных нам нужно узнать логин пользователя, под которым он выполняет вход (залогинивается) в систему. Нужен именно логин, так как имя не является логином, по этому открываем свойства учетной записи и переходим во вкладку «Учетная запись». Где узнаем имя входа пользователя.
Теперь нам потребуется проверить, на какой компьютер последний раз выполнялся вход под данной учетной записью? Для этого запустим «Журнал событий» (Пуск \ Администрирование \ Просмотр событий \ Журналы Windows \ Безопасность)
Как вы видите, у нас есть записи из категории «Вход в систему» Именно в таких записях и хранится информация о том, на каком компьютере залогинился (выполнил вход) пользователь. Теперь нам остается найти запись, в которой фигурирует наш пользователь, для этого выполним поиск по данным записям щелкнув правой кнопкой мыши по вкладке (Безопасность \ Найти \ Вводим логин пользователя \ Найти далее) и ищем запись из категории «Вход в систему»
Заходим в свойства записи и смотрим, чтобы «Имя учетной записи» совпадало с нашим, если все совпадает, то смотрим «Сетевой адрес источника» это и есть IP адрес машины, на которую последний раз выполнял вход (залогинивался) наш пользователь.
Теперь можем узнать доменное имя машины, по её IP адресу через команду в командной строке (Пуск \ Выполнить \ cmd) ping –a 192.168.0.97
Вот и все, теперь мы знаем, что пользователь Севостьянов Антон последний раз был залогинен на компьютере admins. Скорее всего, он за ним и сидит.
А далее уже можем использовать полученную информацию в своих интересах, как вариант это подключиться через удаленный рабочий стол, удаленный помощник, Radmin или удаленно установить LiteManager и подключиться к нему.
В качестве альтернативы, можно вывести на рабочий стол IP адрес компьютера и спрашивать его у пользователя. Об этом я рассказывал в уроке по программе BGinfo для обычной сети и в домене.
Мониторим пользователей AD на коленке и бесплатно
По мере роста компании и возникновения большого кол-ва рабочих мест возникла идея сделать ресурс, на котором можно быстро найти информацию по пользователю, ПК и сделать какие-нибудь отчеты.
ПО такое есть, оно сложное и обычно стоит денег. Будем клепать свое и на коленке.
Поставленные цели:
1. Куда пользователи ходят
2. Где они забывают выходить
3. Кто логиниться под своим/не своим логином на одном/нескольких ПК
4. Рассадка по местам
5. Отображение на схеме этажа
6. Отчет о рабочем времени (в т.ч. сколько пользователь был «активен» в системе)
7. Делегирование прав для инженеров с целью упрощения диагностики.
Немного о сети:
В сети существуют пользовательские VLAN с авторизацией в AD, связка Computer + User. При провале авторизации пользователи попадают в гостевые VLANs, где у них отсутствуют какие-либо доступы, кроме как выйти из системы.
VLAN максимально /23
Немного о DNS:
DNS AD integrated. DNS scavenging отключен. Соответственно, ввиду пункта выше, возникает очень много проблем с поиском ПК по DNS, дублирование A, PTR записей.
Немного об GPO:
Включена блокировка станции по не активности = 5 минут.
Используется раздел logon/logoff scripts.
Немного об AD:
Доступы на основе групп безопасности. Шаг в сторону считается побегом.
2 домена + Domain Trust
Список используемого ПО:
Windows Server 2012R2 (IIS)
Visual Studio 2012 (Разработка ПО для руководителей и пользователей)
Mysql 5.6 (База данных, в которой я храню данные)
Mysql Work Bench (Построение БД на коленке)
Perl for Windows (Портал + веб-сервис)
И языков программирования:
Perl
C#
Powershell
Для начала нам нужна БД:
Далее необходимо писать данные о входах пользователей.
Сделаем 2 скрипта (в каждом домене)
set t=%1
ipconfig | find «IPv4» > %temp%\tempip.txt
for /f «tokens=1* delims=.: » %%a in (%temp%\tempip.txt) do (echo %USERNAME%;%COMPUTERNAME%;%%b;%t%;%DATE%;%TIME% >> \\nas\log$\users\%USERNAME%.domain1.ru.txt)
del %temp%\tempip.txt
usage \\domain\netlogon\logon.cmd logon/logoff
set t=%1
ipconfig | find «IPv4» > %temp%\tempip.txt
for /f «tokens=1* delims=.: » %%a in (%temp%\tempip.txt) do (echo %COMPUTERNAME%;%%b;%t%;%DATE%;%TIME% >> \\nas\log$\computers\%COMPUTERNAME%.domain1.ru.txt)
del %temp%\tempip.txt
Остается распарсить данные и куда-нибудь сохранить.
(2 модуля: пк и пользователи. Код без комментариев.)
Теперь у нас данные сохраняются в базу данных. Далее мы можем делать с ними все что угодно: