Узнать имя пользователя по SID или SID по имени пользователя.
Довольно часто мы встречаемся с ситуацией, когда известен только SID пользователя. Соотвественно встает вопрос как по этому номеру (SIDу) узнать имя пользователя. Ниже приведены примеры скриптов выполняющих данную операцию.
1. Узнать SID по имени пользователя в домене —
strComputer = "." Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\cimv2") Set objAccount = objWMIService.Get _ ("Win32_UserAccount.Name='vasya',Domain='domain'") Wscript.Echo objAccount.SID
где vasya — это имя пользователя
domain — именование домена.
2. Узнать SID по имени пользователя на локальной машине
strComputer = "." Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\cimv2") Set objAccount = objWMIService.Get _ ("Win32_UserAccount.Name='usermane',Domain='computername'") Wscript.Echo objAccount.SID
где username — имя пользователя, computername — имя компьютера
3. Узнать имя пользователя по SID
strComputer = "." Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\cimv2") Set objAccount = objWMIService.Get _ ("Win32_SID.SID='S-1-5-21-4122063186-443647741-4275581403-5649'") Wscript.Echo objAccount.AccountName Wscript.Echo objAccount.ReferencedDomainName
Данный скрипт выводит имя пользователя и домен, к которому этот пользователь принадлежит
Как вычислить имя компьютера пользователя в Active Directory

Добрый день! Уважаемые читатели и гости одного из крупнейших IT блогов в России Pyatilistnik.org. В прошлый раз мы с вами производили поиск неактивных пользователей в домене. Сегодня мы сделаем еще одну полезную вещь для нашего AD, а именно научимся автоматически определять DNS-имя компьютера на котором локально залогинен пользователь и заносить эту информацию в атрибут Active Directory у пользовательской учетной записи.
Постановка задачи
В компаниях, где есть техническая поддержка пользователей, ее инженеры очень часто подключаются удаленно к компьютерам сотрудников для устранения всевозможных проблем. Чаще всего используются программы TeamViewer, встроенный помощник Windows или Dameware. Но для того, чтобы подключиться вам необходимо знать имя компьютера. Понятно, что можно каждый раз просить пользователя посмотреть его либо в окне системы или же на рабочем столе, если у вас выводится информация с помощью BGinfo. Но проще и правильнее всегда эту информацию иметь в базе Active Directory.
Поэтому мы сделаем так, что при локальном входе в компьютер, информация, о его DNS-имени будет автоматически записана в нужное нам поле. Это удобно и можно легко эту информацию выдергивать в любую программу, которая умеет работать с Active Directory, например SCCM.
Реализация задачи
Делать мы все будет с помощью вот такого простенького скрипта.
Set WshNetwork = WScript.CreateObject(«WScript.Network»)
Set objSysInfo = CreateObject(«ADSystemInfo»)
Set objUser = GetObject(«LDAP://» & strUserDN)
objUser.Put «Pager», WshNetwork.ComputerName
Давайте с вами пробежимся по каждой из строчек кода.
- Set WshNetwork = WScript.CreateObject(«WScript.Network») — это объект VBSScript позволяет получать информацию по трем свойствам имя компьютера ComputerName, имя пользователя UserNam, имя домена UserDomain и методы MapNetworkDrive(), AddPrinterConnection(), SetDefaultPrinter(). Объект WScript. Network очень часто используется в WSH. У созданного объекта — всего три свойства и восемь методов, но они могут оказаться очень полезными. Свойства ComputerName , UserDomain и UserName возвращают, соответственно, имя компьютера, имя домена и имя текущего пользователя. Очень удобно:
- для протоколирования выполнения скрипта — записывается информация о том, на каком компьютере произошло то или иное событие;
- для выполнения каких-либо действий только на том компьютере или только с тем пользователем, который указан в нашем списке (при помощи утилит Resource Kit можно основываться и на членстве пользователей в группах).
- Кроме того, можно просто отображать полученную информацию — например, на 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
Создание политики во время входа в систему
Файл со скриптом у меня готов. Открываем оснастку «Управление групповой политикой». Выбираем нужное организационное подразделение к которому мы будем применять политику, в моем случае, это контейнер «Users», поэтому политику я буду применять на самый корень домена root.pyatilistnik.org. Кликаем по нему правым кликом и из контекстного меню выбираем пункт «Создать объект групповой политики в этом домене и связать его».

Задаем имя для нашей политики.

Далее нам необходимо изменить и настроить нашу политику. Для этого щелкаем по ней правым кликом и выбираем «Изменить».

Переходим по пути:
Конфигурация пользователя — Политики — Конфигурация Windows — Сценарии (вход/выход из системы) — Вход в систему
У вас откроется окно с вкладкой «Сценарии» и «Сценарии PowerShell». Нас будет интересовать первая вкладка, нажимаем кнопку «Добавить».

Через кнопку «Обзор» вам нужно будет выбрать ваш файл vbs. Я вам советую его скопировать в сетевую папку с политикой, либо в сетевую шару, где файл будет доступен для всех.


Пробуем залогиниться Геннадием на рабочей станции с Windows 10 с именем W10-CL01. После входа на компьютер, проверяем свойство «Пейджер» у данного пользователя. Как видим, все прописалось.

Пробуем подключиться к еще одному компьютеру с Windows 10 под именем W10-CL02. Видим, что атрибут в AD изменил свое значение на имя второго компьютера.

Скрипт PowerShell для записи имени системы куда был последний вход
Все то же самое можно сделать и на PowerShell, и как показала практика данный скрипт работает на более современных версиях Windows 10 и Windows 11 без проблем, да и вообще он более современный, его так же можно применять в автозагрузке с помощью групповой политики.
$computername = «$((Get-WmiObject Win32_ComputerSystem).Name).$((Get-WmiObject Win32_ComputerSystem).Domain)»
$username = «$($env:USERDOMAIN)\$($env:USERNAME)»
«$(Date) Trying to set user $username Pager attribute value to $computername» | Tee-Object $log -Append
try $ad_user = $current_user.FindOne().GetDirectoryEntry()
$ad_user.Put(«Pager»,$computername)
$ad_user.SetInfo()
>
catch «$(Date) $($_.exception.message)» | Tee-Object $log -Append
>
еще вариант скрипта:
$computername = «$((Get-WmiObject Win32_ComputerSystem).Name).$((Get-WmiObject Win32_ComputerSystem).Domain)»
$username = «$($env:USERDOMAIN)\$($env:USERNAME)»
«$(Date) Trying to set user $username Pager attribute value to $computername» | Tee-Object $log -Append
try $ad_user = $current_user.FindOne().GetDirectoryEntry()
$ad_user.Put(«Pager»,$computername)
$ad_user.SetInfo()
>
catch «$(Date) $($_.exception.message)» | Tee-Object $log -Append
>
if ($((Get-WmiObject Win32_ComputerSystem).Domain) -eq «root.pyatilistnik.org»)
$value_to_add = «$(Date) — $($env:USERNAME)»
«$(Date) Trying to add `»$value_to_add`» string to Info attribute value for $computername» | Tee-Object $log -Append
$comp_name = «$((Get-WmiObject Win32_ComputerSystem).Name)$»
$comp_object = [adsisearcher]»(&(samaccountname=$comp_name))»
$comp = $comp_object.FindOne().GetDirectoryEntry()
# $values_current = @()
# $values_current = $comp.Properties[«Info»].Value -split «;»
# $comp.Properties[«Info»].Value
$value_new = $null
$value_new = «$($comp.Properties[«Info»].Value);$value_to_add»
$values_new = $value_new -split «;»
if ($values_new.Length -gt 3)
$value_new = ($values_new | select -Last 3) -join «;»
>
# $value_new
try $comp.Put(«Info», $value_new)
$comp.SetInfo()
>
catch «$(Date) $($_.exception.message)» | Tee-Object $log -Append
>
>
Напоминаю, что записываться будут только локальные входы. Сама реализация до безобразия проста, но надежна. Надеюсь, что кому-то данная заметка оказалась полезной, а с вами был Иван Семин, автор и создатель IT блога Pyatilistnik.org.
Популярные Похожие записи:
Get-ADUser и примеры использования- Как массово поменять пароль локального администратора в домене
Не удалось назначить SPN учетной записи, ошибка 0x21c7/8647
Get-ADGroup: Управление группами Active Directory- Как преобразовать GUID пользователя Active Directory в имя
- Как удалить sIDHistory у объектов Active Directory
Я ИТ специалист или Жизнь ИТшника
Это блог о моей работе, жизни и увлечениях! Решим ИТ проблемы вместе!
Как узнать имя пользователя за компьютером?
Иногда необходимо узнать какой пользователь домена работает за компьютером, а иногда и наоборот необходимо узнать за какими компьютерами в домене работает пользователь (или просто получить список пользователей работающих на Пк в домене). Для этого дела у меня есть два небольших скрипта:
Скрипт № 1: получение имени пользователя работающего на компьютере в домене
strComputer = «computername»
Set objWMIService = GetObject(«winmgmts:\\» & strComputer & «\root\CIMV2»)
Set colItems = objWMIService.ExecQuery( _
«SELECT * FROM Win32_ComputerSystem»,,48)
For Each objItem in colItems
Wscript.Echo «UserName: » & objItem.UserName
Этот скрипт выдаст логин с которым работает пользователь на указанном компьютере. Если нужен не только логин, но и DN , то можно скомбинировать его с примером из предыдущего поста: Список пользователей в группе AD.
Теперь рассмотрим обратную ситуацию. Пользователь зашел на многих компьютерах или постоянно перемещается и необходимо узнать где он работает.
Скрипт № 2: Получение списка компьюетров в домене и работающих за ними пользователей
Этот скрипт немного сложнее и в нем появилась такая важная вещь как получение списка ПК в домене. полученный список обходится и проверяется на доступность. Если компьютер доступен, то через WMI запрашивается пользователь. Если за компьютером никто не работает то выведется пустой пользователь. Полученный файлик можно просмотреть и отобрать (найти) нужные строки. На моем домене в 100 ПК, скрипт отработал все компьютеры примерно за 2-3 минуты.
PowerShell: системное администрирование и программирование
Всё о PowerShell в Windows и на Linux. Системное администрирование Windows
Как в PowerShell узнать имя пользователя
В операционной системе Windows и Windows Server можно выделить различные типы пользователей:
- пользователь, выполнивший вход в систему
- зарегистрированный владелец установленной ОС и имя зарегистрированного пользователя операционной системы
- имеющиеся учётные записи в данной ОС
Рассмотрим, как получить имя каждого вида пользователя.
Как узнать имя пользователя, выполнившего вход
Самым очевидным кажется способ обратиться к переменной окружения:
$env:UserName
Дополнительно могут заинтересовать ещё парочка переменных окружения. В следующей содержится имя компьютера или имя домена, если компьютер является частью домена.
$env:UserDomain
А эта команда выведет имя компьютера:
$env:ComputerName
Недостаток этого метода в том, что пользователь может подделать значение переменной окружения %UserName%.
Ещё одним недостатком может быть то, что, возможно, вам нужно имя пользователя вида «ДОМЕН\ПОЛЬЗОВАТЕЛЬ» или «КОМПЬЮТЕР\ПОЛЬЗОВАТЕЛЬ».
Этого недостатка лишена следующая команда, которая выведет полное имя пользователя, вместе с компьютером или доменом, к которому данный пользователь относится:
[System.Security.Principal.WindowsIdentity]::GetCurrent().Name
Ещё одним способом получить имя пользователя в PowerShell является команда:
Get-ComputerInfo -Property CsUserName
CsUserName ---------- HACKWARE-WINDOW\MiAl
Если вы хотите более компактный вывод, то используйте следующий синтаксис:
(Get-ComputerInfo).CsUserName
HACKWARE-WINDOW\MiAl
Как вывести список всех пользователей Windows
Чтобы просмотреть список всех учётных записей, используйте командлет:
Чтобы показать только имена, используйте синтаксис:
(Get-LocalUser).Name
Чтобы вывести только активные учётные записи, используйте команду:
Get-LocalUser | Where-Object
Следующая команда покажет только имена активных учётных записей:
(Get-LocalUser | Where-Object ).Name
Владельцы и зарегистрированные пользователи Windows
Вы можете найти информацию о других видах пользователей:
Get-ComputerInfo -Property WindowsRegisteredOwner Get-ComputerInfo -Property CsPrimaryOwnerName Get-ComputerInfo -Property OsRegisteredUser
- WindowsRegisteredOwner — имя зарегистрированного владельца этой установки Windows из реестра Windows.
- CsPrimaryOwnerName — имя основного владельца системы
- OsRegisteredUser — имя зарегистрированного пользователя операционной системы
Универсальная команда whoami
Следующая команда покажет имя пользователя как в PowerShell, так и в CMD:
whoami
Имя пользователя она берёт из переменной окружения.
Write-Host "Текущий пользователь:" Write-Host $(whoami)
Ещё один пример:
Write-Host "Текущий пользователь: " -NoNewline; Write-Host $(whoami)