Збір інформації про робочі станції через Powershell.
- Get-ADComputer -filter * -SearchBase «OU=Computers,ou=some-OU,dc=some-dc,dc=ru»
- Where-Object {$_.enabled -eq $true}
- $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
- $dnsresult = [System.Net.Dns]::resolve(""$computername"")
- $ipaddress = $dnsresult.AddressList
- $pingfunc = (New-Object system.net.networkinformation.ping).send(""$ipaddress"")
- $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++}
Цей пост буде присвячений роботі написанню скриптів на 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 я тільки почав вивчати, якщо є ідеї щодо оптимізації, пишіть, обговоримо.
