Начал разбираться с powershell.
Стоит задача заполнить в AD в учетках компов поле description, которое должно содержать Display Name текущего залогиненного пользователя.
Знаю что есть 2 способа:
1. Это груповой политикой на логон и логофф пользователя.
2. По расписанию запускать скрипт который опросит все машины в контейнере
Первый вариант отбросил из за того что группе domain users прийдется делегировать права разрешающие вносить изменения в поле description. Не хотелось бы расширять юзерам права. Больше склоняюсь к тому что чем меньше прав у юзера тем меньше проблем у меня.
Второй вариант. Написал скрипт на PS.
cls
Import-Module ActiveDirectory
$comps = Get-ADComputer -filter {enabled -eq $true} -SearchBase "OU=computers,ou=Локация 1,dc=РОГА,dc=Копыта,dc=ru" | Select-Object -property "Name","Description"
$comps | ForEach-Object {
if (Test-Connection -ComputerName $_.name -Quiet) {
$curentuser = (get-wmiobject Win32_ComputerSystem -ComputerName $_.name).UserName
if ($curentuser -ne $NULL) {
$curentusername = Get-ADUser $curentuser.Split("\")[1] | select -ExpandProperty Name
$curenthostdescription = Get-ADComputer $_.name -Properties description | select -ExpandProperty description
if ($curenthostdescription -ne $curentusername) {
Set-ADComputer $_.name -Description "$curentusername"
Write-Host "Описание компьютера",$_.name,":",$curenthostdescription,"было изменено на",$curentusername
Clear-Variable -Name curentuser
Clear-Variable -Name curentusername
Clear-Variable -Name curenthostdescription
}
}
else {Write-Host $_.name " - Проблема со считыванием текущего пользователя"}
} else {Write-Host $_.name " - Компьютер выключен"}
}
Есть несколько вопросов:
1. При выполнении скрипта появляется ошибка вида:
Select-Object : Cannot process argument because the value of argument "obj" is null. Change the value of argument "obj" to a non-null value.
At C:\Users\uvinv\AppData\Local\Temp\5e8ab969-4c0d-40a9-9aa7-ea268e8e7921.ps1:10 char:85
+ $curenthostdescription = Get-ADComputer $_.name -Properties description | select <<<< -ExpandProperty description
+ CategoryInfo : InvalidArgument: (:) [Select-Object], PSArgumentNullException
+ FullyQualifiedErrorId : ArgumentNull,Microsoft.PowerShell.Commands.SelectObjectCommand
Я так понимаю ошибка из за того что поле description пустое. Хотелось бы узнать как решить эту проблему
2. На некоторых компьютерах (get-wmiobject Win32_ComputerSystem -ComputerName host).UserName. Возвращает пустое значение хотя на компьютере залогинен пользователь. Не понимаю с чем это связано.
3.Хотел услышать в целом критику и предложения по скрипту что можно оптимизировать. И в целом стоит ли такие задачи решать на PS, т.к. скрипт впринципе выполняется довольно долго. Может быть я изобрел велосипед и есть бест практикс по такому вопросу.
Заранее спасибо за внимание :)