Командлет Set-ADComputer позволяет изменить атрибуты учетной записи компьютера в Active Directory. В этой статье мы покажем, как с помощью логон скриптов и командлета Set-ADComputer записать имя текущего пользователя и IP адрес в свойства компьютера в AD. Такой скрипт может быть полезен, когда вам нужно найти в домене компьютер, за которым работает конкретный пользователь.
Использование Set-ADComputer для изменения атрибутов компьютера в AD
Командлет
Set-ADComputer
входит в состав модуля Active Directory для PowerShell и требует наличие установленного модуля на компьютере. Рассмотрим как пользоваться командлетом Set-ADComputer. Попробуем добавить в свойства компьютера в AD наименование компании и департамента. Сначала с помощью Get-ADComputer проверим, что указано у конкретного компьютера домена в полях company, department и description.
Get-ADComputer SRV-MAN01 -properties *|select-object dNSHostName,operatingSystem,company,department, description|ft -wrap -auto
Как вы видите, у компьютера не заполнены поля с описанием, названием компании и департаментом.
Попробуем изменить описание компьютера командой:
Set-ADComputer -Identity SRV-MAN01 -Add @{"description"="Сервер управления инфраструктурой"}
Можно указать местоположение компьютера:
Set-ADComputer –Identity SRV-MAN01–Location “Spb/Russia”
Если нужно задать несколько параметров компьютера, воспользуйтесь такой конуструкцией PowerShell:
$Server = Get-ADComputer -Identity SRV-MAN01
$Server.company = "contoso"
$Server.department = "IT"
Set-ADComputer -Instance $Server
Проверим, что атрибуты компьютера изменились:
Get-ADComputer SRV-MAN01 -properties *|select-object dNSHostName,operatingSystem,company,department, description|ft -wrap -auto
Как вы видите, теперь в атрибутах компьютера содержится нужная нам информация. Теперь мы можем выбирать компьютеры в AD на основе этих критериев. Например, я хочу выбрать все компьютеры департамента IT компании Contoso. Команда для выборки может выглядеть так:
Get-ADComputer -Filter {company -eq 'contoso'–AND department –like ‘IT’} -properties *|select-object dNSHostName,operatingSystem,company,department, description|ft -wrap -auto
Командлет Set-ADComputer также позволяет заблокировать (разблокировать)учетную запись компьютера в AD:
Set-ADComputer pc-name -Enabled $false
Как добавить имя пользователя в свойства компьютера в AD?
Рассмотрим более интересный и полезный пример использования командлета Set-ADComputer. Допустим, вы решили хранить в атрибутах каждого компьютера в Active Directory его текущий IP адрес и имя последнего залогиненого пользователя.
IP адрес компьютера мы будем хранить в атрибуте description, а имя пользователя, который работает за компьютером – в атрибуте ManagedBy.
В первую очередь необходимо делегировать права группе Domain Users (или другой группе безопасности пользователей) на OU с компьютерами на изменение значений в полях объктов типа Computer: ManagedBy и description (Write Description + Write Managed By).
Теперь создаем новую политику со следующим Logon скриптом PowerShell (User Configuration -> Policies -> Windows Settings -> Scripts -> Logon), который должен запускаться при входе пользователя в систему:
$curhostname=$env:computername
$env:HostIP = (
Get-NetIPConfiguration |
Where-Object {
$_.IPv4DefaultGateway -ne $null -and
$_.NetAdapter.Status -ne "Disconnected"
}
).IPv4Address.IPAddress
$currus_cn=(get-aduser $env:UserName -properties *).DistinguishedName
$ADComp = Get-ADComputer -Identity $curhostname
$ADComp.ManagedBy = $currus_cn
$ADComp.description = $env:HostIP
Set-ADComputer -Instance $ADComp
Данный PowerShell скрипт запускается под пользователем, определяет имя и IP адрес текущего компьютера, CN пользователя и сохраняет их в учетной записи компьютера в AD.
Эту политику нужно прилинковать на контейнер с компьютерами и включить замыкание групповой политики Configure user Group Policy Loopback Processing mode (см. здесь).
Теперь при входе пользователя в систему на компьютере отрабатывает данный скрипт и обновляет описание компьютера в AD.
В консоли ADUC теперь отображаются IP адреса компьютеров, а в свойствах компьютера на вкладке Managed By теперь есть активная ссылка на учетную запись пользователя, который последним регистрировался на данном компьютере.
Теперь вы можете быстро найти компьютеры в домене по IP адресу:
get-adcomputer -filter {description -like "10.10.1.*"} -properties *|select name,description,managedBy
Или можно найти все компьютеры в домене, на которых залогинен конкретный пользователь (командлет Get-AdUser испоьзуется для получения DistinguishedName пользователя):
$user='daivanov'
$user_cn=(get-aduser $user -properties *).DistinguishedName
Get-ADComputer -Filter "ManagedBy -eq '$user_cn'" -properties *|select name,description,managedBy|ft
Аналогичным образом вы можете записать в свойства аккаунтов компьютеров в AD любую информацию о рабочей станции или пользователе, и использовать ее для поиска (выборки) компьютеров в AD.
Спасибо за статью !
Вариант с «Managed By» неплох, но интереснее было бы увидеть метод с созданием отдельного атрибута пользователя под запись информации о хосте.
Не знаю, мне кажется держать информацию о компьютере в свойствах пользователя не совсем правильно. Один пользователь может работать на нескольких компьютерах.
Как вариант — мультистроковый атрибут, но мне кажется оно того не стоит — изменение схемы и прочее…
Идея со скриптом неплохая, но для работы нужно на всех машинах предварительно развернуть PS Module for AD
Вы правы, нужно ставить RSAT и модуль RSAT-AD-PowerShell на компьютеры пользователей. Заморочился этой темой — оказывается можно использовать командлеты модуля AD без его установки на компьютер. Достаточно подготовить и распространить несколько файлов на все компьютеры (через ту же политику), или импортировать модуль в сесиию непосредственно из сетевой папки.
Вот статья: https://winitpro.ru/index.php/2019/08/20/ad-powershell-bez-ustanovki-rsat/
#####
# Добавляем информацию о пользователе в свойства компьютеров AD
# https://winitpro.ru/index.php/2019/08/13/set-adcomputer-powershell/
# https://devblogs.microsoft.com/scripting/create-users-in-active-directory-without-using-module/
# https://devblogs.microsoft.com/scripting/working-with-users-in-active-directory/
# https://blogs.technet.microsoft.com/benp/2007/03/05/benps-basic-guide-to-managing-active-directory-objects-with-powershell/
#
$CurrentComputerInfo = Get-WmiObject -Class Win32_Computersystem
$CurrentDNSHostName = $CurrentComputerInfo.DNSHostName
$LastLoginUserName = $CurrentComputerInfo.UserName.Split("\").GetValue(1)
$LastLoginUserNameDN = $([adsisearcher]"sAMAccountName=$LastLoginUserName").FindOne().Properties.distinguishedname
$CurrentADComputerSearchResult = $([adsisearcher]"Name=$CurrentDNSHostName").FindOne()
$CurrentADComputerSearchResultADSPath = $CurrentADComputerSearchResult.Path
$CurrentADComputerObject = [adsi]"$CurrentADComputerSearchResultADSPath"
$CurrentADComputerObject.Put("ManagedBy","$LastLoginUserNameDN")
$CurrentADComputerObject.SetInfo()
И никаких доп. модулей PowerShell. Главное, наличие на АРМ Powershell и .Net.
Спасибо за инфу 🙂 Думаю кому-то может приходиться 🙂
С другой стороны модуль poshad весит пару мегабайт.
А как ИП адрес таким образом прописать? Не подскажете? не сильно силен в дотнет.
В статье есть пример как записать текущий ip компьютера в его свойствах в AD.
или вы о чем-то другом?
а как модуль установить на все компы?
Вы сейчас про какой модуль? Способо доставки модуля на компы довольно много — можно через GPO логон скрипт, GPO копирования файлов (https://winitpro.ru/index.php/2020/03/05/copy-files-folders-with-gpo/), а можно и не копировать, а запускать прямо из sysvol. Вариантов много
Когда-то давно делал по этой ссылке:
https://deployhappiness.com/find-out-what-computer-a-user-logged-into/
Работало прекрасно и ничего не нужно устанавливать на компах пользователей.
Сервер был 2003, а клиенты ХР и 7.
Открывал ADUC, а в нем подразделение с компьютерами и видел там напротив каждого компьютера ФИО пользователя, который вошел в систему.
Вообще на этом сайте много полезного нашел.
Или так …
«`powershell
#By AlexK 02.02.2022
$Description = »
$IPConfigs = Get-NetIPConfiguration -erroraction ‘silentlycontinue’
if ( $IPConfigs ){
$IPConfigs = $IPConfigs | Where-Object { $_.IPv4DefaultGateway -ne $null -and $_.NetAdapter.Status -ne «Disconnected» }
}
foreach ( $IPConfig in $IPConfigs ) {
$InterfaceIndex = $IPConfig.InterfaceIndex
$IP = $IPConfig.IPv4Address.ipaddress
$NetAdapter = Get-NetAdapter -InterfaceIndex $InterfaceIndex -erroraction ‘silentlycontinue’
if ( $NetAdapter ){
$Mac = $NetAdapter.MacAddress
}
Else {
$Mac = »
}
$Description += «$Ip ($Mac);»
}
try {
$CurrentComputerInfo = Get-ciminstance -Class ‘Win32_Computersystem’ -erroraction ‘silentlycontinue’
}
catch {
$CurrentComputerInfo = Get-WmiObject -Class ‘Win32_Computersystem’ -erroraction ‘silentlycontinue’
}
if ( $CurrentComputerInfo ){
$CurrentDNSHostName = $CurrentComputerInfo.DNSHostName
$LastLoginUserName = $env:Username
$LastLoginUserNameDN = $([adsisearcher]»sAMAccountName=$LastLoginUserName»).FindOne().Properties.distinguishedname | select-object -first 1
$CurrentADComputerSearchResult = $([adsisearcher]»Name=$CurrentDNSHostName»).FindOne()
$CurrentADComputerSearchResultADSPath = $CurrentADComputerSearchResult.Path
$CurrentADComputerObject = [adsi]»$CurrentADComputerSearchResultADSPath»
$SetInfo = $false
try{
if ( $Description ){
$CurrentADComputerObject.Put( «Description», $Description )
$SetInfo = $true
}
if ( $LastLoginUserNameDN ){
$CurrentADComputerObject.Put( «ManagedBy» , $LastLoginUserNameDN )
$SetInfo = $true
}
if ( $SetInfo ){
$CurrentADComputerObject.SetInfo()
write-host «Successfuly updated computer [$CurrentDNSHostName] attributes.» -foregroundcolor ‘Green’
}
}
Catch {
write-host «$( $_ | out-string )» -foregroundcolor ‘Red’
}
}
«`
Добавил (MAC)
Жаль все форматирование смыло. Красоту не видно.
Использую такой вариант. Делегирую права пользователям на запись в поле Description объекта Computer. В пользовательской групповой политике закидываю vbs скрипты на вход в систему и выход из системы
On Error Resume Next
Dim adsinfo, ThisComp, oUser
Set adsinfo = CreateObject("adsysteminfo")
Set ThisComp = GetObject("LDAP://" & adsinfo.ComputerName)
Set oUser = GetObject("LDAP://" & adsinfo.UserName)
Thiscomp.put "description", ">> ВХОД: " + oUser.cn + " " + CStr(Now)
ThisComp.Setinfo
On Error Resume Next
Dim adsinfo, ThisComp, oUser
Set adsinfo = CreateObject("adsysteminfo")
Set ThisComp = GetObject("LDAP://" & adsinfo.ComputerName)
Set oUser = GetObject("LDAP://" & adsinfo.UserName)
Thiscomp.put "description", ">> ВЫХОД: " + oUser.cn + " " + CStr(Now)
ThisComp.Setinfo
Заходим в ADUC с компьютерами, включаем отображение поля Description (Описание) и видим симпатичный результат