суббота, 30 января 2016 г.

Powershell The remote server returned an error: (401) Unauthorized

Если при get-запросе через Powershell и Invoke-Webrequest появляется ошибка "The remote server returned an error: (401) Unauthorized.", то необходимо использовать -UseDefaultCredentials.
В моем случае и это не помогло, сервер отвечал на запрос: данный браузер или операционная система не поддерживается. Помогло притвориться InternetExplorer через подмену UserAgent:

Invoke-WebRequest -Uri "http://site"-UseDefaultCredentials -UserAgent([Microsoft.PowerShell.Commands.PSUserAgent]::InternetExplorer)

воскресенье, 16 августа 2015 г.

Logoff user sessions from Citrix XenApp

<#
В связи с выпуском новой версии Citrix Xenapp 7.6 и Receiver 4.x перестал работать pagent, при помощи которого можно было делать logoff из всех сессий данного пользователя
Данный скрипт удаленно запускает на одной из виртуалок Citrix командлет и выполняет logoff
Ниже представлены различные способы logoff для версий Xenapp 6.5 и выше, а также для версии Xenapp 5.
#>

$client_sess65 = New-PSSession -ComputerName vm_65

Invoke-Command -session $client_sess65 {Add-PSSnapin Citrix*}

Invoke-Command -session $client_sess65 {Get-XASession | Select-Object -Property SessionID,AccountName,ServerName,State  | Where-Object { $_.AccountName -eq 'domain\username'} | Stop-XASession}

Remove-PSSession $client_sess65


#Для версии Xenapp 5
$client_sess50 = New-PSSession -ComputerName vm_50

Invoke-Command -session $client_sess50 {$farm = new-Object -com “MetaframeCOM.MetaframeFarm”}

Invoke-Command -session $client_sess50 {$farm.Initialize(1)}

$stop50 = Invoke-Command -session $client_sess50 {$farm.Sessions | Where-Object {$_.UserName -eq "username"} | foreach {$_.Logoff($_.SessionID)}}

Remove-PSSession $client_sess50



вторник, 14 июля 2015 г.

WebSphere MQ AMQ6090: MQM could not display the text for error

В WebSphere MQ можно просматривать состояние менеджера очередей через консоль. 
Для этого в командной строке нужно набрать
dspmq

Однако появляется ошибка AMQ6090: MQM could not display the text for error

Решение - создать переменную окружения MQS_FORCE_NTLANGID со значением 1033 (это английский). Либо можно поменять настройки профиля на English.

понедельник, 9 марта 2015 г.

вторник, 25 ноября 2014 г.

Мониторинг записей звонков системы ZOOM CallREC при помощи powershell и post-запроса

Существует ZOOM CallREC - система записи разговоров от Cisco.
Иногда с ней возникали проблемы:
1. Звонки переставали писаться.
2. Появлялись битые звонки, которые невозможно было прослушать.
Возникла задача мониторинга таких проблем.
Был доступ только к веб-интерфейсу ZOOM CallREC.
Необходим Powershell не ниже 3 версии.
Скрипт на Powershell отправляет post-запрос веб-серверу ZOOM CallREC, получает ответ, парсит его, результат присылает на почту.
Код скрипта:
#Скрипт делает post-запрос к веб-интерфейсу проверки записей звонков.
 
#Линк на страницу авторизации
$link2 = "http://1.1.1.1/callrec/loginAction.do"
 
#Делаем get-запрос по линку. Сохраняем сессию в переменной fb.
$r = Invoke-WebRequest $link2 -SessionVariable fb
 
#Определяем параметры авторизации для дальнейшей передачи методом post
$form = $r.Forms[1]
$form.Fields["login"] = "login"
$form.Fields["password"] = "password"
 
#Делаем из сохраненной сессии post-запрос по этому же линку, но уже с передачей логина и пароля. Аналогично можно сделать
#"http://1.1.1.1/callrec/loginAction.do?login=login&password=password"
$re = Invoke-WebRequest -Uri $link2 -WebSession $fb -Method Post -Body $form.Fields
 
#Из сохраненной сессии идем по линку со звонками. Но по дефолту всего 10 звонков
#$zz = Invoke-WebRequest -Uri "http://1.1.1.1/callrec/calldatatable" -WebSession $fb
 
#Нам нужно 500 звонков. Поэтому идем из сохранненной сессии сюда, дальше авторедирект наhttp://1.1.1.1/callrec/calldatatable
$xx = Invoke-WebRequest -Uri "http://1.1.1.1/callrec/filteroperation?countperpage=500" -WebSession $fb
 
#Получим ответ от post-запроса
$Text = $xx.Content
 
#Найдем все строки, содержащие getDayName(текущая дата), а затем в этих строках найдем строку вида "td>минус_один_или_два_часа_от_текущего:"
#Если нашли такую строку, значит за последние два часа звонки пишутся
$datestamp2 = get-date -format "\\(d','M','yyyy\\)"
$datestampfile = "getDayName" + $datestamp2
$parsedate = $Text.Split("r") | Select-String $datestampfile
 
$minus_one_hour = (get-date).AddHours(-1).ToString("%h")
$minus_two_hour = (get-date).AddHours(-2).ToString("%h")
$m1 = "td>" + $minus_one_hour + ":"
$m2 = "td>" + $minus_two_hour + ":"
 
$stringcalls1 = $parsedate | Select-String $m1
$stringcalls2 = $parsedate | Select-String $m2
 
#prehratWarning - значок звонка предупреждения. error - значок звонка битого. Посчитаем их количество.
$parsewarningcalls = $Text.Split(" ") | Select-String "prehratWarning"
$parsebadcalls     = $Text.Split(" ") | Select-String "error"
 
#Если количество звонков-предупреждений на 500 общего количества больше либо равно 4 - ошибка.
#Если количество битых звонков на 500 общего количества больше либо равно 4 - ошибка.
if( ($parsewarningcalls.Count -le 30) -And  ($parsebadcalls.Count -le 8) -And ($stringcalls1.Count -gt 0 -Or $stringcalls2.Count -gt 0) )
{
    $Subject = "Норма при проверке: запись звонков"
    $text5 = "Все в норме"
}
else
{
    $Subject = "Ошибка при проверке: запись звонков"
    $text5 = "`n Проверить по ссылке:http://1.1.1.1/callrec/"
}
 
 
if($parsewarningcalls.Count -gt 30)
  {  $text2 =  "`n Обнаружено более 30 звонков-предупреждений из 500 последних      `n" 
  }
else
  {  $text2 = "" }
 
if($parsebadcalls.Count -gt 8)
  {  $text3 = "`n Обнаружено более 8 битых звонков из 500 последних      `n"  }
else
  {  $text3 = "" }
 
 
if(($stringcalls1.Count -eq $NULL -And $stringcalls2.Count -eq $NULL) -Or ($stringcalls1.Count -eq 0 -And $stringcalls2.Count -eq 0) )
  {  $text1 = "`n Звонков не было в течение 2 часов, либо они не пишутся      `n"  }
else
  {  $text1 = "" }
 
 
$text4 = "`n Количество звонков-предупреждений: " + $parsewarningcalls.Count +
           "`n Количество битых звонков: " + $parsebadcalls.Count + "      `n"
 
#Отправим письмо
$EmailFrom =11@ss.ru”
$EmailTo =22@ss.ru”
 
$body = $text1 +$text2+$text3+$text4+$text5
 
$Encoding = [System.Text.Encoding]::UTF8
 $SmtpServer = “1.1.1.1”
[string]$Encoding="utf-8"
$messageParameters = @{                       
                               Encoding = [System.Text.Encoding]::GetEncoding($Encoding)
            }
 
Send-MailMessage @messageParameters -From $EmailFrom -To $EmailTo -SmtpServer $SmtpServer -Body $body -Subject $Subject 

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

Мониторинг служб Windows в SCOM

1) Необходимо создать группу серверов, на которых необходимо мониторить нужную службу. В меню Authoring, выделить Groups, нажать кнопку "Create new group".
2) Назвать группу осознанным именем, в management pack выбрать services.
3) Добавить необходимые сервера и создать группу.
4) В меню Authoring, выделить  Windows Service, нажать кнопку "Add Monitoring Wizard".
5) Выбрать Windows Service из меню
6) Дать осознанное название и выбрать "services" в management pack
7) Задать имя службы с нужного сервера и выбрать группу, которую создали ранее в Targeted group
8) Создать монитор. При желании остановить некритичную службу и проверить работу монитора (как правило срабатывает через 5-10 минут)

Мониторинг доступности виртуальных серверов Xen в Citrix provisioning console при помощи powershell

В Citrix provisioning console есть несколько виртуалок. Нужно мониторить доступность каждой из них.

Сделаем скрипт на powershell, причем его будем запускать удаленно, на удаленной машине.

На удаленной машине запустить powershell от имени администратора и выполнить команды:
get-service winrm - чтобы была запущена
Enable-PSRemoting –force

Далее подключим mcli для PVC:
В командной строке выполняем
32bits
“C:\Windows\Microsoft.NET\Framework\v2.0.50727\installutil.exe” “C:\Program Files\Citrix\Provisioning Services Console\McliPSSnapIn.dll”
64bits:
“C:\Windows\Microsoft.NET\Framework64\v2.0.50727\installutil.exe” “C:\Program Files\Citrix\Provisioning Services Console\McliPSSnapIn.dll”

Проверим, что связка powershell - Citrix provisioning console работает:

Добавим
Add-PSSnapin -Name McliPSSnapIn

Теперь команда, которая проверяет статус сервера в Citrix provisioning console (1 - активен, 0 - неактивен)
mcli-Get DeviceInfo -p deviceName=name_of_your_host -f active

Далее создаем скрипт на нашей машине (создаем сессию, выполняем проверку, завершаем сессию).

$client_sess = New-PSSession -ComputerName name_of_my_remote_pc

Invoke-Command -session $client_sess {Add-PSSnapin -Name McliPSSnapIn}

$res = Invoke-Command -session $client_sess {mcli-Get DeviceInfo -p deviceName=name_of_your_host -f active}

Remove-PSSession $client_sess



Теперь полный скрипт:
В файле Servers.txt находится список серверов, которые мы должны мониторить в Citrix provisioning console. В каждой строке один сервер. Пробегаем каждый сервер в файле и в Citrix
provisioning console, если все доступны, то высылаем письмо на почту, что все ок, иначе - шлем письмо с ошибкой.

$EmailFrom = “from@yourmail”
$EmailTo = “to@yourmail”

$Encoding = [System.Text.Encoding]::UTF8
$SmtpServer = “10.x.x.x”
 [string]$Encoding="utf-8"
 $messageParameters = @{                      
Encoding = [System.Text.Encoding]::GetEncoding($Encoding)
            }

$client_sess = New-PSSession -ComputerName name_of_my_remote_pc
Invoke-Command -session $client_sess {Add-PSSnapin -Name McliPSSnapIn}

$count = 0
$f = "C:\Servers.txt"
$file = get-content $f
$sum_str = $file.length
$xx = ""
$text = ""

for ($i = 0; $i -le ($sum_str - 1); $i++) {
        $xx = $file[$i]

$res = Invoke-Command -session $client_sess -scriptblock { param($xx)  mcli-Get DeviceInfo -p deviceName=$xx -f active} -ArgumentList $xx

    if($res -match "active: 1") {
$text += "Норма: сервер " +$file[$i]+ " активен " +"`n"
    }
    else {
     $count ++
     $text += "Ошибка: сервер " +$file[$i]+ " неактивен " +"`n"
    }
}

if($count -eq 0)
{
    $Subject = "Проверка Citrix Provisioning - норма"
}
else
{
    $Subject = "Проверка Citrix Provisioning - ошибка"
}

Remove-PSSession $client_sess

Try
{
    get-content -Path $f -ErrorAction Stop
    Send-MailMessage @messageParameters -From $EmailFrom -To $EmailTo -SmtpServer $SmtpServer -Body $text -Subject $Subject
}
Catch
{
    $Subject = "Проверка Citrix Provisioning - ошибка"
    $text += "`n `n"+"Что-то не так"
Send-MailMessage @messageParameters -From $EmailFrom -To $EmailTo -SmtpServer $SmtpServer -Body $text -Subject $Subject
    Break
}