Когда вы работаете с 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 и выполните следующие команды.
Примечание: Запрос к классу Win32_ComputerSystem вернет только имя пользователя того, кто вошел в систему непосредственно (сеанс консоли). Если пользователь вошел в систему удаленно (например, удаленный рабочий стол), имя пользователя будет пустым.
Обе команды возвращают одинаковый результат, как показано ниже. Если текущий пользователь – это учетная запись домена, команда вернет домен и имя пользователя (domain\username
). Но для учетной записи локального пользователя вывод будет компьютер\username
.

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

Чтение переменных среды Windows
Еще один способ использования PowerShell для получения текущего пользователя на компьютере – это извлечение значений из переменных среды. Переменные среды представляют данные операционной системы, включая имя текущего пользователя, среди прочего.
Существуют три способа взаимодействия с переменными среды. Какой бы способ вы ни выбрали, он вернет одинаковый результат.
Привод Env PowerShell
PowerShell кэширует переменные среды и делает их доступными через диск PowerShell (PSDrive) под названием Env:
. PSDrive – это местоположение данных, к которому можно получить доступ, подобно диску на компьютере (например, C:), но оно доступно только внутри PowerShell.
PowerShell автоматически создает диск Env:
сразу после открытия сеанса PowerShell. И поскольку Env:
является диском, вы можете получить его содержимое, вызвав командлет Get-ChildItem
, аналогично тому, как вы бы перечислили содержимое диска файловой системы или папки.
Используя диск Env: в PowerShell, получите текущего пользователя, запустив следующую команду.
На скриншоте ниже показан ожидаемый результат. Как видите, команда возвращает элемент USERNAME
и его соответствующее значение, которое является текущим вошедшим пользователем.

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

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

Класс среды .NET
PowerShell – это объектно-ориентированный язык и оболочка. Практически все, с чем вы работаете в PowerShell, является объектом. Когда вы выполняете команду, выводом является объект. Если вы объявили переменную, эта переменная сама по себе является объектом. Вы понимаете идею.
Эти объекты имеют структуру, которая определяет тип данных, который они представляют, аналогично чертежам. И эти чертежи называются .NET классами или просто классами.
Относительно переменных среды, класс, связанный с ним, – это класс Environment. Как же использовать класс Environment в PowerShell для получения текущего пользователя?
Как и переменная $env
, у класса Environment есть свойство Username
, значение которого – имя пользователя текущего пользователя. Чтобы получить значение свойства username, выполните следующую команду в PowerShell.

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

Используя класс .NET WindowsIdentity
Класс WindowsIdentity – еще один класс .NET, который можно вызвать в PowerShell для получения текущего пользователя. У этого класса есть метод с именем GetCurrentName
, который возвращает объект, представляющий текущего пользователя Windows.
Для получения подробной информации о текущем пользователе выполните следующую команду.
Как видно ниже, эта команда возвращает свойства текущего пользователя, включая свойство Name
. Значение свойства Name
имеет формат соглашения domain\user
.

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

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

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

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

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

Использование команды query
Если вы системный администратор или пользователь домена, вероятно, вы хоть раз вошли в удаленную машину через протокол удаленного рабочего стола (RDP), Remote Desktop Protocol (RDP), возможно, для управления ресурсами или использования приложений. В любом случае, вам бы хотелось знать, кто в настоящее время вошел и использует ресурсы системы.
К счастью, в Windows есть встроенный инструмент командной строки, называемый query
, который может перечислить всех в данный момент вошедших пользователей на компьютер. Команда также показывает, вошел ли пользователь через удаленную сессию рабочего стола или локально на компьютере.
Команда query
имеет два параметра, относящихся к получению списка вошедших пользователей; session
и user
. Параметр session
перечисляет сеансы компьютера, а параметр user
перечисляет пользователей и их сеансы.
Команда
query session
имеет псевдонимqwinsta
, в то время как псевдоним командыquery user
–quser
.
Например, выполните следующую команду, чтобы перечислить сеансы на DC1.
На скриншоте ниже показан вывод команды. В этом примере два пользователя вошли в систему на компьютере DC1: один в сеансе консоли, а другой через RDP. Как видите, qwinsta
возвращает все сеансы, даже те, которые не принадлежат пользователям.

Если вы запустите
qwinsta
илиquser
без аргумента/server:<компьютер>
, то каждая из этих команд будет запросом к локальному компьютеру по умолчанию.
Затем, чтобы вывести список всех пользователей с активными сеансами, выполните команду user
ниже.
После выполнения команды вы сразу заметите, что quser
возвращает сеансы и пользователей, подобно команде qwinsta
. Но на этот раз нет пустых сеансов.
Также есть два дополнительных столбца: IDLE TIME
, показывающий время бездействия пользователей, и LOGON TIME
, отображающий временную метку входа пользователей в систему.

В итоге, сравнив результаты 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/