Показаны сообщения с ярлыком powershell. Показать все сообщения
Показаны сообщения с ярлыком powershell. Показать все сообщения

суббота, 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



вторник, 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 г.

Мониторинг доступности виртуальных серверов 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
}