среда, 30 июля 2008 г.

Скрипт power shell, определюящий запущена ли служба ntpd на удаленных компьютерах

#### Функция определения максимальной длины имени компьютера
function get_max_length($computers){
$max_length=0
[string] $name=""
foreach ($computer in $computers) {
$name=$computer.Name
if ($name.length -gt $max_length) {
$max_length=$name.length
}
}
$max_length
}
############################################################

### Функция, формирующая строку из пробелов количеством $spc
function add_spaces($spc) {
$spaces=''
if ($spc -gt 0) {
for ($i=1; $i -le $spc; $i++) {
$spaces=$spaces+' '
}
}
$spaces
}
############################################################

Clear-Host #Очистка окна вывода
$out_exp="Write-Host " #Переменная, определяющая тип вывода результата работы скрипта
$local_pc=Get-WmiObject -Class Win32_ComputerSystem
$cred=Get-Credential #Получение авторизационных параметров
$pc_list=Get-QADComputer #Получение списка компьютеров в домене

##### Формирование заголовка таблицы #######################
$num_spaces=get_max_length($pc_list)
$num_spaces1=$num_spaces-13
$table_hdr=' "Computer Name'+(add_spaces($num_spaces1))+' IP Address NTPD Status"'
$res_hdr=$out_exp+$table_hdr
Invoke-Expression $res_hdr
############################################################

foreach ($pc in $pc_list) {
#Проверим с помощью ping, подключен ли компьютер к сети
$ping = Get-WmiObject -Class Win32_PingStatus -Filter "Address='$($pc.Name)'"
if ($ping.StatusCode -ne 0)
{
#Компьтер не доступен по ICMP
Write-Host -ForegroundColor Red "$($pc.name) - Not Reachable via ICMP!"
}
else {
#Если компьютер доступен по ICMP, проверим - запущен ли на нем сервис RCP
if ($local_pc.Name -eq $pc.Name) {
#Если локальный ПК, то -Credential использовать нельзя
$pc_role="Local PC"
#$exp - строковое значение команды Get-WmiOnject
$exp='Get-WmiObject -Class Win32_Service -ComputerName $pc.Name -Filter "name='+"'rpcss'"+'" -ErrorAction SilentlyContinue'
$exp_ip='Get-WmiObject -Class Win32_NetworkAdapterConfiguration -ComputerName $pc.Name'
$exp_ntpd='Get-WmiObject -Class Win32_Service -ComputerName $pc.Name -Filter "name='+"'NetworkTimeProtocol'"+'" -ErrorAction SilentlyContinue'
}
else {
$pc_role=$pc.ComputerRole
$exp='Get-WmiObject -Class Win32_Service -ComputerName $pc.Name -Credential $cred -Filter "name='+"'rpcss'"+'" -ErrorAction SilentlyContinue'
$exp_ip='Get-WmiObject -Class Win32_NetworkAdapterConfiguration -ComputerName $pc.Name -Credential $cred'
$exp_ntpd='Get-WmiObject -Class Win32_Service -ComputerName $pc.Name -Credential $cred -Filter "name='+"'NetworkTimeProtocol'"+'" -ErrorAction SilentlyContinue'
}
#Вызов команды PS как значения строковой переменной.
$result=Invoke-Expression $exp
if ($result.State -eq "Running") {
#Собственно здесь уже можно работать с объектами wmi.
#Write-Host "RPC Service Running on $($pc.Name). Computer Role is $($pc_role)"
#Формируем строку для выыода в таблицу
$dop_spc=$num_spaces-$pc.Name.Length
$name_row=' "'+$pc.Name+(add_spaces($dop_spc))
#Определение, запущена ли служба ntpd
$ntpd=Invoke-Expression $exp_ntpd
if ($ntpd.State -eq "Running") {
#Write-Host "NTPD is Running"
$ntpd_row=' RUN'
}
else {
#Write-Host -ForegroundColor Red "NTPD is NOT Running!"
$ntpd_row=' NOT'
}
#Определение IP адреса удаленного компьютера
$net_adapters=Invoke-Expression $exp_ip
foreach ($net_adapter in $net_adapters) {
if ($net_adapter.IPEnabled -eq $TRUE) {
#Write-Host $net_adapter.IPAddress
$dop_spc=14-$net_adapter.IPAddress[0].Length
$ip_row=$net_adapter.IPAddress+(add_spaces($dop_spc))
#Здесь нужно сформировать результирующую строку для вывода в таблицу
$result_row=$out_exp+$name_row+' '+$ip_row+$ntpd_row+'"'
Invoke-Expression $result_row
}
}
}
else {
Write-Host -ForegroundColor Red "RPC Service NOT Running on $($pc.Name)"
}

}
}

Комментариев нет: