четверг, 31 июля 2008 г.

Написал функцию PowerShell для разбора аргументов командной строки

### Функция разбора параметров командной строки
### На входе $arguments - массив параметров командной строки
### На выходе коллекция - "Команда","Аргумент команды"
### Формат параметров командной строки /Command='Parameter'
##############################################################

function parse_params($arguments) {
$out=@{}
foreach ($arg in $arguments) {
[string] $str_to_parse=$arg
$splited_str=$str_to_parse.Split('=')
if ($splited_str.Length -gt 2) {
Write-Host "В параметре команды присутствует знак '='! Значение параметра после этого знака будет отброшено!"
}
else {
#Если указан признак команды '/' - обрабатывать
if ($splited_str[0].Contains('/') -eq $TRUE) {
if ($splited_str.Length -eq 1) {
$out.add($splited_str[0],'') #Если команда указана без параметра
}
else {
$out.add($splited_str[0],$splited_str[1])
}
}
}
}
return $out
}

Передача параметров в скрипт PowerShell

Параметры командной строки сохраняются в массиве $args[]
Например при вызове: powershell.exe c:\myscript.ps1 -a:arg1 -b:arg2 -c:arg3
В массиве будет: args[0]="-a:arg1", args[1]="-b:arg2", args[2]="-c:arg3"
Сам массив можно разбирать с помощью, например foreach:

foreach ($arg in $args) {
Write-Host $arg
}

Замечание: При вызове, например с таким параметром: /path:"path to file"
Получится:
args[0]=/path:path
args[1]=to
args[2]=file

А при вызове /path:'path to file'
args[0]=/path:path to file

среда, 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)"
}

}
}

понедельник, 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.
По этому поводу читаем тут :-(








четверг, 24 июля 2008 г.

Давно не было музычки


Вот. Накопал чудесный саунд от "The Republic Tigers", альбом "Keep Color" (2008).
Душевно, хороший музычка.

Интересная книжица

Стансислав Гроф "Духовный кризис: Когда преобразование личности становится кризисом"

Аннотация:
Сегодня все большее число людей, вовлеченных в процесс личностной трансформации, испытывает эпизоды духовного кризиса, когда процесс духовного роста и перемен становится хаотическим и захлестывающим. В этой антологии выдающиеся психологи, психиатры и духовные учителя задаются вопросом о природе духовного кризиса, о связи между духовностью, безумием и целостностью. В каких формах проявляется духовный кризис? Какие надежды и разочарования внутренне присущи духовной практике? Чем друзья, семья и профессионалы могут помочь людям, находящимся в духовном кризисе?

Лежит здесь

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

Навеяло

Даже если над твоей головой пасмурное небо, Солнце все равно для тебя светит. Смотри на него своим сердцем.
Не знаю, то ли сам придумал, то ли где-то из памяти вытащил.

Замечательная музычка

Канадский вокалист, композитор и музыкант - Кэвин Джеймс Лабри (Kevin James LaBrie), родившийся в 1963 году в Онтарио со школьных годов начал музицировать для собственного удовольствия. В десять лет он уже вместе со своим отцом, братом и дядей играл на барабанах в парикмахерской (!). В подростковом возрасте Лабри выбрал для себя направление рок-музыки, участвовал в нескольких группах. Позже, набравшись опыта и посещая уроки вокала, записав два альбома с канадскими группами, он становиться вокалистом Нью-Йоркской группы Dream Theater. Первый альбом с которой он записывает в 1992 году. В 2008 году выходит новый сольный альбом - «Prime Cuts». Рекомендую любителям красивого классического рока.

Хорошо сказано

Однажды одного чемпиона мира по бильярду попросили объяснить причину его успеха и, почему никто не может у него выиграть. Тот ответил: «Все очень просто. Пока другие играют со мной, я в это время играю в бильярд».

пятница, 11 июля 2008 г.

Еще олдырей


"Object 47" - 11 по счету и самый свежий (2008) альбом от британских нью-вэйверов Wire.
И свежо, и дух New-Wave присутствует.
Рекомендую!