А АSaturday, 21 December 2019

Поле Description объекта в AD.

Всем привет.

В какой то момент времени администратор AD понимает что ему надо видеть всю картину по хостам и пользователям в своем домене. А в каждом объекте есть такое замечательное поле как "Описание" (Description), которое пустует. Ну не заполнять же его каждый раз вручную. А с учетом того что оно в оснастке управления "Пользователи и Компьютеры в AD"  отображается по умолчанию неплохо бы в него записать кто последним входил на хост, когда и с каким IP-адресом. Точно также можно записать и для пользователя куда он логинился последний раз и когда. Вариантов реализации много, самый популярный это, разумеется, с помощью скрипта Powershell.

Вариант №1.
Вот простой вариант, который попадается в сети первым. Имейте ввиду что скрипт выбирает IP-адреса всех активных сетевых адаптеров, и если вывод не фильтровать предварительно, то в итог попадет только последний. Если вас это не устраивает то полученные адреса можно "распихивать" по атрибутам объекта. Ниже пример с targetAddress.

# Добавляем информацию о пользователе в свойства компьютеров AD
# http://winitpro.ru/index.php/2019/08/13/set-adcomputer-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"

$Date = Get-Date -Format G

$IPaddress = Get-WmiObject Win32_NetworkAdapterConfiguration | Where-Object {$_.IPaddress -like "192.*"}
$IPadr = $IPaddress.IPAddress
$Macadr = $IPaddress.MACaddress

$Desc = $Date + ',' + $LastLoginUserName + ',' + $IPadr + ',' + $Macadr

$CurrentADComputerObject.Put("Description","$Desc")
$CurrentADComputerObject.Put("targetAddress","$IPadr")
$CurrentADComputerObject.SetInfo()

И его запуск:
%windir%\System32\WindowsPowerShell\v1.0\powershell.exe
-Noninteractive -ExecutionPolicy Bypass -Noprofile -file %~dp0SetADInfo1.ps1



Вариант №2.
Более тяжеловесный вариант по количеству информации. Качество работы не оценивал.

$USERDNSDOMAIN = $env:USERDNSDOMAIN
$COMPUTERNAME = $env:COMPUTERNAME
$ObjectHash = @{}
$ObjectHash.UserName = $env:USERNAME
$ObjectHash.UserDomain = $USERDNSDOMAIN
$ObjectHash.DateTime = "{0:dd.MM.yyyy-HH:mm:ss}" -f $(Get-Date)
$ObjectHash.Console = ([Boolean]$((query.exe SESSION | findstr.exe ">console") -match $env:USERNAME)).ToString()
$ObjectHash.PSversion = $Host.Version.Major.ToString()
$ObjectHash.MACAddress = (Get-WmiObject Win32_NetworkAdapterConfiguration -Filter "IPEnabled = $True" | sort IPConnectionMetric | select -First 1).MACAddress
$ObjectHash.Memory = [string]$((Get-WmiObject CIM_PhysicalMemory | measure -Property Capacity -Sum).Sum/1GB)+"GB"
$ObjectHash.Processor = (Get-WmiObject Win32_Processor).Name
$ObjectHash.Battery = (Get-WmiObject Win32_Battery).DeviceID
$ObjectHash.BiosSN = (Get-WmiObject Win32_BIOS).SerialNumber
$ObjectHash.SystemManufacturer = (Get-WmiObject Win32_ComputerSystem).Manufacturer
$ObjectHash.SystemModel = (Get-WmiObject Win32_ComputerSystem).Model

$select = "UserName,UserDomain,DateTime,Console,PSversion,MACAddress,Memory,Processor,Battery,BiosSN,SystemManufacturer,SystemModel" -split ","

if([int]$Host.Version.Major -ge 3){
$Description = New-Object -TypeName PSCustomObject -Property $ObjectHash | select $select | ConvertTo-Json -Compress
} else {
    $Description = '{' + $(($select | % {'"'+"$($_)"+'"'+":"+'"'+"$($ObjectHash.$($_))"+'"'}) -join ",") + '}'
    }

if(!$Description){$Description = "Null"}

$DirectoryEntry = New-Object System.DirectoryServices.DirectoryEntry
$USERDNSDOMAIN_DN = $DirectoryEntry.distinguishedName

$Root = [ADSI]"LDAP://$USERDNSDOMAIN/$USERDNSDOMAIN_DN"
#$Root

$SearchPC = new-object System.DirectoryServices.DirectorySearcher($Root)
$SearchPC.Filter = "(&(objectClass=computer)(Name=$COMPUTERNAME))"
$Computer = [ADSI]$($SearchPC.FindOne().Path)
$Computer.put("Description",$Description)
$Computer.put("info",$Description)
# Если на любом этапе в скрипте возникла ошибка, не изменяем описание компьютера в AD
if($error.count -ge 1){exit}
# Если не было ни одной ошибки, изменяем описание компьютера в AD
#$Description
$Computer.SetInfo()
exit

Вариант №3.

Также легко работает вариант через Visual Basic Script.
Сам скрипт login_desc.vbs может выглядеть так:

On Error Resume Next
Set objSysInfo = CreateObject("ADSystemInfo")
Set objUser = GetObject("LDAP://" & objSysInfo.UserName)
Set objComputer = GetObject("LDAP://" & objSysInfo.ComputerName)
Set WshNetwork = WScript.CreateObject("WScript.Network")

dim NIC1
Set NIC1 = GetObject("winmgmts:").InstancesOf("Win32_NetworkAdapterConfiguration")
For Each Nic in NIC1
if Nic.IPEnabled then
StrIP = Nic.IPAddress(i)
StrMAC = Nic.MACAddress(i)
Exit For
end if
next

objComputer.Description =  "In:" + objUser.sAMAccountName + "/" + cstr(now)+ "/" + StrIP + "/" + StrMAC
objUser.Description = "In:" + objComputer.CN + "/" + cstr(now)+ "/" + StrIP + "/" + StrMAC

objComputer.SetInfo
objUser.SetInfo

Его запуск:
cscript.exe
//b //NoLogo login_desc.vbs

Вешаем скрипт в политику на логин пользователя и получаем в "Описание" юзера следующее:
Login:BHPC09/17.12.2019 09:03:00/192.168.3.39/00:24:АА:A7:72:80
Этим же скриптом пишем данные и в "Описание" компьютера:
Login:Muskina.CV/17.12.2019 09:03:00/192.168.3.39/00:24:АА:A7:72:80
Довольно информативно, не находите?

Успехов.

No comments:

Post a Comment

А что вы думаете по этому поводу?

Версия на печать

Популярное