Как узнать имя компьютера по имени пользователя в домене
Перейти к содержимому

Как узнать имя компьютера по имени пользователя в домене

  • автор:

Узнать имя пользователя по 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

Настройка серверов windows и linux

Добрый день! Уважаемые читатели и гости одного из крупнейших 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 возвращают, соответственно, имя компьютера, имя домена и имя текущего пользователя. Очень удобно:
  1. для протоколирования выполнения скрипта — записывается информация о том, на каком компьютере произошло то или иное событие;
  2. для выполнения каких-либо действий только на том компьютере или только с тем пользователем, который указан в нашем списке (при помощи утилит Resource Kit можно основываться и на членстве пользователей в группах).
  3. Кроме того, можно просто отображать полученную информацию — например, на 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. Кликаем по нему правым кликом и из контекстного меню выбираем пункт «Создать объект групповой политики в этом домене и связать его».

Создаем политику для запуска скрипта при логине пользователя

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

Узнать компьютер пользователя в AD-02

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

Настройка GPO для запуска скрипта узнающего имя компьютера у пользователя

Переходим по пути:

Конфигурация пользователя — Политики — Конфигурация Windows — Сценарии (вход/выход из системы) — Вход в систему

У вас откроется окно с вкладкой «Сценарии» и «Сценарии PowerShell». Нас будет интересовать первая вкладка, нажимаем кнопку «Добавить».

Узнать компьютер пользователя в AD-04

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

выбор vbs скрипта для входа пользователя на компьютер

Тестовый пользователь в оснастке ADUC

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

Узнать компьютер пользователя в AD-07

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

Узнать компьютер пользователя в AD-08

Скрипт 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 и примеры использованияGet-ADUser и примеры использования
  • Как массово поменять пароль локального администратора в домене
  • Не удалось назначить SPN учетной записи, ошибка 0x21c7/8647Не удалось назначить SPN учетной записи, ошибка 0x21c7/8647
  • Get-ADGroup: Управление группами Active DirectoryGet-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)

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *