Как узнать текущего пользователя windows server

Обновлено: 06.07.2024

Управление пользователями в Windows, помимо графической оснастки «Учетные данные пользователей», расположенной в панели управления, можно производить с помощью командной строки.

Команда NET USER

Команда NET USER предназначена для просмотра, добавления или редактирования учетных записей пользователей на компьютерах. При выполнении команды в командной строке без параметров отображается список учетных записей пользователей Windows, присутствующих на компьютере(локальные УЗ). Информация об учетных записях пользователей хранится в базе данных Windows.

Синтаксис команды NET USER

net user [имя_пользователя [пароль | *] [параметры]] [/domain]

net user имя_пользователя /add [параметры] [/domain]

net user имя_пользователя [/delete] [/domain], где

  • имя_пользователя — Указывает имя учётной записи пользователя, которую можно добавить, удалить, отредактировать или просмотреть. Имя может иметь длину до 20 символов.
  • пароль — Присваивает или изменяет пароль пользователя. Введите звездочку (*) для вывода приглашения на ввод пароля. При вводе с клавиатуры символы пароля не выводятся на экран.
  • /domain — Выполняет операцию на контроллере основного для данного компьютера домена.
  • параметры — Задает параметр командной строки для команды.
  • net help команда — Отображение справки для указанной команды net.
  • /delete — Удаление учетной записи пользователя.

Дополнительные параметры команды NET USER:

Примеры команды NET USER

  • Для вывода списка всех пользователей данного компьютера служит команда:
net user petr / add / times : Пн - Пт , 08 : 00 - 17 : 00 / fullname : "Petr"

Для просмотра членов локальной группы можно использовать команду net localgroup <«имя группы»>

Команда WHOAMI

Есть еще одна команда для определения свойств УЗ текущего пользователя, это команда WHOAMI

Три способа выполнения WhoAmI:

Синтаксис 1:
WHOAMI [/UPN | /FQDN | /LOGONID]

Синтаксис 3:
WHOAMI /ALL [/FO <формат>] [/NH]

Описание:
Эту программу можно использовать для получения сведений об имени
пользователя и группе, а также о соответствующих идентификаторах
безопасности (SID), утверждениях, привилегиях, идентификаторе входа
текущего пользователя на локальном компьютере, т. е. для
определения текущего пользователя. Если параметр не указан, имя
пользователя отображается в формате NTLM (домен\пользователь).

Параметры:
/UPN Отображение имени пользователя в формате
имени участника-пользователя (UPN).

/FQDN Отображение имени пользователя в формате
полного доменного имени (FQDN).

/USER Отображение сведений о текущем пользователе
вместе с идентификатором безопасности (SID).

/GROUPS Отображение для текущего пользователя членства
в группах, типа учетной записи, идентификаторов
безопасности (SID) и атрибутов.

/CLAIMS Отображение требований для текущего пользователя,
включая имя требования, флаги, тип и значения.

/PRIV Отображение привилегий безопасности текущего
пользователя.

/LOGONID Отображение идентификатора входа текущего
пользователя.

/ALL Отображение имени пользователя, членства
в группах, идентификаторов безопасности
(SID), утверждений и привилегий для
маркера входа текущего пользователя.

/FO <формат> Формат вывода.
Допустимые значения: TABLE, LIST, CSV.
Заголовки столбцов в формате CSV
не отображаются. Формат по умолчанию: TABLE.

/NH Строка заголовков столбцов
не отображается при выводе. Действительно
только для форматов TABLE и CSV.

/? Вывод справки по использованию.

Примеры использования WHOAMI:

WHOAMI — отобразить имя текущего пользователя в формате «домен\имя»

WHOAM /UPN — отобразить имя текущего пользователя в формате «имя@домен»

WHOAM /FQDN — отобразить имя текущего пользователя в формате полного доменного имени (FQDN).

WHOAMI /LOGONID — отобразить идентификатор текущего пользователя.

WHOAMI /USER — отобразить имя и SID текущего пользователя.

WHOAMI /USER /FO LIST — то же, что и в предыдущем случае, но с выводом данных в виде списка.

WHOAMI /GROUPS — отобразить список групп, членом которых является текущий пользователь.

WHOAMI /GROUPS /FO CSV — то же, что и в предыдущем случае, но с выводом результатов в виде полей, разделяемых запятой.

WHOAMI /GROUPS /FO CSV > C:\MyGroups.csv — то же, что и в предыдущем примере, но с выводом результатов в файл C:\MyGroups.csv.

WHOAMI /PRIV — отобразить список привилегий текущего пользователя.

WHOAMI /PRIV /FO TABLE — то же, что и в предыдущем примере, но с отображением результатов в виде таблицы.

WHOAMI /ALL — отобразить информацию о SID текущего пользователя, принадлежности к группам и перечень привилегий.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Через WMI

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

Всё о PowerShell в Windows и на Linux. Системное администрирование Windows

В операционной системе Windows и Windows Server можно выделить различные типы пользователей:

Рассмотрим, как получить имя каждого вида пользователя.

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

Самым очевидным кажется способ обратиться к переменной окружения:


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

А эта команда выведет имя компьютера:


Недостаток этого метода в том, что пользователь может подделать значение переменной окружения %UserName%.

Ещё одним недостатком может быть то, что, возможно, вам нужно имя пользователя вида «ДОМЕН\ПОЛЬЗОВАТЕЛЬ» или «КОМПЬЮТЕР\ПОЛЬЗОВАТЕЛЬ».

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



Ещё одним способом получить имя пользователя в PowerShell является команда:

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


Как вывести список всех пользователей Windows

Чтобы просмотреть список всех учётных записей, используйте командлет:


Чтобы показать только имена, используйте синтаксис:

Чтобы вывести только активные учётные записи, используйте команду:

Следующая команда покажет только имена активных учётных записей:

Вы можете найти информацию о других видах пользователей:

Универсальная команда whoami

Следующая команда покажет имя пользователя как в PowerShell, так и в CMD:

Примечание. Говоря об уникальности SID, надо сделать одну оговорку. В Windows существуют так называемые встроенные (BuiltIn) учетные записи, такие как Administrator или Guest. SID-ы этих записей одинаковы в каждом экземпляре Windows вне зависимости от версии ОС. Это дает администратору возможность более-менее централизованно управлять доступом при отсутствии доменной структуры.

Whoami

Когда требуется посмотреть SID текущего пользователя, то проще всего воспользоваться утилитой whoami. Для этого надо открыть консоль cmd и выполнить команду:

узнаем SID пользователя с помощью whoami

wmic useraccount where name=′Kirill′ get sid

А можно и наоборот, выяснить имя пользователя по его SID:

wmic useraccount where sid=′S-1-5-21-4178654016-3479515840-607560339-1000′ get name

узнаем SID локального пользователя с помощью wmic

Дополнительно в WMI-запросе можно указать имя компьютера (для локального) или домена (для доменного пользователя). Например эта команда выведет SID локального администратора:

wmic useraccount where (name=′administrator′ and domain=′%computername%′) get sid

wmic useraccount where (name=′administrator′ and domain=′contoso′) get sid

узнаем SID локального и\или доменного администратора с помощью wmic

Для обычного пользователя все также, узнаем SID по имени:

wmic useraccount where (name=′kirill′ and domain=′contoso′) get sid

wmic useraccount where (sid=′S-1-5-21-2404695605-4156858507-746700462-1001′ and domain=′contoso′) get name

узнаем SID доменного пользователя с помощью wmic

Примечание. В запросе вместо имени компьютера\домена можно использовать переменные %computername% и %userdomain%.

PowerShell и WMI

PowerShell также позволяет работать с WMI. Для примера обратимся к классу win32_userAccount и выведем SID доменного:

и локального пользователя:

Также вместо имени компьютера и домена можно указывать переменные окружения $env:computername и $env:userdomain, например:

узнаем SID пользователя с помощью wmi

Для обратной операции (узнать имя пользователя по SID) нам потребуется использовать свойство SID класса win32_SID. Например:

узнаем имя пользователя по его SID с помощью wmi

Как вариант, для работы с WMI можно использовать командлет Get-WmiObject (или Get-CimInstance). Например так мы узнаем SID пользователя:

(Get-WmiObject -Class win32_userAccount -Filter ″name=′Kirill′ and domain=′Contoso′″).SID

узнаем SID пользователя с помощью Get-WmiObject

(Get-WmiObject -Class win32_userAccount -Filter ″SID=′S-1-5-21-2404695905-416858507-746700462-1001′″).Name

узнаем имя пользователя по SID с помощью Get-WmiObject

$User = New-Object System.Security.Principal.NTAccount(″Kirill″)
$SID = $User.Translate([System.Security.Principal.SecurityIdentifier])
$SID.Value

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

$User = New-Object System.Security.Principal.NTAccount(″Contoso″,″Kirill″)
$SID = $User.Translate([System.Security.Principal.SecurityIdentifier])
$SID.Value

узнаем SID пользователя с помощью .Net

$SID = New-Object System.Security.Principal.NTAccount(″S-1-5-21-4178654016-3479515840-607560339-1000″)
$User = $SID.Translate([System.Security.Principal.NTAccount])
$User.Value

узнаем имя пользователя по SID с помощью .Net

PsGetSid

Как видите, встроенных средств для выяснения SID в Windows предостаточно, но для полноты картины возьмем еще одно, от стороннего разработчика.

Читайте также: