Збір інформації про робочих станціях через 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 "\\$ipaddress\C$\Program Files (x86)\Google\Chrome\Application\chrome.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="" 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 \\$ipaddress\C$\Program Files (x86)\Google\Chrome\Application\chrome.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 я тільки почав вивчати, якщо є ідеї по оптимізації, пишіть, обговоримо.

Джерело: Хабрахабр

0 коментарів

Тільки зареєстровані та авторизовані користувачі можуть залишати коментарі.