Как узнать текущего пользователя windows server
Управление пользователями в 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 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. Такой список так же хорошо подойдет для аудита, если понадобится быстро узнать кто пользовался компьютером и когда.
Навигация по посту
Как получить список залогиненных пользователей
В Powershell есть несколько методов возврата списка активных пользователей. Каждый из способов имеет свои минусы и поэтому, в зависимости от цели, какой-то способ будет удобнее использовать локально (при входе пользователя), а какой-то удаленно. В случае с WMI это так и не получилось сделать, так нет класса, который бы хранил все нужные значение и работал бы везде.
Локально при входе пользователя
Самый простой способ - это поместить скрипт в планировщик задач, который будет выполняться при входе пользователя в систему. Этот способ не подразумевает удаленной работы. Почти полный скрипт выглядит так:
Можно создать политику, которая будет запускать скрипт при входе и экспортировать в CSV. Сам файл CSV может находится на удаленном компьютере. Следующая команда сделает это записав данные в конец существующий файл (т.е. не перезапишет файл):
Получится примерно следующий вид файла:
Как создавать команды и функции в Powershell вызывать их и передавать параметры
Системная утилита quser.exe
Мы можем использовать системную программу quser, которая возвращает имя текущего пользователя и время его входа. Выглядит это так:
Quser так же может работать удаленно используя следующий синтаксис:
Первая проблема этого способа - это то, что quser работает через RPC. Если вы выполняете команду удаленно, а порты не открыты, вы получите ошибки:
- Error 0x000006BA enumerating sessionnames
- Error [1722]:The RPC server is unavailable.
Для примера, следующие команды исправят эти проблемы на одном компьютере, но скорее всего вы будете менять настройки через политики. Так же обратите внимание, что правило устанавливается на "Any", а не только "Domain":
Вторая проблема - если вы будете выполнять команду через Invoke-Command, то могут быть проблемы с кодировками:
И третья проблема - у нас возвращается строка, а не объект. Что бы мы могли все эти данные, в дальнейшем, экспортировать (например в CSV), мы должны ее парсить. Это можно сделать так:
Далее нам нужно преобразовать все в специальный массив - PSCustomObject, т.к. только он может быть экспортирован в CSV и представляет собой более удобный вывод:
Метод substring убирает первый символ, так как программа возвращает имя пользователя либо с пробелом начали или символом ">".
Такой скрипт мы можем объединить в один командлет, который сможет работать локально и удаленно:
В функцию добавлено несколько деталей:
Мы можем вызывать скрипт несколькими приемами:
Отмечу, что в случаях выключенных компьютеров запросы идут очень долго (около 2-3 секунд на компьютер). Способа снизить конкретно таймаут - я не знаю. Один из вариантов ускорить работу - фильтровать вывод с Get-ADComputer исключая отключенные учетные записи компьютеров. Так же можно попробовать использовать параллелизм.
Легче всего такой скрипт запускать на компьютерах пользователей, по событию входа в систему. На примере ниже я экспортирую эти данные в единый, для всех пользователей, файл CSV расположенный в доступности для пользователей:
Сам файл будет выглядеть так:
Отмечу следующие моменты:
Через файл ntuser.dat
В этом примере вернутся все каталоги пользователей:
Извлечем из пути имя пользователя и уберем лишние колонки:
Как вы знаете к большинству компьютеров можно подключится используя следующие пути:
Это же мы можем использовать с командой Get-ChildItem. Соединим все это в функцию:
Далее мы можем использовать команду в таких вариациях:
Отмечу несколько моментов:
Представим, что мы захотим сформировать список из тех пользователей, которые выполнили выход за последний час. Это можно сделать так:
Исключить пользователей мы можем так же:
Экспорт для Excel аналогичен предыдущему примеру:
Через 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 и выполнить команду:
wmic useraccount where name=′Kirill′ get sid
А можно и наоборот, выяснить имя пользователя по его SID:
wmic useraccount where sid=′S-1-5-21-4178654016-3479515840-607560339-1000′ get name
Дополнительно в WMI-запросе можно указать имя компьютера (для локального) или домена (для доменного пользователя). Например эта команда выведет SID локального администратора:
wmic useraccount where (name=′administrator′ and domain=′%computername%′) get sid
wmic useraccount where (name=′administrator′ and domain=′contoso′) get sid
Для обычного пользователя все также, узнаем 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
Примечание. В запросе вместо имени компьютера\домена можно использовать переменные %computername% и %userdomain%.
PowerShell и WMI
PowerShell также позволяет работать с WMI. Для примера обратимся к классу win32_userAccount и выведем SID доменного:
и локального пользователя:
Также вместо имени компьютера и домена можно указывать переменные окружения $env:computername и $env:userdomain, например:
Для обратной операции (узнать имя пользователя по SID) нам потребуется использовать свойство SID класса win32_SID. Например:
Как вариант, для работы с WMI можно использовать командлет Get-WmiObject (или Get-CimInstance). Например так мы узнаем SID пользователя:
(Get-WmiObject -Class win32_userAccount -Filter ″name=′Kirill′ and domain=′Contoso′″).SID
(Get-WmiObject -Class win32_userAccount -Filter ″SID=′S-1-5-21-2404695905-416858507-746700462-1001′″).Name
$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 = New-Object System.Security.Principal.NTAccount(″S-1-5-21-4178654016-3479515840-607560339-1000″)
$User = $SID.Translate([System.Security.Principal.NTAccount])
$User.Value
PsGetSid
Как видите, встроенных средств для выяснения SID в Windows предостаточно, но для полноты картины возьмем еще одно, от стороннего разработчика.
Читайте также: