Сбор информации о рабочих станциях через Powershell

в 14:51, , рубрики: powershell, ит-инфраструктура, Написание скриптов, системное администрирование

Сбор информации о рабочих станциях через Powershell.

Этот пост будет посвящен работе написанию скриптов на Powershell. Далее я предполагаю, что читатель уже сталкивался с написанием скриптов в windows среде. Итак:

Была у меня задача собрать некоторую информацию по пользовательским рабочим станциям в организации. Все станции в AD и пользователи тоже, что упрощает задачу. Есть контейнер, где находятся все станции, значит нужно пройтись по всем, взяв интересующую информацию, и отобразить результат. Раз так, то пишем скрипт. При написании, я стараюсь делать скрипт по частям. ИМХО для меня так проще и понятнее.

1. Нужен список станций. Его легко можно взять из AD такой вот командой:

Get-ADComputer -filter * -SearchBase «OU=Computers,ou=some-OU,dc=some-dc,dc=ru»

Она выдаст все объекты из контейнера со всеми свойствами и т.п. Мне не нужны были все и я выбрал из них те, которые не выключены (Diasabled). Ставим в конвейер командлет

Where-Object {$_.enabled -eq $true}

который выберет обьекты, у которых свойство enable равно true, то есть они включены. Далее, мне не нужны все свойства каждого обьекта, так что я выберу только свойство Имя (Name), поставив в конвейер командлет

Select-Object -Property Name

Список еще пригодится, так что создадим из него массив $enablePCs. Конечная команда будет такой

$enablePCs = Get-ADComputer -filter * -SearchBase «OU=Computers,ou=ru-moscow,ou=cee,dc=alico,dc=corp» | Where-Object {$_.enabled -eq $true} | Select-Object -Property Name

Теперь, если набрать в консоли $enablePCs, то выводом будет список имен всех компов.

Далее, можно подумать, что с этим списком уже можно работать, но нет. Части этих компов давно нет, часть выключена. Значит, нужно обрабатывать сортировать список далее. Я пошел по следующему пути: Если имя рабочей станции не удается разрешить в ip адрес, значит, такой станции уже нет, если удается, то можно ее попинговать. Если не пингуется, то скорее всего станция выключена. Тем самым можно составить список активных на данный момент станций, чтобы не пытаться разговаривать со стеной обращаться к неактивным хостам. Для разрешения я использовал метод resolve для функции [System.net.dns]. Получилась вот такая строка:

$dnsresult = [System.Net.Dns]::resolve("$computername")

Про $computername будет написано далее. После, нужно извлечь собственно ip адрес из результата

$ipaddress = $dnsresult.AddressList

Далее проверяем адрес на доступность, используя стандартную системную функцию [system.net.networkinformation.ping] применяя к ней метод send. Команда следующая:

$pingfunc = (New-Object system.net.networkinformation.ping).send("$ipaddress")

Команда возвращает результат, и если его статус success, то рабочая станция доступна, и можно к ней обращаться. Тут уже на свой вкус, любые доступные действия в рамках ваших админских полномочий. Для примера покажу, как я проверял, на каких рабочих станциях установлен Chrome:

$chrome = dir "\$ipaddressC$Program Files (x86)GoogleChromeApplicationchrome.exe"
if ($chrome -ne $null) {write-host «Host $computername is reacheble, use Chrome, and have ip $ipaddress»
$sumchrome++}
else {write-host "$computername is reacheble, do not use Chrome, and have ip $ipaddress"
$pcwithoutchrome++}

Переменные $sumchrome и $pcwithoutchrome нужны для подсчета общего числа тех или иных станций. Теперь сначала посмотрим логику всего скрипта.

<img src="Сбор информации о рабочих станциях через Powershell - 1" alt=«image»/>

Теперь полный скрипт с комментариями.

$enablePCs = Get-ADComputer -filter * -SearchBase «OU=Computers,ou=someou,dc=somedomain,dc=corp» | Where-Object {$_.enabled -eq $true} | Select-Object -Property Name
$sumunresolvePC = 0
$sumchrome = 0
$sumreacheblePC = 0
$sumunreacheblePC = 0
$pcwithoutchrome = 0

foreach ( $i in $enablePCs ) #начинаем цикл обработки объектов в массиве $enablePCs
{
$error.Clear() #очищаем буфер ошибок Powershell
$erroractionpreference = «silentlycontinue» #подавляем вывод ошибок в консоль
$dnsresult = 0
$computername = $i.name #извлекаем имя станции
$dnsresult = [System.Net.Dns]::resolve("$computername")

if (!$error) #условие, если предыдущая команда не была завершена ошибкой
{
$ipaddress = $dnsresult.AddressList
$pingfunc = (New-Object system.net.networkinformation.ping).send("$ipaddress") #ping
if ($pingfunc.Status -eq «success»)
{
$sumreacheblepc++ #плюсуем обще количество доступных станций
$chrome = dir \$ipaddressC$Program Files (x86)GoogleChromeApplicationchrome.exe #проверка наличия Chrome
If ($chrome -ne $null) {write-host «Host $computername is reachable, use Chrome, and have ip $ipaddress»

$sumchrome++ #плюсуем количество станций с Chrome
}
else {
Write-host "$computername is reachable, do not use Chrome, and have ip $ipaddress"
$pcwithoutchrome++ #плюсуем количество станций без Chrome
}

}
else {
$sumunreacheblePC++ #плюсуем количество недоступных станций
Write-Host «Host $computername is unreachable now, and have ip $ipaddress»

}
}

else
{$sumunresolvePC++ #плюсуем количество неразрешенных станций
write " I cannot resolve $computername :("}
}
Write-Host «Total enabled PC = » $enablePCs.count
Write-Host «Total PC with Chrome = $sumchrome»
Write-Host «Total reachable PC = $sumreacheblePC»
Write-Host «Total Unreachable PC = $sumunreacheblePC»
Write-Host «Total PC Without Chrome = $pcwithoutchrome»
write-host «Total unresolved PC = $sumunresolvepc»

Ну вот и все. Проверку наличия Chrome я описал для примера. Туда же можно включить много проверок и прочих полезных вещей, которые нельзя прописать в logonscript. Сам powershell я только начал изучать, если есть идеи по оптимизации, пишите, обсудим.

Автор: sat3452

Источник


* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js