Главная

Monday, 8 January 2018

Построение dashboard в PowerShell.

Всем привет.

Во времена, когда я писал серию постов о Powershell, мне попадалась информация о некоторых интересных командлетах и техниках PowerShell. Например так я писал вам как организовать сетевой сниффер с помощью Powershell.

Но вот другой автор Alexandra Varonis (или авторка?) сделал выдающееся открытие - PowerShell может быть самостоятельным средством защиты!

Основываясь на таком предположении автор сделал серию отличных публикаций о PowerShell. Настоятельно рекомендую их к прочтению.

Есть перевод материала на хабре, но там многие ссылки нерабочие.

Полигон автора был настроен на использование PowerShell в качестве инструмента мониторинга системы для отслеживания файлов, процессов и действий пользователей. Во время прочтения меня постоянно не покидало ощущение того что это новая версия механизма подписки на события, который существует еще со времен WSH. Сейчас известны 4 типа событий которые может обработать в PowerShell: Engine Events, Object events (.Net), CIM (PowerShell V3 only) и WMI events. Более подробно можно узнать про типы здесь
https://learn-powershell.net/2013/01/30/powershell-and-events-engine-events/

В полигоне непосредственно автор использует командлет Register-EngineEvent.  Командлет Register-EngineEvent создает подписку на события, создаваемые обработчиком Windows PowerShell и командлетом New-Event. Для задания события используйте параметр SourceIdentifier. Этот командлет позволяет подписаться на события, создаваемые командлетом New-Event. Эти события автоматически добавляются в очередь событий сеанса без оформления подписки. Однако создание подписки позволяет перенаправлять события, задавать действия для реагирования на них, а также отменять подписку. При возникновении события, для которого создана подписка, это событие добавляется в очередь событий сеанса. Чтобы получить события из очереди событий, используйте командлет Get-Event.

Пример создания подписки на событие обработчика Windows PowerShell на двух удаленных компьютерах:
С:\PS>$s = new-pssession -computername Server01, Server02
C:\PS> invoke-command -session $s { Register-EngineEvent -sourceIdentifier ([System.Management.Automation.PsEngineEvent]::Exiting) -forward }

Первая команда создает сеанс PSSession на каждом из удаленных компьютеров. Вторая команда использует командлет Invoke-Command для выполнения команды Register-EngineEvent в рамках удаленного сеанса. Для определения события команда Register-EngineEvent использует параметр SourceIdentifier. А для перенаправления событий из удаленного сеанса в локальный сеанс используется параметр Forward.

Возвращаемся к нашей защите. Действительно, автор к концу своего повествования собирает довольно внушительный скрипт который не только мониторит обращение к файлам с ограниченным доступом и расставляет приоритеты на них, но и весьма неплохо это отображает в графике. Т. е. на наших глазах создается бесплатный dashboard.

Работу мониторинга файлов я, лично, не тестировал, а вот его dashboard меня сегодня завлек. Его я и проверил, оказалось не так уж и сложно.
https://blogs.technet.microsoft.com/richard_macdonald/2009/04/28/charting-with-powershell/

Для этого надо иметь в своем распоряжении PowerShell v2.0 или выше, .NET Framework 3.5 и доинсталировать в систему Microsoft Chart Controls for Microsoft .NET Framework 3.5. После инсталяции создается файл описания Microsoft Chart Controls for Microsoft .NET Framework 3.5 формата psm1 который надо будет импортировать как Import-Module .\Charts1.psm1 -Force


А далее я поганял простые тесты для Chart-ов. Вот вам график показывающий температуру в Осло за период в виде графика. Масштабируемость графика поддерживается.

# Create simple dataset
$simpleDataset = @{
    "Microsoft" = 800
    "Apple" = 250
    "Google" = 400
    "RIM" = 10
}

# Create chart and show it
New-Chart -Dataset $simpleDataset | Show-Chart

# Disable next string if you don't use Proxy
(New-Object System.Net.WebClient).Proxy.Credentials = [System.Net.CredentialCache]::DefaultNetworkCredentials

# Create ordered hashmap
$osloTemperature = [ordered]@{}

# Request weather data for Oslo, and put into dataset
[xml]$weather = (Invoke-WebRequest -Uri http://www.yr.no/place/Norway/Oslo/Oslo/Oslo/varsel.xml).Content
$weather.weatherdata.forecast.tabular.time | foreach {
    $osloTemperature[$_.from] = $_.temperature.value
}

# Create chart, add dataset and show
New-Chart -Title "Temperature in Oslo" -XInterval 4 -YInterval 2 -Width 1200 |
    Add-ChartDataset -Dataset $osloTemperature -DatasetName "Temperature" -SeriesChartType Spline -OutVariable tempChart |
    Show-Chart

Нравится? Конечно, теперь мы можем многое. Следующие тесты показывают как легко можно создавать круговые цветные диаграммы. Мы их называем "пирогами для шефа".

# load the appropriate assemblies
[void][Reflection.Assembly]::LoadWithPartialName("System.Windows.Forms")
[void][Reflection.Assembly]::LoadWithPartialName("System.Windows.Forms.DataVisualization")

# create chart object
$Chart = New-object System.Windows.Forms.DataVisualization.Charting.Chart
$Chart.Width = 500
$Chart.Height = 400
$Chart.Left = 40
$Chart.Top = 30
# create a chartarea to draw on and add to chart
$ChartArea = New-Object System.Windows.Forms.DataVisualization.Charting.ChartArea
$Chart.ChartAreas.Add($ChartArea)
# add data to chart
$Cities = @{London=7556900; Berlin=3429900; Madrid=3213271; Rome=2726539; Paris=2188500}
[void]$Chart.Series.Add("Data")
$Chart.Series["Data"].Points.DataBindXY($Cities.Keys, $Cities.Values)
# display the chart on a form
$Chart.Anchor = [System.Windows.Forms.AnchorStyles]::Bottom -bor [System.Windows.Forms.AnchorStyles]::Right -bor
                [System.Windows.Forms.AnchorStyles]::Top -bor [System.Windows.Forms.AnchorStyles]::Left
$Form = New-Object Windows.Forms.Form
$Form.Text = "PowerShell Chart 1"
$Form.Width = 600
$Form.Height = 600
$Form.controls.add($Chart)
$Form.Add_Shown({$Form.Activate()})
$Form.ShowDialog()


#####################
# add title and axes labels
[void]$Chart.Titles.Add("Top 5 European Cities by Population")
$ChartArea.AxisX.Title = "European Cities"
$ChartArea.AxisY.Title = "Population"

# Find point with max/min values and change their colour
$maxValuePoint = $Chart.Series["Data"].Points.FindMaxByValue()
$maxValuePoint.Color = [System.Drawing.Color]::Red

$minValuePoint = $Chart.Series["Data"].Points.FindMinByValue()
$minValuePoint.Color = [System.Drawing.Color]::Green

# change chart area colour
$Chart.BackColor = [System.Drawing.Color]::Transparent
# make bars into 3d cylinders
$Chart.Series["Data"]["DrawingStyle"] = "Cylinder"
# display the chart on a form
$Form = New-Object Windows.Forms.Form
$Form.Text = "PowerShell Chart 2"
$Form.Width = 600
$Form.Height = 600
$Form.controls.add($Chart)
$Form.Add_Shown({$Form.Activate()})
$Form.ShowDialog()




####################
# add data to chart
$Processes = Get-Process | Sort-Object -Property WS | Select-Object Name,WS,ID -Last 5
$ProcNames = @(foreach($Proc in $Processes){$Proc.Name + "_" + $Proc.ID})
$WS = @(foreach($Proc in $Processes){$Proc.WS/1MB})

[void]$Chart.Titles.Clear()
[void]$Chart.Titles.Add("Top 5 processes by MB")
$ChartArea.AxisX.Title = "Process"
$ChartArea.AxisY.Title = "Working Set (MB)"
# [void]$Chart.Series.Add("Data")
$Chart.Series["Data"].Points.DataBindXY($ProcNames, $WS)
# display the chart on a form
$Form = New-Object Windows.Forms.Form
$Form.Text = "PowerShell Chart 3"
$Form.Width = 600
$Form.Height = 600
$Form.controls.add($Chart)
$Form.Add_Shown({$Form.Activate()})
$Form.ShowDialog()

######################
$Chart.Series["Data"].Sort([System.Windows.Forms.DataVisualization.Charting.PointSortOrder]::Descending, "Y")

$ChartArea.AxisX.Title = "Process"
$ChartArea.AxisY.Title = "Working Set (MB)"

# Find point with max/min values and change their colour
$maxValuePoint = $Chart.Series["Data"].Points.FindMaxByValue()
$maxValuePoint.Color = [System.Drawing.Color]::Red

$minValuePoint = $Chart.Series["Data"].Points.FindMinByValue()
$minValuePoint.Color = [System.Drawing.Color]::Green

# make bars into 3d cylinders
$Chart.Series["Data"]["DrawingStyle"] = "Cylinder"

# set chart type
$Chart.Series["Data"].ChartType = [System.Windows.Forms.DataVisualization.Charting.SeriesChartType]::Pie
# display the chart on a form
$Form = New-Object Windows.Forms.Form
$Form.Text = "PowerShell Chart 4"
$Form.Width = 600
$Form.Height = 600
$Form.controls.add($Chart)
$Form.Add_Shown({$Form.Activate()})
$Form.ShowDialog()

###################
# set chart options
$Chart.Series["Data"]["PieLabelStyle"] = "Outside"
$Chart.Series["Data"]["PieLineColor"] = "Black"
$Chart.Series["Data"]["PieDrawingStyle"] = "Concave"
($Chart.Series["Data"].Points.FindMaxByValue())["Exploded"] = $true
# display the chart on a form
$Form = New-Object Windows.Forms.Form
$Form.Text = "PowerShell Chart 5"
$Form.Width = 600
$Form.Height = 600
$Form.controls.add($Chart)
$Form.Add_Shown({$Form.Activate()})
$Form.ShowDialog()


Powershell рулит!

No comments:

Post a Comment

А что вы думаете по этому поводу?