При присоединении компьютера к домену Active Directory для него создается отдельная учетная запись типа Computer. У компьютера в AD есть набор обязательных атрибутов:
sAMAccountName
,
distinguishedName
, SID, версия и билд Windows (
operatingSystem
,
operatingSystemVersion
), userAccountControl,
lastLogonTimeStamp
и т.д. В необязательных атрибутах компьютера можно хранить информацию о его владельце, местоположении, описании, IP адресе. В этой статье мы покажем, как изменить значения атрибутов у учетной записи компьютера AD с помощью ADUC и PowerShell.
Изменить свойства компьютера с помощью консоли Active Directory (ADUC)
Администратор может изменить атрибуты компьютер в Active Directory с помощью графической консоли ADUC.
Откройте консоль Active Directory Users and Computers (
dsa.msc
), найдите учетную запись нужного компьютера (как искать объекты в AD) и откройте его свойства. Здесь вы можете задать описание компьютера (поле
Description
), указать местоположение, назначить пользователя, ответственного за это компьютер (
Managed by
).
Вы можете отредактировать значения остальных атрибутов компьютера на вкладке Attribute Editor. Будьте внимательными при редактировании обязательных атрибутов компьютера. Редактор атрибутов объекта в AD не проверяет корректность введенных данных (проверяется только тип данных и длина значения), поэтому при некорректных значения атрибутов компьютера, он может потерять доверительные отношения с доменом.
Изменить значение атрибута компьютера в AD с помощью PowerShell
Командлет Set-ADComputer (из модуля Active Directory для PowerShell) позволяет изменить атрибуты учетной записи компьютера в Active Directory.
Например, вы хотите добавить в свойства компьютера в AD его, название компании и департамента, которому он принадлежит.
Чтобы изменить значение основных атрибутов компьютера, можно использовать встроенные параметры, таки как
-Description
,
-DisplayName
,
-DNSHostName
,
-HomePage
,
-Location
и т.д., Например указать местоположение компьютера:
Set-ADComputer –Identity SRV-MAN01 –Location "Spb/Russia"
Также можно изменить значение любого атрибута с помощью параметров
Add
,
Replace
,
Clear
и
Remove
.
Задать новое описание учетной записи компьютера:
Set-ADComputer -Identity SRV-MAN01 -Add @{"description"="Сервер управления инфраструктурой"}
Если нужно задать несколько параметров компьютера, воспользуйтесь такой конструкцией PowerShell:
$Server = Get-ADComputer -Identity SRV-MAN01
$Server.company = "contoso"
$Server.department = "IT"
Set-ADComputer -Instance $Server
С помощью Get-ADComputer можно получить текущие значения атрибутов:
Get-ADComputer SRV-MAN01 -properties *|select-object dNSHostName,operatingSystem,company,department, description
Теперь вы можете выбрать все компьютеры в AD, которые относятся к департаменту IT компании Contoso:
Get-ADComputer -Filter {(company -eq 'contoso') -and (department -eq "IT")} -properties *|select-object dNSHostName,operatingSystem,company,department,description | ft
С помощью Set-ADComputer вы также можете отключить или включить учетную запись компьютера в AD:
Set-ADComputer srv-man01 -Enabled $false
Как добавить имя пользователя и IP адрес в свойства компьютера в AD?
Вы можете автоматизировать добавление в свойства компьютера определенной информации. Например, вы хотите, чтобы в атрибутах компьютера в AD был указан его текущий IP адрес и имя последнего залогиненого пользователя.
IP адрес компьютера мы будем хранить в атрибуте description, а имя пользователя, который работает за компьютером – в атрибуте ManagedBy.
Делегируйте права группе Domain Users на OU с компьютерами на изменение значений в полях объектов типа Computer: ManagedBy и description (Write Description + Write Managed By).
Теперь создайте новую GPO со следующим 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. Для работы скрипта на компьютерах должен быть установлен модуль AD PowerShell.
В консоли 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. В статье по ссылке описано как записать в описание компьютера в 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 (Описание) и видим симпатичный результат