Командлет 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.
или вы о чем-то другом?