Как посмотреть активных пользователей windows

Поиск активных сессий и залогиненных пользователей с Powershell

Иногда может понадобится проверить какие в данный момент залогинены в системе, то есть являются активными. Такую информацию можно использовать для аудита, например для проверки какие учетные записи за какими компьютерами сидят или для последующей перезагрузки сервера, что бы не останавливать работу коллег. В примерах ниже рассмотрено как выполнять удаленные команды для получения активных пользователей и возврата включенных пользователей Active Directory.

Навигация по посту

Получение имени залогиненного пользователя

Я не могу вспомнить готовую команду Powershell, которая бы вернула логин пользователя, но такая возможность есть через WMI:

Есть еще вариант использовать CIM, который может работать немного быстрее:

Обе команды могут работать удаленно если добавить атрибут ComputerName:

Если вы планируете выполнять эти команды удаленно, то может понадобится выполнить предварительные настройки в виде открытия портов и необходимых правах.

Получить только имя пользователя можно так:

Как вы знаете в Winodws есть так же параллельные сеансы сервисов. Если вам нужно вернуть имена этих аккаунтов нужно использовать класс «win32_LoggedOnUser»:

Получение списка компьютеров

Если у вас нет списка компьютеров к которым вы планируете подключиться и узнать активного пользователя — это можно сделать через AD. На примере ниже будут возвращены все компьютеры:

Операция по получению списка компьютеров может быть очень долгой, если у вас большой парк ПК в AD. Вы можете вернуть только компьютеры, которые не отключены в AD (Disable) следующим способом:

Можно использовать и фильтрацию. Так я верну компьютеры имена которые начинаются на «CL»:

Получить список имен мы можем так:

Если у вас список компьютеров не относится к AD или имеет другой формат — то просто преобразуйте его в массив:

Удаленное получение залогиненных пользователей

Выше уже рассматривался вариант получения имени пользователя удаленно используя WMI и CIM. Если обе команды, то всех пользователей активных в данный момент мы можем получить так:

Такой подход может привести к ошибкам так как мы не проверяем включены ли компьютеры:

Мы можем просто не выводить ошибки с помощью «-ErrorAction SilentlyContinue» или заранее пинговать (что было бы правильнее с точки зрения времени выполнения). В примере ниже я так же разбиваю имя компьютера и логин в более удобный формат:

Если вы не хотите выполнять команды удаленно через WMI, то вы можете использовать PSRemoting. От так же требует предварительных настроек, которые описаны в статье «Удаленное управление через Powershell». Команда, которая использует PSRemoting, будет выглядеть примерно так же:

Получение включенных пользователей AD

Если вам нужно вернуть учетные записи, которые включены в AD выполните следующую команду:

Для возврата только отключенных учетных записей используйте $False.

Такой подход работает и с объектами компьютеров в AD:

Для последующей выгрузки данных в Excel почитайте статью «Как в Powershell выгрузить из AD пользователей и группы CSV».

Whoami или WMI

Вы можете вспомнить команду, которая так же возвращает имя пользователя:

Читайте также:  Как написать свой дистрибутив линукс

Как можно увидеть она вернет ту же информацию, что и класс WMI. Ситуация меняется, когда эти команды используются удаленно:

Как видно, в случае с whoami у нас вернулось имя учетной записи выполнившей команду Powershell, а с WMI пользователь Windows.

Получаем в Powershell активных сессий пользователей AD и их компьютеров

Когда появляется необходимость сделать работу на компьютере пользователя, по его заявке, иногда бывает сложно узнать имя компьютера для подключения к нему. В этой статье будет рассмотрена возможность сбора всех активных сеансов пользователей (тех кто прошел аутентификацию на определенном компьютере) на всех компьютерах AD. Конечно, есть сторонние программы, которые решают такие проблемы и встроенные средства, но тут будет рассмотрена реализация через Powershell. Такой список так же хорошо подойдет для аудита, если понадобится быстро узнать кто пользовался компьютером и когда.

Навигация по посту

Как получить список залогиненных пользователей

В Powershell есть несколько методов возврата списка активных пользователей. Каждый из способов имеет свои минусы и поэтому, в зависимости от цели, какой-то способ будет удобнее использовать локально (при входе пользователя), а какой-то удаленно. В случае с WMI это так и не получилось сделать, так нет класса, который бы хранил все нужные значение и работал бы везде.

Локально при входе пользователя

Самый простой способ — это поместить скрипт в планировщик задач, который будет выполняться при входе пользователя в систему. Этот способ не подразумевает удаленной работы. Почти полный скрипт выглядит так:

Можно создать политику, которая будет запускать скрипт при входе и экспортировать в CSV. Сам файл CSV может находится на удаленном компьютере. Следующая команда сделает это записав данные в конец существующий файл (т.е. не перезапишет файл):

Получится примерно следующий вид файла:

Как создавать команды и функции в Powershell вызывать их и передавать параметры

Системная утилита quser.exe

Мы можем использовать системную программу quser, которая возвращает имя текущего пользователя и время его входа. Выглядит это так:

Quser так же может работать удаленно используя следующий синтаксис:

Первая проблема этого способа — это то, что quser работает через RPC. Если вы выполняете команду удаленно, а порты не открыты, вы получите ошибки:

  • Error 0x000006BA enumerating sessionnames
  • Error [1722]:The RPC server is unavailable.

Для примера, следующие команды исправят эти проблемы на одном компьютере, но скорее всего вы будете менять настройки через политики. Так же обратите внимание, что правило устанавливается на «Any», а не только «Domain»:

Вторая проблема — если вы будете выполнять команду через Invoke-Command, то могут быть проблемы с кодировками:

И третья проблема — у нас возвращается строка, а не объект. Что бы мы могли все эти данные, в дальнейшем, экспортировать (например в CSV), мы должны ее парсить. Это можно сделать так:

Далее нам нужно преобразовать все в специальный массив — PSCustomObject, т.к. только он может быть экспортирован в CSV и представляет собой более удобный вывод:

Метод substring убирает первый символ, так как программа возвращает имя пользователя либо с пробелом начали или символом «>».

Такой скрипт мы можем объединить в один командлет, который сможет работать локально и удаленно:

В функцию добавлено несколько деталей:

  1. Функция имеет атрибут «ComputerName» в которую можно передать имя компьютера. Т.к. эта переменная является строкой мы не можем использовать одновременно несколько (конвейер передает по одному);
  2. По умолчанию «ComputerName» выполняет $env:computername, что возвращает имя текущего компьютера;
  3. Часть команды «quser /server:$ComputerName 2>Null » будет исключать некоторые ошибки, которые связаны с выключенными компьютерами. Иначе — будут выводиться красные сообщения мешающие выводу;
  4. Добавлено несколько условий, которые различают логические ошибки (например фаервол), физические (компьютер выключен) и условие в случае если все хорошо;
Читайте также:  Что такое виртуальная консоль linux

Мы можем вызывать скрипт несколькими приемами:

Отмечу, что в случаях выключенных компьютеров запросы идут очень долго (около 2-3 секунд на компьютер). Способа снизить конкретно таймаут — я не знаю. Один из вариантов ускорить работу — фильтровать вывод с Get-ADComputer исключая отключенные учетные записи компьютеров. Так же можно попробовать использовать параллелизм.

Легче всего такой скрипт запускать на компьютерах пользователей, по событию входа в систему. На примере ниже я экспортирую эти данные в единый, для всех пользователей, файл CSV расположенный в доступности для пользователей:

Сам файл будет выглядеть так:

Отмечу следующие моменты:

  1. Можно увидеть разницу во времени и датах. У меня одна ОС с американской локализацией, а другая с русской. В принципе у вас таких проблем быть не должно, но можно исправить через Get-Date (парсингом даты);
  2. Из-за предыдущего пункта у меня бывали проблемы с кодировками, но они самоустранились быстрее, чем я смог предпринять действия.

Через файл ntuser.dat

Каждый раз, как пользователь входит в систему все его настройки загружаются из файла ntuser.dat, который находится в домашнем каталоге ‘C:\Users\UserName\’. При выходе из системы все настройки записываются в этот же файл. То есть мы можем получить имя пользователя по дате изменения этого файла.

В этом примере вернутся все каталоги пользователей:

Получим даты изменения файлов ‘ntuser.dat’:

Извлечем из пути имя пользователя и уберем лишние колонки:

Как вы знаете к большинству компьютеров можно подключится используя следующие пути:

Это же мы можем использовать с командой Get-ChildItem. Соединим все это в функцию:

Далее мы можем использовать команду в таких вариациях:

Ключ ‘-ErrorAction SilentlyContinue’ нужен для игнорирования ошибок связанных с выключенными компьютерами. Если его не написать вы получите ошибки формата:

  • Get-ChildItem : Cannot find path ‘\\CL2\C$\Users\’ because it does not exist.

Отмечу несколько моментов:

  1. В отличие от первого скрипта Get-ChildItem может принимать массивы. Изменив строки на массивы вы можете немного ускорить работу скрипта. То есть вы можете написать
    «Get-Childitem -Path ‘\\Computer1\C$\Users’, ‘\\Computer2\C$\Users’ «;
  2. LogoffDate — это отдельный тип данных даты и времени, а это значит, например, что мы можем увидеть кто вышел за последний час/сутки. Пример будет ниже.
  3. Если вы выполняете команды типа ‘Invoke-Command’ (удаленные команды) — они тоже могут изменить файл ntuser.dat. То есть вы возможно захотите исключить часть пользователей из финального списка. Пример ниже.

Представим, что мы захотим сформировать список из тех пользователей, которые выполнили выход за последний час. Это можно сделать так:

Исключить пользователей мы можем так же:

Экспорт для Excel аналогичен предыдущему примеру:

Get-Date — примеры работы с датой в Powershell

Через WMI

У WMI есть множество классов, которые хранят значения времени входа пользователей и их времена. Например класс ‘Win32_NetworkLoginProfile’ тоже хранит их, но при удаленном использовании — вернет время входа только локальных пользователей, а не доменных. Класс ‘Win32_UserProfile’ — тоже хранит ‘LastUseTime’, но это время не обозначает именно процесс успешного входа после ввода логина и пароля. Класс ‘win32_computersystem’ отображает только имя пользователя.

Я пробовал и другие классы, но каждый со своими проблемами. Решения так и не нашел.

Читайте также:  Как посмотреть пароль сетевого подключения windows

Мониторинг активности и статуса подключенных удаленных клиентов. Monitor connected remote clients for activity and status

Область применения. Windows Server (Semi-Annual Channel), Windows Server 2016 Applies To: Windows Server (Semi-Annual Channel), Windows Server 2016

Примечание. Windows Server 2012 объединяет службу DirectAccess и службы удаленного доступа (RAS) в одну роль удаленного доступа. Note: Windows Server 2012 combines DirectAccess and Remote Access Service (RAS) into a single Remote Access role.

Консоль управления на сервере удаленного доступа можно использовать для наблюдения за активностью и состоянием удаленных клиентов. You can use the management console on the Remote Access server to monitor remote client activity and status.

Для выполнения задач, описанных в этом разделе, необходимо войти в систему как член группы «Администраторы домена» или член группы «Администраторы» на каждом компьютере. You must be signed in as a member of the Domain Admins group or a member of the Administrators group on each computer to complete the tasks described in this topic. Если вы не можете выполнить задачу, войдя в учетную запись, которая является членом группы «Администраторы», попробуйте выполнить задачу, войдя в учетную запись, которая является членом группы «Администраторы домена». If you cannot complete a task while you are signed in with an account that is a member of the Administrators group, try performing the task while you are signed in with an account that is a member of the Domain Admins group.

Мониторинг активности и состояния удаленных клиентов To monitor remote client activity and status

В диспетчере серверов щелкните Средства и выберите пункт Управление удаленным доступом. In Server Manager, click Tools, and then click Remote Access Management.

Щелкните отчеты , чтобы перейти к отчетам удаленного доступа в консоли управления удаленным доступом. Click REPORTING to navigate to Remote Access Reporting in the Remote Access Management Console.

Щелкните состояние удаленного клиента , чтобы перейти к пользовательскому интерфейсу активности и состояния удаленных клиентов в консоли управления удаленным доступом. Click Remote Client Status to navigate to the remote client activity and status user interface in the Remote Access Management Console.

Вы увидите список пользователей, подключенных к серверу удаленного доступа, и подробную статистику по ним. You will see the list of users who are connected to the Remote Access server and detailed statistics about them. Щелкните первую строку в списке, соответствующую клиенту. Click the first row in the list that corresponds to a client. При выборе строки на панели предварительного просмотра отображается активность удаленных пользователей. When you select a row, the remote user activity is shown in the preview pane.

Эквивалентные команды в Windows PowerShell Windows PowerShell Windows PowerShell equivalent commands

Следующие командлеты Windows PowerShell выполняют ту же функцию, что и предыдущая процедура. The following Windows PowerShell cmdlet or cmdlets perform the same function as the preceding procedure. Вводите каждый командлет в одной строке, несмотря на то, что здесь они могут отображаться разбитыми на несколько строк из-за ограничений форматирования. Enter each cmdlet on a single line, even though they may appear word-wrapped across several lines here because of formatting constraints.

Статистику пользователя можно фильтровать на основе выбора критериев, используя поля в следующей таблице. The user statistics can be filtered, based on criteria selections, by using the fields in the following table.

Оцените статью