Windows server 2008 просмотр активных пользователей

В процессе лицензирования ПО в организации порой возникает необходимость посчитать актуальное количество активных RDP-пользователей. Подключения по RDP Windows Server фиксирует в журнал службы термина

В процессе лицензирования ПО в организации порой возникает необходимость посчитать актуальное количество активных RDP-пользователей. Подключения по RDP Windows Server фиксирует в журнал службы терминалов. Остается только из этого журнала получить список пользователей. Не исключаю, что есть более красивый вариант решения, но ваш покорный слуга его с разбегу не нашел, поэтому сделал так.

Находим нужный нам журнал и сохраняем все события:

Панель управления —> Администрирование —> Просмотр событий.

Журналы приложений и служб. —> Microsoft —> Windows —> TerminalServices-LocalSessionManager.

Журнал Operational —> Сохранить все события как … Выбираем имя файла и тип Text.

Нужно оставить только строчки которые начинаются со слова «Пользователь:». Можно было запилить нехитрый скриптик для этого, но ваш покорный слуга поленился и взял уже готовый word-овский макрос. Текст макроса:


Sub ВначалеНеСЛОВО_вон()
Const СЛОВО = «Пользователь»
Dim abz As Paragraph ‘переменная для работы с абзацем
Dim k As Long   ‘счётчик удалённых строк (абзацев, где вначале стоит не СЛОВО)

 ‘Для надёжности сначала заменим разрывы строк (код 11) на символы абзаца (код 13)
ActiveDocument.Range.Text = Replace(ActiveDocument.Range.Text, Chr(11), Chr(13))
‘Теперь каждая строка (в т. ч. пустая)- это отдельный абзац.

     For Each abz In ActiveDocument.Paragraphs ‘перебор всех абзацев
        While abz.Range.Characters(1) = » «: abz.Range.Characters(1).Delete: Wend

                If Trim(abz.Range.Words(1)) <> СЛОВО Then abz.Range.Delete: k = k + 1
        ‘Удалили абзац, где 1-е слово (без учёта пробелов) не СЛОВО
    Next
End Sub


На выходе получаем список пользователей с повторяющимися значениями. Опять же не стал изобретать велосипед, просто скопировал список в excel и выполнил удаление дубликатов. (Данные -> Удалить дубликаты.) После этого мы получили список активных пользователей.

Максимальный размер журнала по умолчанию равен 1МБ. На сервере в 15-20 пользователей у меня сохранились события примерно за последние 20 дней. Если нужна статистика за большее количество  времени или пользователей значительно больше, журнал можно расширить по своему усмотрению.

  • Remove From My Forums

 locked

Список клиентов терминального сервера

  • Вопрос

  • Терминальный сервер Windows Server 2008. Подскажите, пжлст, как выгрузить список активных клиентов терминального сервера в файл с указанием имени пользователя и имени клиента, с которого подключается пользователь, и, желательно, ip и mac клиента.

    query session — дает только список с именами пользователя.

    Спасибо.

    • Перемещено

      21 апреля 2012 г. 15:43
      merge forums (От:Windows Server 2008)

Ответы

    • Помечено в качестве ответа
      Denis A
      28 апреля 2011 г. 5:49

С чего начинается администрирование пользователей на сервере терминалов?

Конечно с просмотра «Активных» или «Отключенных» сессий пользователей.

Без этой картины администрирование сервера терминалов невозможно.

Помимо статьи, записал также, и подробное видео, о том как администрировать пользователей на сервере терминалов (Новичкам смотреть обязательно!)

Конечно, данная тема также подымается и на курсе: Администратор 1С!

И так, конечно мы должны во всех подробностях видеть, что у нас происходит на сервере терминалов!

Какие процессы запущены от имени тех или иных пользователей (в т.ч. процессы 1С) их идентификаторы, id сессий пользователей, это и многое другое помогает администратору всегда быть в курсе того что происходит на сервере и соответственно всем этим управлять, и вовремя реагировать на различные ситуации.

На разных версиях Windows server  администраторы по-разному решают этот вопрос.

Кто-то смотрит пользователей используя простой «Диспетчер задач» на Windows server 2012 – 2016. Некоторые используют различные команды в CMD, ну а кое-кто использует PowerShell .

Но все администраторы хотят одного:

1.  Чтоб быстро посмотреть всех пользователей кто работает на сервере.

2.  Чтоб это было как можно информативней.

3.  Чтоб бесплатно.

Поэтому поводу решил собрать все лучшие, простые и быстрые способы которые (на мое мнение) стоит использовать.

Уверен, что многим начинающим администраторам эти способы помогут в администрировании сервера терминалов.

И так способ первый и самый простой (На Windows server 2012 R2)

1.     Диспетчер задач.

«Диспетчер задач» — вкладка «Пользователи» — позволяет нам видеть пользователей, которые работают на этом сервере.

 Dispetcher_Zadach_Windows_server_2012_r2

Но по умолчанию стандартный «Диспетчер задач» — вкладка «Пользователи» нам не покажет, что пользователь работает на сервере удаленно, используя RDP, хорошо, что это можно легко исправить.

Правый клик мышкой на панели «Пользователь» и в появившимся контекстном меню

ставим птичку напротив «Сеанс» а также стоит поставить и напротив «Имя клиента».

Dispetcher_Zadach_Windows_server_2012_r222

Так мы будем знать, что этот пользователь работает у нас на сервере через RDP.

Минусы данного способа здесь очевидны, чтоб смотреть пользователей мы должны находится на сервере терминалов, где собственно и запускаем «Диспетчер задач», нет возможности сделать какую-то выборку, фильтр и т.д. 

2.     quser

Следующий метод это использование команды quser в CMD или PowerShell.

Quser – это аналог QUERY USER (Такое сокращение позволяет выполнять команду быстрее)

Здесь все просто запускаем CMD или PowerShell и пишем команду quser

PowerShell_quser

Так мы увидим всех пользователей, что работают на этом сервере.

Метод очень простой быстрый и достаточно информативный.

Он покажет Вам — Пользователя, Сеанс, его ID, Статус , Бездействие сеанса, и время входа.

Если мы хотим посмотреть только какого-то конкретного пользователя, тогда можно написать например так:

Пример: 

Term01 – это логин пользователя.

PowerShell_quser2

Большинство системных администраторов отдают предпочтение именно этому способу.

И не только потому, что быстро, просто и т.д., но и потому что можно смотреть удаленно всех пользователей, сидя за своим ПК, где не будь в локальной сети.

И для этого достаточно ввести команду с параметром SERVER

Пример: 

Если Вы хотите больше узнать о технической стороне 1С, тогда регистрируйтесь на первый бесплатный модуль курса: Администратор 1С
 

Содержание

  • Как я могу проверить открытые сеансы на сервере?
  • Как просмотреть сеанс пользователя в Windows Server 2008?
  • Как просмотреть сеансы в Windows?
  • Как просмотреть сеансы удаленного рабочего стола?
  • Как мне узнать имя моего файлового сервера?
  • Как мне получить доступ к своему SMB-соединению?
  • Как мне узнать свой идентификатор сеанса?
  • Как я могу узнать, есть ли удаленный доступ к моему серверу?
  • Как мне найти пользовательские сеансы?
  • Что такое команда Quser?
  • Что такое команда Qwinsta?
  • Как подключить несколько пользователей к удаленному рабочему столу?
  • Как узнать, включен ли удаленный рабочий стол в Windows 10?

Например, в Windows Server 2008 и 2008 R2 вы можете открыть консоль «Управление компьютером», перейти к «Файловые службы | Управление общим доступом и хранилищем» и щелкнуть элемент «Управление сеансами» или элемент «Управление открытыми файлами» на панели действий.

Как я могу проверить открытые сеансы на сервере?

Откройте консоль управления компьютером на файловом сервере (или подключитесь к серверу удаленно с консоли управления, запущенной на вашем компьютере) и перейдите в Системные инструменты -> Общие папки —> Открыть файлы. Список открытых файлов на текущем SMB-сервере отображается в правой части окна.

Шаг 1. Откройте интерфейс командной строки, запустив «cmd» в диалоговом окне запуска (Win + R). Шаг 2- Введите запрос пользователя и нажмите Enter.. В нем будут перечислены все пользователи, которые в настоящее время вошли на ваш компьютер.

Как просмотреть сеансы в Windows?

Щелкните правой кнопкой мыши на компьютере, выберите Sessions-> Console Sessions. Разверните компьютер в левом окне, выберите Sessions-> Console Sessions. Чтобы отобразить сеансы консоли для нескольких компьютеров, выберите компьютеры в правом окне.

Как просмотреть сеансы удаленного рабочего стола?

Третий вариант: установить подключение к удаленному рабочему столу Microsoft Менеджер, настройте сервер (ы), затем щелкните правой кнопкой мыши сервер, чтобы «просмотреть сеансы». Это показывает идентификатор сеанса, состояние сеанса, домен / имя пользователя, имя клиентского компьютера.

Как мне узнать имя моего файлового сервера?

Откройте интерфейс DOS вашего компьютера, набрав буквы «cmd«в поле» Открыть «меню» Выполнить «. После нажатия клавиши ВВОД должно открыться новое окно, включающее командную строку DOS. В этом окне введите» Имя хоста «и нажмите клавишу ввода. Должно появиться имя сервера вашего компьютера.

Как мне получить доступ к своему SMB-соединению?

Есть два основных способа узнать, к каким файлам на общих ресурсах SMB осуществляется доступ:

  1. [CLI] Команда openfiles.
  2. [GUI] Объект «Открыть файлы» в разделе «Управление компьютером» (compmgmt. Msc) => Общие папки => Открыть файлы.

Как мне узнать свой идентификатор сеанса?

Как получить значение

  1. Нажмите F12 — это должно открыть консоль разработчика.
  2. В окне консоли щелкните меню «Кэш» и выберите «Просмотр информации о файлах cookie».
  3. Это откроет новую страницу со списком файлов cookie.
  4. Найдите предмет с названием PHPSESSID.
  5. Скопируйте значение рядом с VALUE — это ваш идентификатор сеанса.

Как я могу узнать, есть ли удаленный доступ к моему серверу?

Для мониторинга активности и статуса удаленного клиента

  1. В диспетчере сервера щелкните Инструменты, а затем щелкните Управление удаленным доступом.
  2. Щелкните ОТЧЕТНОСТЬ, чтобы перейти к Отчетам об удаленном доступе в консоли управления удаленным доступом.

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

Откройте диспетчер задач и посмотрите вкладку пользователей. Там вы найдете список пользователей и их статус. Также вы можете использовать Приложение «UserLock» чтобы увидеть, какие пользователи вошли в систему. С помощью этого стороннего инструмента вы можете управлять сеансом пользователей, а также сеансами удаленного рабочего стола.

Что такое команда Quser?

Quser (запросить пользователя) — это встроенный инструмент командной строки Windows, который особенно полезен при необходимости идентифицировать активные пользовательские сеансы на компьютере. Эта функция существует в обычных версиях Windows, а также в Windows Server.

Что такое команда Qwinsta?

Отображает информацию о сеансах на сервере узла сеансов удаленных рабочих столов. Список включает информацию не только об активных сеансах, но и о других сеансах, запущенных сервером. Эта команда аналогична команде сеанса запроса.

Как подключить несколько пользователей к удаленному рабочему столу?

Включить несколько сеансов RDP

  1. Войдите на сервер, на котором установлены службы удаленных рабочих столов.
  2. Откройте начальный экран (нажмите клавишу Windows) и введите gpedit. …
  3. Перейдите в Конфигурация компьютера> Административные шаблоны> Компоненты Windows> Службы удаленного рабочего стола> Узел сеанса удаленного рабочего стола> Подключения.

Как узнать, включен ли удаленный рабочий стол в Windows 10?

Windows 10: разрешить доступ для использования удаленного рабочего стола

  1. Щелкните меню «Пуск» на рабочем столе, а затем щелкните «Панель управления».
  2. Когда откроется панель управления, нажмите «Система и безопасность».
  3. Щелкните Разрешить удаленный доступ на вкладке Система.
  4. Нажмите «Выбрать пользователей» в разделе «Удаленный рабочий стол» на вкладке «Удаленный».

Интересные материалы:

Как вы играете аккорды?
Как вы играете доктора в DBD?
Как вы играете на разных картах в SnowRunner?
Как вы играете на WSOP?
Как вы играете с 1,5-летним ребенком?
Как вы играете с 3-мя гитарами?
Как вы играете с чувствами мальчика?
Как вы играете с другими музыкантами?
Как вы играете с друзьями на товарищах ff14?
Как вы играете с друзьями в Forza Horizon?

Допустим, вы администрируете сервер терминалов. (Кстати, согласно новой терминологии Майкрософт, сервер терминалов теперь называется сервером удалённых рабочих столов). Во время обслуживания сервера RDP администратору приходится его перезагружать. Но как узнать, кто из подключённых пользователей работает, а чей сеанс простаивает?

Для просмотра информации о сеансах и, в частности, о времени простоя терминальной сессии пользователя мы воспользуемся оснасткой tsadmin.msc

Нажимаем WIN+R для запуска окна Выполнить и вводим в поле tsadmin.msc :

tsadmin-001

Открывается окно Диспетчер служб удалённых рабочих столов . В отличие от диспетчера задач, где можно узнать лишь о том, подключён сеанс или отключён, Диспетчер служб удалённых рабочих столов отображает более исчерпывающую информацию.

В окне мы видим список сеансов удалённого рабочего стола. Поле Состояние показывает, чей сеанс активен, а чей отключён :

tsadmin-002

Поле LogOnTime показывает время, когда соответствующий пользователь подключился к серверу:

tsadmin-002-2

Время простоя

По информации из поля Idle Time вы можете узнать, кто работает, а чей сеанс бездействует. Так, значение 18 напротив пользователя User1 означает, что сеанс пользователя простаивает в течение 18 минут :

tsadmin-002-1

Также, можно просмотреть процессы пользователей удалённого рабочего стола:

tsadmin-003

Иногда бывает необходимо узнать, кто именно сейчас работает в базе данных или в базах данных на сервере MSSql 2008. Например, для того чтобы принудительно завершить все эти сеансы или просто узнать, кто именно нагружает сервер запросами. Сегодня мы научимся с Вами это делать, используя при этом простые запросы к системным представлениям на Transact-SQL.

Как Вы уже поняли, сегодня речь пойдет об активных сеансах и процессах в СУБД MSSql 2008, которые мы будем получать, используя системное представление sys.sysprocesses. Мы уже с Вами затрагивали некоторые системные вьюхи в статье Журналирование изменений данных в таблице на Transact-SQL, а именно sys.columns, которую мы использовали, для того чтобы узнать какие и сколько полей содержит та или иная таблица в базе.

Для того чтобы понимать, что такое системное представление, советую Вам для начала ознакомиться с понятием простого представления, которое рассматривается в статье — Зачем нужны представления (views) в базах данных. Также мы будем писать пусть простые, но все запросы, с основами которых Вы естественно должны быть знакомы, если нет, то можете прочитать статью основы языка SQL — оператор select.

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

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

Системное представление sys.sysprocesses содержит текущее состояние сервера на предмет запущенных процессов, исходя из этого, напишем простенький запрос:

select db_name(dbid) as db, spid as idproc, loginame, program_name, status
from   sys.sysprocesses

где,

  • db – это база данных, в которой запущен процесс;
  • idproc – идентификатор процесса;
  • loginame – логин, т.е. кто именно запустил;
  • program_name – приложение, из которого запущен процесс;
  • status – соответственно статус.

Статусы бывают разные, например,

  • Runnable – активный процесс, т.е. например, в данный момент выполняется какой-нибудь запрос;
  • Sleeping – режим ожидания, т.е. например, окно запроса открыто, но в данный момент он не запущен;
  • Background – запущен в фоновом режиме.

Если необходимо узнать, кто именно работает конкретно в той или иной базе можно добавить условие:

select db_name(dbid) as db, spid as idproc, loginame, program_name, status
from  sys.sysprocesses
where db_name(dbid) = 'name_db'

Соответственно вместо name_db пишите свою нужную базу данных, и результат будет получен только по этой базе данных.

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

Это необходимо, например, для того чтобы получить монопольный доступ к базе данных, а для чего он Вам может понадобится это уже Ваше дело, например, чтобы восстановить базу данных. Мы кстати рассматривали процесс восстановления базы данных, правда, на MSSql 2000.

Курс по SQL для начинающих

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

set nocount on
declare @dbname varchar(100)
declare @query varchar(max)
set @query = ''
set @dbname = 'name_db'
select @query=coalesce(@query,',' )+'kill '+convert(varchar, spid)+ '; '
from sys.sysprocesses where dbid=db_id(@dbname)
if len(@query) > 0
begin
  exec(@query)
end

где,

  • @dbname – переменная, для того чтобы указать к какой базе необходимо завершить все подключения;
  • @query – переменная для хранения запроса;

В конструкции select мы динамически формируем запрос с идентификаторами процессов, которые необходимо завершить. Далее в переменной @query будет храниться запросы вида

kill 58; kill 61; kill 70;

которые мы выполним через exec(@query) и тем самым завершим все процессы.

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

Также хотелось бы сказать, что в MSSql 2008 существует встроенный «Монитор активности». Его можно вызвать, нажав правой кнопкой по серверу, в окне «обозреватель объектов» и вызвать окно «Монитор активности», на котором будет располагаться список свойств, которые Вы можете развернуть для подробного просмотра, где в свою очередь и будет отображать вся текущая активность на сервере.

На сегодня это все, в дальнейших статьях мы продолжим изучение Transact-SQL и всего сервера MSSql 2008.

Заметка! Для комплексного изучения языка SQL и T-SQL рекомендую посмотреть мои видеокурсы по T-SQL, которые помогут Вам «с нуля» научиться работать с SQL и программировать на T-SQL в Microsoft SQL Server.

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

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

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

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

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

[PSCustomObject]@{
    UserName=$env:username;
    ComputerName=$env:computername;
    Date=(Get-Date -Format 'dd/MM/yyyy hh:mm:ss');
}

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

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

$date = [PSCustomObject]@{
           UserName=$env:username;
           ComputerName=$env:computername;
           Date=(Get-Date -Format 'dd/MM/yyyy hh:mm:ss');
}
$data | Export-Csv -Path '\Ad1c$users_logged.csv' -NoOverwrite -NoTypeInformation -Append

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

Получение имени залогинившегося пользователя и его времени в Powershell в CSV

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

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

quser

Выполнение программы quser

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

quser /server:localhost
quser /server:127.0.0.1

Выполнение программы quser удаленно

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

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

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

# Должно хватить первых двух команд
New-NetFirewallRule -Profile Any -DisplayName "Open Port 135 RPC" -Direction Inbound -Protocol TCP -LocalPort 135
New-NetFirewallRule -Profile Any -DisplayName "Open Port 445 RPC" -Direction Inbound -Protocol TCP -LocalPort 445
New-NetFirewallRule -Profile Any -DisplayName "Open Port 135 RPC" -Direction Inbound -Protocol UDP -LocalPort 135
New-NetFirewallRule -Profile Any -DisplayName "Open Port 445 RPC" -Direction Inbound -Protocol UDP -LocalPort 445

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

Проблема с кодировками quser в Powershell

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

# Имя компьютера, к которому подключаться
$computer_name = "localhost"
# Выполняем удаленный запрос
$query = quser /server:$computer_name
# Убираем первую строку из вывода, заменяем два пробела запятыми
$query = ($query -split 'n')[1] -replace 's{2,}',','
# Преобразуем в массив
$result = $query -split ','

Форматирование quser в Powershell

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

$user_logged = [PSCustomObject]@{
  ComputerName = $computer_name;
  UserName = $result[0].substring(1);
  DateLogged = $result[-1];
}

Форматирование quser в Powershell

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

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

function Get-UserLogged {
            # Эта часть принимает имена компьютеров через конвейер (значение по умолчанию localhost)
            [cmdletbinding()]
            Param (
                [parameter(ValueFromPipeline=$True)]
                [string]
                # Имя компьютера, к которому подключаться
                $ComputerName = $env:computername
            )
            process {
                # Выполняем удаленный запрос и 
                # игнорируем выключенные компьютеры
                $query = quser /server:$ComputerName 2>Null
                # Проверка ошибок с доступностью портов, протоколов
                if ($query -like "*Error*"){
                        $UserName = ""
                        # Ошибка будет отображаться в этом поле, в одну строку
                        $DateLogged = $query -replace 'n',' '
                }
                elseif ($query -ne $Null ){
                        # Убираем первую строку из вывода,
                        # заменяем два пробела запятыми
                        $query = ($query -split 'n')[1] -replace 's{2,}',','
                        # Преобразуем в массив
                        $result = $query -split ','
                        # разделяем массив на объекты
                        $UserName = $result[0].substring(1);
                        $DateLogged = $result[-1];
                }
                else {
                    $UserName = ""
                    # Если ответ $querry равен Null, 
                    # то будет выводиться следующее сообщение
                    $DateLogged = "Компьютер выключен или пользователь не вошел в систему"   
                }
                # На некоторых компьютерах появляется надпись "Отсутствует"
                # способ ниже уберет ее, если появится
                $DateLogged = $DateLogged -replace 'отсутствует ',''
                # Добавляем все объекты в массив типа PSCustomObject
                $user_logged = [PSCustomObject]@{
                  ComputerName = $ComputerName;
                  UserName = $UserName;
                  DateLogged = $DateLogged;
                  }
                return $user_logged
                }
}

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

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

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

# Получение данных со всего AD
(Get-ADComputer -Filter *).Name | Get-UserLogged
# Получение данных с локального компьютера
Get-UserLogged
# Получение данных с одного удаленного компьютера
Get-UserLogged -ComputerName 'CL5'
# Так делать нельзя
Get-UserLogged -ComputerName 'CL5','AD1'

Получение и форматирование списка вошедших пользователей с quser в Powershell

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

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

Get-UserLogged | Export-Csv -Path '\Ad1c$users_logged.csv' -NoOverwrite -NoTypeInformation -Append

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

Результат работы quser с Powershell

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

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

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

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

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

$home_dirs = (Get-ChildItem -Path 'C:Users').FullName
$home_dirs

Получение списка вошедших пользователей с Powershell

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

$home_dirs = (Get-ChildItem -Path 'C:Users').FullName
$home_dirs | Get-ChildItem -Filter 'ntuser.dat' -Force

Получение списка вошедших пользователей с ntuser.dat в Powershell

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

$home_dirs = (Get-ChildItem -Path 'C:Users').FullName

# Поместим корректные данные в этот массив
$new_object = @()
foreach ($dir in $home_dirs){

    # Получим директории, где есть файл
    $result = Get-ChildItem -Path $dir -Filter 'ntuser.dat' -Force
    if ($result){

        # Создаем из полного пути массив и берем последний элемент (имя пользователя)
        $user_name = ($dir -split '\')[-1]

        # Получаем время изменения файла
        $logoff_date = $result.LastWriteTime

        # Помещаем все данные в этот объект
        $new_object += [PSCustomObject]@{
            UserName = $user_name;
            Computer = $env:computername;
            LogoffDate = $logoff_date;
        }
    }
}
$new_object

Форматирование списка залогиненных пользователей в Powershell с ntuser.dat

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

# Вернет корень диска C
\ComputerNameC$

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

function Get-UserLogged{
            # Эта часть принимает имена компьютеров через конвейер (значение по умолчанию localhost)
            [cmdletbinding()]
            Param (
                [parameter(ValueFromPipeline=$True)]
                [string]
                # Имя компьютера, к которому подключаться
                $ComputerName = $env:computername
            )
            process {
                # Форматируем строку
                $path = '\{0}C$Users' -f $ComputerName
                $home_dirs = (Get-ChildItem -Path $path ).FullName

                # Поместим корректные данные в этот массив
                $new_object = @()
                foreach ($dir in $home_dirs){
                    # Получим директории, где есть файл
                    $result = Get-ChildItem -Path $dir -Filter 'ntuser.dat' -Force
                    if ($result){
                        # Создаем из полного пути массив и берем последний элемент (имя пользователя)
                        $user_name = ($dir -split '\')[-1]
                        # Получаем время изменения файла
                        $logoff_date = $result.LastWriteTime
                        # Помещаем все данные в этот объект
                        $new_object += [PSCustomObject]@{
                            UserName = $user_name;
                            Computer = $ComputerName;
                            LogoffDate = $logoff_date;
                        }
                    }
                }
                return $new_object
            }
}

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

# Получение данных со всего AD
(Get-ADComputer -Filter *).Name | Get-UserLogged -ErrorAction SilentlyContinue
# Получение данных с локального компьютера
Get-UserLogged
# Получение данных с одного удаленного компьютера
Get-UserLogged -ComputerName 'CL5'

Функция получения пользователей с ntuser.dat в Powershell

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

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

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

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

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

Get-UserLogged | Where-Object -Property LogoffDate -LT ((Get-Date).AddHours(-1))

Получении списка вошедших пользователей с Powershell

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

$exclude = @('Admin', 'Administrator')
Get-UserLogged | where-object -Property UserName -NotIn $exclude

Исключение из списка вошедших пользователей с Powershell

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

$computers = (Get-ADComputer -Filter *).Name 
$users = $computers | Get-UserLogged -ErrorAction SilentlyContinue
$users | Export-Csv -Path 'C:users_logged.csv' -NoOverwrite -NoTypeInformation -Append

Результат получения залогиненных пользователей в Powershell с ntuser.dat

Через WMI

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

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

Теги:

#powershell

#ad

Понравилась статья? Поделить с друзьями:

Вот еще несколько интересных статей:

  • Windows server 2008 проверка системных файлов windows
  • Windows server 2008 не удалось найти системный том
  • Windows server 2008 не работает удаленный доступ
  • Windows server 2008 не работает dns
  • Windows server 2008 не переключается язык

  • 0 0 голоса
    Рейтинг статьи
    Подписаться
    Уведомить о
    guest

    0 комментариев
    Старые
    Новые Популярные
    Межтекстовые Отзывы
    Посмотреть все комментарии