понедельник, 28 июля 2008 г.

Инструментарий Windows Power Shell

Собственно, что такое Windows Power Shell можно прочитать здесь:

Энн Грабб. Широкие возможности PowerShell

Да и с помощью гуглинга можно "нарыть" достаточно дополнительной инфы.
Здесь же я буду отмечать только то, что выполнялось мной в повседневной работе. Так сказать "Записки на полях".

Сразу порекомендую два дополнительных (бесплатных!) продукта от компании quest:
PowerGUI и Management Shell for Active Directory.

Собственно пока и все. Продолжение следует

----
Получение списка компьютеров в домене
$collection=Get-QADComputer
foreach ($item in $collection) {
[string] $var=$item.computername
$var.Remove($var.Length-1,1)
}
Прим. Get-QADComputer - функция из Management Shell for Active Directory

---
Получение IP адресов компьютеров домене
$collection=Get-QADComputer
foreach ($item in $collection) {
[string] $var=$item.computername
$var=$var.Remove($var.Length-1,1)
$net=Get-WmiObject -Class Win32_NetworkAdapterConfiguration -ComputerName $var -Filter IPEnabled=True
foreach ($ip in $net) {
Write-Host $var, $ip.IPAddress
}
}
В данном случае не обрабатывается ситуация, когда запрашиваемый с помощью объекта WMI компьютер выключен, или не подключен к сети. В такой ситуации выдается сообщение об ошибке:
Сервер RPC недоступен. (Исключение из HRESULT: 0x800706BA)
В строке 5, позиция 21
$net=Get-WmiObject -Class Win32_NetworkAdapterConfiguration -ComputerName $var -Filter IPEnabled=True

Для отключения сообщений об ошибках необходимо использовать параметр -ErrorAction SilentlyContinume для Get-WMIObject.

Вот пример подобного скрипта

Аналогично я переписал вот такой вот скрипт:
Clear-Host #Очистка окна вывода
$cred=Get-Credential #Получение авторизационных параметров
$pc_list=Get-QADComputer #Получение списка компьютеров в домене
foreach ($pc in $pc_list) {
#Проверим с помощью ping, подключен ли компьютер к сети
ping.exe $pc.Name -n 1 | Out-Null
if ($LASTEXITCODE -ne 0)
{
#Компьтер не доступен по ICMP
Write-Host -ForegroundColor Red "$($pc.name) - Not Reachable via ICMP!"
}
else {
#Если компьютер доступен по ICMP, проверим - запущен ли на нем сервис ICMP
$result=Get-WmiObject -Class Win32_Service -ComputerName $pc.Name -Credential $cred `
-Filter "name='rpcss'" -ErrorAction SilentlyContinue
if ($result.State -eq "Running") {
Write-Host "RPC Service Running on $($pc.Name)"
}
else {
Write-Host -ForegroundColor Red "RPC Service NOT Running on $($pc.Name)"
}

}
}

Все, в принципе работает, но нервирует постоянное открытие окна командной строки! С помощью "гуглинга" нашел следующую статью.
И, пользуясь рекомендациями переписал скрипт:


Clear-Host #Очистка окна вывода
$cred=Get-Credential #Получение авторизационных параметров
$pc_list=Get-QADComputer #Получение списка компьютеров в домене
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, проверим - запущен ли на нем сервис ICMP
$result=Get-WmiObject -Class Win32_Service -ComputerName $pc.Name -Credential $cred `
-Filter "name='rpcss'" -ErrorAction SilentlyContinue
if ($result.State -eq "Running") {
Write-Host "RPC Service Running on $($pc.Name)"
}
else {
Write-Host -ForegroundColor Red "RPC Service NOT Running on $($pc.Name)"
}

}
}


Использование строковой переменной, в качестве команды PowerShell
Для этих целей используется команда Invoke-Expression, например:
Clear-Host
$proc="explorer"
$exp='Get-Process $proc'
$result=Invoke-Expression $exp


Достает длинный тайм-аут при запросе удаленных ПК, на которых не активна RPC.
По этому поводу читаем тут :-(








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