meta data for this page
Übersetzungen dieser Seite:
  • de-informal

Übung: Powershell-Anwenderwissen

Teil 1

Erstelle ein Powershell-Skript, welches

  1. zuerst den Computernamen, den Namen des aktuellen Benutzers und dessen Anmeldedomäne ausgibt.
  2. Anschließend sollen alle lokalen Benutzer und alle lokalen Gruppen zur Übersicht ausgegeben werden.
  3. Als letztes soll das Skript ermitteln, ob der aktuelle Benutzer Mitglied der Administratorengruppe ist und das Ergebnis ausgeben.

(siehe dazu auch Umgebungsvariablen ($env:) und Select)

Teil 2

Erstelle ein Powershell-Skript, welches in der Lage ist Veränderungen an Dateien in einem Verzeichnis anhand derer Hash-Werte zu erkennen.

  • Gehe von der Situation aus, dass ein Kollege dir bereits unfertige Skript-Teile dafür zur Verfügung stellt oder dass du solche aus dem Internet zusammenkopiert hast.
  • Das fertige Skript soll zusätzlich folgende Eigenschaften erfüllen:
    • Zu Beginn soll auswählbar sein, ob man Dateien sichern oder prüfen möchte.
    • Wenn ein Dateisystemobjekt zur Überwachung angegeben wurde, das nicht existiert oder kein Verzeichnis ist, dann soll das Skript abgebrochen werden.
  • Füge die unten bereitgestellten Code-Abschnitte zu einem funktionierenden Skript zusammen und nimm wo notwendig Anpassungen und Ergänzungen vor.
  • Teste dein Skript anschließend, indem du Dateien anlegst und anschließend auch veränderst.

Code-Abschnitt zur Überprüfung ob ein Ordner existiert

$path = Read-Host -Prompt "Pfad angeben"
if (-Not (Test-Path -Path $path))
{
    echo "$($path) existiert nicht. Abbruch.)"
    throw 'FileDoesNotExistError'
}
 
if (-Not ($(Get-Item -Path $path) -is [System.IO.DirectoryInfo]))
{
    echo "$(path) ist kein Verzeichnis. Abbruch"
    throw 'ISNoDirectoryError'
}
echo "OK"

Code-Abschnitt mit einer Funktion, welche überprüft, ob der Hashwert einer anzugebenen Datei in einer Liste (Ausgabe von Get-FileHash) mit Datei-Hash-Werten enthalten ist

function Check-Hash ($FilePath, $HashList)
{
    $matched = $false
    $HashList.ForEach({
        if ($FilePath -eq $_.Path)
        {
            $hash = Get-FileHash -Path $FilePath -Algorithm $_.Algorithm
            if ($hash.Hash -eq $_.Hash)
            {
                $matched = $true
            }
        }
    })
 
    return $matched
}

Code-Abschnitt mit dem Grundgerüst für das Skript

$action = Read-Host -Prompt "Möchten Sie sichern oder prüfen? (s/p)"
if ($action -eq "s")
{
    # Hash-Werte berechnen und sichern
}
elseif ($action -eq "p")
{
    # Hash-Werte laden und prüfen
}
else
{
    echo "Keine Auswahl getroffen. Abbruch."
}

Code-Abschnitt für das Sichern der Hash-Werte

$path = Read-Host "Welches Verzeichnis soll überwacht werden?"
 
$hashfile = Read-Host -Prompt "In welche Datei sollen die Hash-Werte geschrieben werden?"
 
$hashes = Get-ChildItem -Path $path | Get-FileHash -Algorithm SHA1
 
$hashes | Export-Csv -Path $hashfile

Code-Abschnitt für das Prüfen der Hash-Werte

$path = Read-Host -Prompt "Welches Verzeichnis soll geprüft werden?"
 
$hashfile = Read-Host -Prompt "Aus welcher Datei sollen die Hash-Werte gelesen werden?"
 
$hashlist = Import-Csv -Path $hashfile
 
$(Get-ChildItem -Path $path).ForEach({
    $unchanged = Check-Hash -FilePath $_.FullName -HashList $hashlist
    if (-Not $unchanged)
    {
        Write-Host "$($_.FullName) wurde verändert."
    }
})