Powershell – monitorování běžících služeb varianta .NET
Na základě komentáře jsem skript upravil, aby využíval přístup k databázi pomocí .NET místo ADO. Jedná se o nejjednodušší variantu, která není úplně “čistá” z pohledu zápisu do databáze, ale je snadná na pochopení a naprogramování. Vhodnější by bylo pro zápis do databáze použít parametrizovaný dotaz, který vyloučí útok přes SQL Injection a zajistí správné převody datových typů.
# Výpis na obrazovku
Write-Host 'START'
# Připojení k databázi
$cnn = New-Object System.Data.OleDb.OleDbConnection 'Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\Users\stepanb\Documents\Dema\PowerShell\Databáze\services.accdb'
# Dotaz do databáze
$cmd = New-Object System.Data.OleDb.OleDbCommand
# Práce s objekty, pomocí znaku . (tečka) ce dostanete k metodám a vlastnostem objektu
$cmd.Connection = $cnn
# Získání seznamu počítačů
$cmd.CommandText = 'SELECT ID, ComputerName FROM Computers WHERE Active = true'
# Vytvoření proměnné, zde konkrétně asociativního pole (hastable)
$computerList = @{}
# Otevření databáze
$cnn.Open()
$rst = $cmd.ExecuteReader()
while($rst.Read())
{
# Pomocí hranatých závorek se přistupuje k položkám pole nebo asociativního pole
$computerList[$rst['ID']] = $rst['ComputerName'].ToString()
}
# Uzavření přístupu k seznamu počítačů
$rst.Close()
$cmd.CommandText = 'INSERT INTO Services ([TimeStamp], [ServiceName], [State], [Status], [StartMode], [ComputerName]) VALUES (?, ?, ?, ?, ?, ?)'
foreach($computerID in $computerList.Keys)
{
# Vypsání informace na obrazovku
$computerList[$computerID]
# CMDlet Get-WmiObject zpřístupňje WMI, na cílových počítačích musí být povolen vzdálený přístup k WMI
$services = Get-WmiObject win32_service -ComputerName $computerList[$computerID]
foreach($service in $services)
{
# Nejjednodušší, ale i nejrizikovější varianta vytvoření SQL dotazu. Lepší by bylo vytvořit parametrizovaný dotaz.
$cmd.CommandText = [System.String]::Format("INSERT INTO Services ([ServiceName], [State], [Status], [StartMode], [ComputerName]) VALUES ('{0}', '{1}', '{2}', '{3}', {4})", $service.Name, $service.State, $service.Status, $service.StartMode, $computerID)
$rows = $cmd.ExecuteNonQuery()
}
}
$cnn.Close()
Write-Host 'END'
Štěpán