Использование Dynamic PowerShell для получения текущих пользователей

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

Есть ли скомпрометированные пароли в вашем активном каталоге? Узнайте с помощью Specops Password Auditor Free.

В этом руководстве вы узнаете несколько способов использования PowerShell для получения текущих пользователей на компьютере. Методы, которые вы изучите, включают в себя встроенные команды, .NET классы и командлеты, специфичные для Windows Management Instrumentation (WMI).

Готовы узнать, кто скрывается на вашем компьютере? Давайте начнем!

Предварительные требования

В этом руководстве лучше всего изучать, следуя примерам. И для этого вам понадобится компьютер, работающий под управлением любой современной версии Windows, такой как Windows 10, Windows Server 2012 или более поздней.

В этом руководстве будет использоваться компьютер под управлением Windows Server 2019 с именем DC1.

Почему использовать PowerShell для получения текущих пользователей, вошедших в систему на компьютере?

Признаймо, есть способы войти в систему под текущими пользователями на компьютере без PowerShell. В конце концов, администраторам систем приходилось делать это даже до появления PowerShell, верно? Если это так, зачем использовать PowerShell?

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

Еще один пример из реальной жизни – экспорт списка пользователей, в настоящее время вошедших в систему, на сервере в файл. Это происходит с использованием PowerShell для получения текущих пользователей, а затем экспорта результата в файлы CSV, HTML или XML. После этого различные рабочие процессы автоматизации могут использовать этот вывод.

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

Запрос к классу Win32_ComputerSystem

Давайте начнем с нативных командлетов PowerShell, называемых Get-WMIObject и Get-CimInstance. Эти командлеты позволяют выполнять запросы для получения информации, включая информацию о текущем пользователе, с использованием классов Windows Management Instrumentation (WMI) на локальном или удаленном компьютере.

Get-WMIObject – это устаревший (deprecated) командлет и доступен только до Windows PowerShell 5.1. В отличие от него, Get-CIMInstance – это более новый, более безопасный командлет и доступен вплоть до последних версий PowerShell.

Для получения дополнительной информации посетите Get-CIMInstance Vs. Get-WMIObject: В чем разница?

Чтобы использовать PowerShell для получения текущего пользователя, вызовите cmdlet, нацеленную на класс Win32_ComputerSystem. Класс Win32_ComputerSystem включает различные свойства, включая свойство Username. Для этого откройте окно PowerShell и выполните следующие команды.

# Используя cmdlet Get-WMIObject и возвращение только свойства Username
(Get-WMIObject -ClassName Win32_ComputerSystem).Username

# Используя cmdlet Get-CimInstance и возвращение только свойства Username
(Get-CimInstance -ClassName Win32_ComputerSystem).Username

Примечание: Запрос к классу Win32_ComputerSystem вернет только имя пользователя того, кто вошел в систему непосредственно (сеанс консоли). Если пользователь вошел в систему удаленно (например, удаленный рабочий стол), имя пользователя будет пустым.

Обе команды возвращают одинаковый результат, как показано ниже. Если текущий пользователь – это учетная запись домена, команда вернет домен и имя пользователя (domain\username). Но для учетной записи локального пользователя вывод будет компьютер\username.

Querying WMI in PowerShell to Get Current Users

Get-WMIObject и Get-CimInstance имеют параметр, называемый -computerName, который принимает имя компьютера для запроса. Использование этого параметра означает, что вы можете запрашивать ту же информацию с удаленной машины в сети.

Но если вам нужно получить только имя пользователя без домена, решением будет разделить вывод, используя метод split(). Для этого выполните следующую команду в PowerShell.

# Команда ниже разделит свойство имени пользователя на две части, используя обратный слэш '\' в качестве разделителя.
# Часть [1] в конце указывает команде вернуть только результат с индексом 1.
# Индексы начинаются с 0, что означает, что указание индекса 1 покажет результат на второй позиции.
((Get-WMIObject -ClassName Win32_ComputerSystem).Username).Split('\')[1]

В результате PowerShell вернет только часть пользователя, как на скриншоте ниже.

Splitting the username property

Чтение переменных среды Windows

Еще один способ использования PowerShell для получения текущего пользователя на компьютере – это извлечение значений из переменных среды. Переменные среды представляют данные операционной системы, включая имя текущего пользователя, среди прочего.

Существуют три способа взаимодействия с переменными среды. Какой бы способ вы ни выбрали, он вернет одинаковый результат.

Привод Env PowerShell

PowerShell кэширует переменные среды и делает их доступными через диск PowerShell (PSDrive) под названием Env:. PSDrive – это местоположение данных, к которому можно получить доступ, подобно диску на компьютере (например, C:), но оно доступно только внутри PowerShell.

PowerShell автоматически создает диск Env: сразу после открытия сеанса PowerShell. И поскольку Env: является диском, вы можете получить его содержимое, вызвав командлет Get-ChildItem, аналогично тому, как вы бы перечислили содержимое диска файловой системы или папки.

Используя диск Env: в PowerShell, получите текущего пользователя, запустив следующую команду.

Get-ChildItem Env:\USERNAME

На скриншоте ниже показан ожидаемый результат. Как видите, команда возвращает элемент USERNAME и его соответствующее значение, которое является текущим вошедшим пользователем.

Getting the Env:\USERNAME item

Чтобы вернуть только значение имени пользователя, измените команду, как показано ниже, и выполните ее повторно в PowerShell.

(Get-ChildItem Env:\USERNAME).Value

И как видно ниже, команда возвращает только значение имени пользователя в виде строки.

Getting the Env:\USERNAME value

Переменная $env

Помимо доступа к переменным среды как к PSDrive, обрабатывая их как файлы на диске, другой способ – доступ к диску Env как к переменной. Это означает, что вы можете ссылаться на переменные среды, используя следующий синтаксис.

# Знак $ указывает на переменную
# env - это диск Env
# <variable> - это имя переменной, которое вы хотите получить
$env:<variable>

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

$env:username

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

Getting the username variable value

Класс среды .NET

PowerShell – это объектно-ориентированный язык и оболочка. Практически все, с чем вы работаете в PowerShell, является объектом. Когда вы выполняете команду, выводом является объект. Если вы объявили переменную, эта переменная сама по себе является объектом. Вы понимаете идею.

Эти объекты имеют структуру, которая определяет тип данных, который они представляют, аналогично чертежам. И эти чертежи называются .NET классами или просто классами.

Относительно переменных среды, класс, связанный с ним, – это класс Environment. Как же использовать класс Environment в PowerShell для получения текущего пользователя?

Как и переменная $env, у класса Environment есть свойство Username, значение которого – имя пользователя текущего пользователя. Чтобы получить значение свойства username, выполните следующую команду в PowerShell.

[System.Environment]::UserName
Getting the environment username property value

Помимо свойства Username, класс Environment также имеет метод для получения значения переменной среды. Имя метода – GetEnvironmentVariable.

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

[System.Environment]::GetEnvironmentVariable('username')
Getting the environment variable value

Используя класс .NET WindowsIdentity

Класс WindowsIdentity – еще один класс .NET, который можно вызвать в PowerShell для получения текущего пользователя. У этого класса есть метод с именем GetCurrentName, который возвращает объект, представляющий текущего пользователя Windows.

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

[System.Security.Principal.WindowsIdentity]::GetCurrent()

Как видно ниже, эта команда возвращает свойства текущего пользователя, включая свойство Name. Значение свойства Name имеет формат соглашения domain\user.

Getting the current Windows user

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

([System.Security.Principal.WindowsIdentity]::GetCurrent().Name).Split('\')[1]
Returning only the username part

Использование команды whoami

Еще одна полезная команда, которая позволяет быстро получить текущего пользователя – это команда whoami. Эта команда представляет собой исполняемый файл, который можно найти в папке %WINDIR%\System32 с именем файла whoami.exe.

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

whoami

Затем команда возвращает результат в формате domain username, как показано на скриншоте ниже.

Getting the username using whoami

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

(whoami).Split('\')[1]
Getting the username without the domain

Команда whoami также может вернуть полное уникальное имя (FQDN) текущего пользователя (fully qualified distinguished name) и пользовательское имя принципала (UPN) . Этот вывод команды может быть полезен, если вы планируете запустить сценарий, который получает личность текущего пользователя за пределами имени пользователя.

Запустите следующую команду в PowerShell, чтобы получить FQDN и UPN текущего пользователя.

# Получить FQDN текущего пользователя
whoami /fqdn

# Получить UPN текущего пользователя
whoami /upn
Getting the current user’s FQDN and UPN

Примечание: Значения FQDN и UPN доступны только, если текущий пользователь вошел в домен. Если вы пытаетесь получить эти значения для локального пользователя, команда вернет ошибку, как показано ниже.

Error getting the UPN and FQDN of a non-domain user account

Использование команды query

Если вы системный администратор или пользователь домена, вероятно, вы хоть раз вошли в удаленную машину через протокол удаленного рабочего стола (RDP), Remote Desktop Protocol (RDP), возможно, для управления ресурсами или использования приложений. В любом случае, вам бы хотелось знать, кто в настоящее время вошел и использует ресурсы системы.

К счастью, в Windows есть встроенный инструмент командной строки, называемый query, который может перечислить всех в данный момент вошедших пользователей на компьютер. Команда также показывает, вошел ли пользователь через удаленную сессию рабочего стола или локально на компьютере.

Команда query имеет два параметра, относящихся к получению списка вошедших пользователей; session и user. Параметр session перечисляет сеансы компьютера, а параметр user перечисляет пользователей и их сеансы.

Команда query session имеет псевдоним qwinsta, в то время как псевдоним команды query userquser.

Например, выполните следующую команду, чтобы перечислить сеансы на DC1.

# запрос сеансов на DC1
qwinsta /server:dc1

На скриншоте ниже показан вывод команды. В этом примере два пользователя вошли в систему на компьютере DC1: один в сеансе консоли, а другой через RDP. Как видите, qwinsta возвращает все сеансы, даже те, которые не принадлежат пользователям.

Querying sessions

Если вы запустите qwinsta или quser без аргумента /server:<компьютер>, то каждая из этих команд будет запросом к локальному компьютеру по умолчанию.

Затем, чтобы вывести список всех пользователей с активными сеансами, выполните команду user ниже.

# запрос пользователей на DC1
quser /server:dc1

После выполнения команды вы сразу заметите, что quser возвращает сеансы и пользователей, подобно команде qwinsta. Но на этот раз нет пустых сеансов.

Также есть два дополнительных столбца: IDLE TIME, показывающий время бездействия пользователей, и LOGON TIME, отображающий временную метку входа пользователей в систему.

Querying users

В итоге, сравнив результаты qwinsta и quser, quser является более подходящей командой в PowerShell для получения текущих пользователей.

Есть ли скомпрометированные пароли в вашем Active Directory? Узнайте с помощью Specops Password Auditor Free.

Заключение

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

Нативные cmdlet’ы, связанные с WMI, и команда query позволяют получить информацию о вошедших пользователях на локальном или удаленном компьютере. Использование классов .NET и переменных среды предоставляет быстрые способы получения аналогичных результатов, но только на локальном компьютере.

Независимо от того, планируете ли вы запустить сценарий или отобразить результаты на экране вручную, существует метод, который соответствует вашим требованиям для использования PowerShell и получения информации о текущем пользователе. Что дальше? Возможно, вы хотели бы узнать, как анализировать результаты команды query и преобразовывать их в объекты PowerShell, создавая функции с использованием RegEx?

Source:
https://adamtheautomator.com/powershell-get-current-user/