Где ошибка в коде PowerShell?

Начал разбираться с 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, т.к. скрипт впринципе выполняется довольно долго. Может быть я изобрел велосипед и есть бест практикс по такому вопросу.

Заранее спасибо за внимание :)
  • Вопрос задан
  • 600 просмотров
Пригласить эксперта
Ответы на вопрос 2
@yellowmew
Cloud infrastructure, monitoring engineer. SRE
по скрипту сейчас не скажу, завтра посмотрим, если еще актуально будет вам )
Вообще, имхо, правильнее на всех компьютерах создать задачу, привязанную к событию интерактивного входа в систему.
Для этого не нужно пользователям давать права : запись описания будет вестись от пользователя, чьи учетные данные указаны в скрипте.
Ну и, наверное, стоит мониторить не только входы но и выходы из системы, чтобы знать, какой пользователь последним пользовался компьютером и сломал его
Ответ написан
Так проще ж в логон скрипт добавить заполнение атрибута учетки и готово.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы