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