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

Через файл 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 аналогичен предыдущему примеру:

Вам так же будет интересно:

Как массово определить SID пользователя

Все описанные выше методы хороши, когда вам нужно найти SID для одного или двух пользователей, а как быть если у вас это пачка логинов. Например мне это нужно было при предоставлении прав. Предположим, что у меня есть текстовый файл со списком логинов, каждый на новой строке. Мне нужно для каждого определить его Security Identifier.

В этом нам поможет скрипт PowerShell. Откройте ISE.

$users_file = «C:\scripts\users.txt»

foreach ($line in (Get-Content $users_file)) { $username = ($Line -split «\\») $user = Get-ADUser $username -Server «DC4.root.pyatilistnik.org»

$Result = @{ user = $line SID = $user.SID }

New-Object PSObject -Property $Result }

$Result

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

На этом у меня все с вами был Иван Семин, автор и создатель IT портала Pyatilistnik.org.

Что такое Sid windows

Давайте для начала с вами выясним определение SID или Security Identifier > это идентификатор безопасности, который используется в семействе операционных систем Windows для идентификации объекта:

  • Группа безопасности
  • Пользователь
  • Компьютер
  • Организационная единица
  • Принтер

SID во время создания объекта, присваивается ему , в домене Active Directory за это отвечает мастер роль RID. В рамках домена, каждый SID должен быть уникален, в отличии от имени, так как Ивановых Иванов Ивановичей, может быть много, а вот отличаться они будут логином и SID. Для операционной системы Windows, важнее сиды объектов, она же их использует и для контроля прав доступа на различные корпоративные ресурсы:

  • Папки и файлы
  • Принтеры
  • Доступ к внешним ресурсам

Структура SID

Давайте разбираться из каких частей состоит Security IDentifier.

Впереди идет версия сида, далее Генеральная область Authority — это ссылка на систему источник, которая его выпустила. В операционных системах Windows версия  Security IDentifier сейчас одна и равна она 1, Генеральная область Authority имеет значения 1,3,5, для Microsoft Exchange она 9. Далее в сиде следует 1 или более идентификаторов Sub Authority, а за ними идет RID (Relative IDentificator) локальный для данного Sub Authority номер субъекта безопасности.

По мимо этого, в любой ос Windows существуют встроенные или BuiltIn группы и учетные записи, например администратор или гость, в каждой ос виндоус они имеют одинаковые SID значения. Посмотреть вы их можете в оснастке Управление компьютером.

Сделаны они для того, что если у вас нет Active Directory, то вы могли бы администрировать данные системы с помощью них. Все SID для данных учетных записей находятся в локальной базе данных Windows, под названием Security Account Manager или SAM. Все сиды пользователей домена лежат в базе Active Directory в файле NTDS.dit.

Реализация задачи

Делать мы все будет с помощью вот такого простенького скрипта.

Давайте с вами пробежимся по каждой из строчек кода.

Set WshNetwork = WScript.CreateObject(«WScript.Network») — это объект VBSScript позволяет получать информацию по трем свойствам имя компьютера ComputerName, имя пользователя UserNam, имя домена UserDomain и методы MapNetworkDrive(), AddPrinterConnection(), SetDefaultPrinter(). Объект WScript.Network очень часто используется в WSH.  У созданного объекта — всего три свойства и восемь методов, но они могут оказаться очень полезными. Свойства ComputerName, UserDomain и UserName возвращают, соответственно, имя компьютера, имя домена и имя текущего пользователя. Очень удобно:

  1. для протоколирования выполнения скрипта — записывается информация о том, на каком компьютере произошло то или иное событие;
  2. для выполнения каких-либо действий только на том компьютере или только с тем пользователем, который указан в нашем списке (при помощи утилит ResourceKit можно основываться и на членстве пользователей в группах).
  3. Кроме того, можно просто отображать полученную информацию — например, на Web-странице, которая используется в качестве обоев для пользователя.
  • Set objSysInfo = CreateObject(«ADSystemInfo») — создание экземпляра объекта ADSystemInfoЭто невероятно полезный объект, который может возвращать всевозможную информацию о вошедшем в систему пользователе и локальном компьютере. Единственным недостатком этого объекта является тот факт, что он может быть создан только локально: вы не можете создать экземпляр ADSystemInfo на удаленном компьютере, а затем получить информацию о пользователе, вошедшем в систему на этом компьютере.
  • strUserDN = objSysInfo.UserName — получаем значение свойства strUserDN и сохраняем его в переменной с именем strUser
  • Set objUser = GetObject(«LDAP://» & strUserDN) — используем эту переменную как часть вызова GetObject, который связывает нас с учетной записью пользователя.
  • objUser.Put «Pager», WshNetwork.ComputerName — изменение атрибута с помощью метода Put. В моем случае, это атрибут пейджер
  • objUser.SetInfo — подтверждаем изменения в каталоге методом SetInfo

Вы вместо атрибута «Pager» можете подставлять любой, посмотреть атрибуты можно через редактор в Active Directory. Далее создаете текстовый документ и сохраняете его с расширением vbs.

Если не хотите сами создавать файл vbs, то можете скачать готовый скрипт добавления имени компьютера в нужный атрибут пользователя

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Powershell атрибуты пользователя. Локальные пользователи.

Для работы с учетными записями локальных пользователей используется модуль Local Accounts, доступный в репозитории Powershell Gallery(как установить модули описано здесь).

Найти пользователя можно с помощью командлета Get-LocalUser.

Синтаксис отличается от Get-ADUser. По умолчанию, без параметров Get-LocalUser выводит список всех локальных пользователей на компьютере:

Для получения информации по конкретному пользователю, нужно указать его параметры. Чтобы посмотреть доступные параметры используем командлет Get-Member:

Как можно видеть, параметров у пользователя намного меньше.

И еще, здесь есть отличие от Get-ADUser, параметр Name, который в Get-ADUser обозначал полное имя пользователя, в Get-LocalUser означает логин пользователя. Убедиться в этом можно на примере конкретного пользователя. Чтобы найти пользователя по атрибуту, отличному от его логина(Name) и SID, нужно задействовать командлет Where-Object:

Изменение атрибутов производится командлетом Set-LocalUser. Например, для изменения срока действия учетной записи с 31.08.2019 на 31.12.2020 команда выглядит так:

PowerShell

Get-LocalUser | Where-Object AccountExpires -like 08*31*2019* | Set-LocalUser -AccountExpires 31.12.2020

1 Get-LocalUser|Where-ObjectAccountExpires-like08*31*2019*|Set-LocalUser-AccountExpires31.12.2020

Аналогично меняются и другие атрибуты(Description, Fullname и т.д.)

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

Вот такая коротенькая памятка по поиску и изменению атрибутов пользователей получилась.

Еще статьи по использованию Powershell в администрировании можно посмотреть по тегу Powershell.

Работа с SAM-файлом

SAM – Security Account Manager. Файлы лежат в каталоге “\Windows\System32\config\” оттуда нужно скопировать файлы SAM и SYSTEM. Просто так, на живой системе их скопировать не получится, нужно воспользоваться либо загрузкой с LiveCD, либо описанным мной способом по выдёргиванию файлов из цепких лап системы.

Итак, файлы мы свиснули. Запускаем программу и в разделе “Utils” запускаем SAM Explorer.

В появившемся окне выбираем пункт “SAM database of an external PC”, что означает, что мы будем брать внешние файлы SAM и SYSTEM, а не использовать с текущей (запущенной) системы.

Соответственно, укажем расположение файлов. Достаточно указать первый – программа увидев, что в том же каталоге лежит файл с другим именем – заботливо предложит автоматически путь к нему.

Отобразится краткая информация о пользователях из файла SAM. Здесь мы можем увидеть:

  1. Имена и RID пользователей;
  2. Входят ли они так или иначе в группу Администраторов;
  3. Установлен ли пароль.

Если выбрать пользователя и нажать кнопку “Далее”, то отобразится дополнительная информация, такая как время последнего входа в систему, последнего выхода, время изменения пароля, срок действия аккаунта, последний ввод неверного пароля и много чего ещё.

К слову, даты представлены в виде 64-битной структуры FILETIME, которую ещё нужно конвертировать в “человеческий вид”. Покажу 2 способа. Либо кликаем правой кнопкой мыши на HEX-строке и выбираем “Copy Data as Hex”

Затем вставляем в WinHEX, подводим курсор на первый байт последовательности и в окне интерпретатора данных смотрим тип FILETIME.

Либо там же кликаем на пункт меню “Copy Data as Date String” и в журнале работы получаем упоминание “{May 25 2020 – 21:51:44} was copied to clipboard”

Внимательный читатель скажет “Па-а-аагадите-ка. Почему время разное?”

Кому интересно – могут почитать мою статью про временные метки в Windows (и вторая часть).

Как узнать ?

Фуф. Закрыли тему.

Рейтинг
( Пока оценок нет )
Понравилась статья? Поделиться с друзьями:
Мой редактор ОС
Добавить комментарий

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!: