Port-Test ohne Ping per Powershell

Viele kennen das Cmdlet Test-Connection oder Test-NetConnection um Verbindungen zu testen. Dort kann per -TcpPort bzw. -Port kann auch ein Port geprüft werden. Allerdings wird in beiden Varianten ein Ping vorausgesandt.

Es kann aber sein, dass die „Internet Control Message Protocol (ICMP) Echo Requests“ zu denen auch Pings gehören, in Firewalls gesperrt ist. Trotzdem möchte man aber vielleicht den direkten Port testen.

Dabei hilft das unten stehende Skript:

$destination = "192.168.2.1"
$port ="443"

$connection = new-object Net.Sockets.TcpClient
try{
    $connection.Connect($destination, $port)
} catch {}
 
if($connection.Connected)
    {
        $connection.Close()
        $object = [pscustomobject] @{
                        IP = $destination
                        TCPPort = $port
                        Result = $True }
        Write-Output $object
    }
    else
    {
        $object = [pscustomobject] @{
                        IP = $destination
                        TCPPort = $port
                        Result = $False }
        Write-Output $object

    }
    Write-Host $msg

Powershell: Zip-Dateien erstellen und entpacken

In manchen Exporten werden viele Dateien erstellt. Zum Versand oder weiteren Ablage kann es sinnvoller sein diese zu bündeln. Im Skripting-Umfeld kann eine ZIP-Datei eine einfache Lösung sein.

Dafür kann der folgende Befehl genutzt werden:

Compress-Archive -Path 'C:\Quelle' -DestinationPath 'C:\Ablage\Dokumente.zip'

Dabei wird automatisch die optimale Kompression im Standard verwandt. Bei einer großen Anzahl an Daten kann dieses über das Argument „-CompressionLevel“ editiert werden:

  • NoCompression
  • Fastest
  • Optimal

Bei „Fastest“ wird schneller verschlüsselt aber auch die Zieldatei wird größer. Bei „NoCompresssion“ werden die Dateien nur zu einer zusammengefasst.

Mit „-Update“ können weitere Dateien einer vorhandenen ZIP-Datei hinzugefügt werden. Zum Beispiel könnte man so eine Monatsdatei erstellt werden.

Selbstverständlich gibt es auch einen Befehl zum entpacken:

Expand-Archive -LiteralPath 'C:\Ablage\Dokumente.zip' -DestinationPath 'C:\Zielordner'

Dabei wird die Zip-Datei an den definierten Zielordner entpackt.
Leider gibt es bei diesen Verfahren keine Möglichkeit die Zip-Datei mit einem Passwort zu schützen.

Zu den Commandlets gibt es natürlich Beschreibungen in den Microsoft Docs

Powershell: AD-Gruppen zweier Benutzer vergleichen

Manchmal benötigt man einen schnellen Vergleich über die AD-Gruppen zweier Benutzer-Accounts. Dieses kann einem im Fehlerfall schnell eine Idee für ein Problem identifizieren.

#Samaccountname der zu vergleichen
 
$user1 = "user1"
$user2 = "user2"
 
Compare-Object -ReferenceObject (Get-AdPrincipalGroupMembership $user1 | select name | sort-object -Property name) -DifferenceObject (Get-AdPrincipalGroupMembership $User2 | select name | sort-object -Property name) -property name -passthru |
 
ForEach-Object {
 
if ($_.SideIndicator -eq '=>') {
 
$_.SideIndicator = 'Group is not assigned to ' +$User1
 
} elseif ($_.SideIndicator -eq '<=') {
 
$_.SideIndicator = 'Group is not assigned to ' +$User2
 
}
 
$_
 
}

Es konnte sehr schnell die fehlende AD-Gruppe ermittelt werden. Manuell hätten dieses definitiv mehr Arbeitszeit gekostet.

AD: Existiert zum Nebenbenutzer noch ein Hauptbenutzer

In einigen Active Directory-Umgebungen gibt es neben dem Haupt-Benutzer auch Funktionsbenutzer für administrative Berechtigungen oder auch Software-Lösungen. Dabei kann es interessant sein, ob der Hauptaccount überhaupt existiert.

$Prefix_users = get-aduser -filter "samaccountname -like 'pre_*'"
 
Foreach ($u in $Prefix_users.samaccountname)
 
{
 
$query = $(try {get-aduser $u.split('_')[1]} catch {$null})
 
  if ($query -ne $null) {
 
  write-host $u " - "$u.split('_')[1]" - existiert"
 
  } else {
 
  write-host $u " - "$u.split('_')[1]" - existiert nicht"
 
  }
 
}

Die Darstellung des Status ist nur eine der vielen Möglichkeiten. Die Daten können selbstverständlich auch anders verarbeitet werden. Ein Möglichkeit wäre, den Hauptaccount als Manager des Nebenaccounts einzutragen.

Powershell: Ordner nach Dateinamen umbenennen

Ein Tweet einer Person, der ich bei Twitter folge, hatte die folgende Aufgabenstellung:

Kennt jemand ein Tool, mit dem man Ordner in Windows genauso benennen kann wie die Datei, die darin liegt, nur ohne Endung?
Bsp: Ordner heißt Data
Datei heisst 12.10.2020 File.mp3
Ordner soll also 12.10.2020 File heißen.

Das Ganze natürlich für viele Ordner auf einmal.

Ich wusste, dass ich so etwas ähnliches in meiner Skript-Sammlung habe.
Nach einer kurzen Anpassung sind die folgenden Code-Zeilen in Powershell entstanden:

$Folder = "E:\Startordner"
 
$items = get-childitem $Folder -Recurse | where { $_.GetType().Name -eq "FileInfo" }
 
foreach ($item in $items) 
{
$folder = $item.DirectoryName
$file= $item.BaseName
 
Rename-Item -path $folder -Newname $file
}

Es wird rekursiv durch $Folder benannten Ordner nach Dateien gesucht.
Der letzte Ordnername des Dateipfades wird nach dem Namen der Datei benannt.

PDF-Dateien aus Ordner über Powershell drucken

Im vergangenen Jahr musste ich regelmäßig Abrechnungen erstellen. Nicht zu jedem Zeitpunkt stand mir direkt ein Drucker zur Verfügung. Teilweise kam es dabei zu über 20 erforderlichen Ausdrucken. Entsprechend hatte ich auch keine Lust diese Ausdrucke manuell anzusteuern. Somit habe ich mir ein Skript zur automatischen Start der Ausdrucke erstellt.

#Definition des Ordners mit den Druck-Dateien
$Directory = "C:\PDFPrint\"
 
#STEP 1: Ermittle alle PDF-Dateien im Ordner
#STEP 2: Starte für jedes File den Print-Prozess
#STEP 3: Warte bitte 30 Sekunden zwischen den Ausdrucken
 
Get-ChildItem -path $Directory -recurse -include *.pdf | 
ForEach-Object {Start-Process -FilePath $_.fullname -Verb Print -PassThru |
%{sleep 30;$_} |
kill }
 
#STEP 4: Lösche die vorhandenen Dateien
Get-ChildItem -path $Directory -recurse -include *.pdf | Remove-Item -Force

Ich habe bei der Standard-Einstellung für PDF-Dateien die besten Erfahrungen bei der Nutzung des Adobe Readers gemacht. Der Ausdruck erfolgt bei dieser Methode über den Standard-Drucker. Ich berücksichtige auch eventuelle Unterordner im definierten Ordner.

Dieses Vorgehen konnte ich auch schon mit Word- und Excel-Dateien nachstellen.

Formatierung von Intune-Auditlog-Daten für Vergleiche

Im Regelfall können mehrere Administratoren auf die „Profile“ im Intune zugreifen und Änderungen vornehmen. Während einer Fehleranalyse kann es dabei sinnvoll sein, dass man sich die Veränderungen sichtbar macht. Im „Audit Log“ wird dargestellt, wann und wer Veränderungen am jeweiligen Objekt vorgenommen hat. Die Veränderung selber werden in einem Text-Format dargestellt, so dass die Werte „Property“, „New Value“ und „Old Value“ für jede Option untereinander dargestellt werden. Dieses ist für einen Vergleich etwas unhandlich.

Um dieses passend zu formatieren habe ich das folgende Skript mir geschrieben:

$Quelle = "C:\Intune_Profile_Activity_log\changelog.txt"
$Ziel = "C:\Intune_Profile_Activity_log\changelog_Merge.txt"
 
gcb > $Quelle
 
get-content $Quelle -readcount 3 | foreach  {$_ -join ";"} | out-file $Ziel
(Get-content $Ziel) -replace 'Property: ' | out-file $Ziel
(Get-content $Ziel) -replace 'Old Value: ' | out-file $Ziel
(Get-content $Ziel) -replace 'New Value: ' | out-file $Ziel

Die Daten werden direkt aus der Zwischenablage kopiert und verarbeitet. Somit werden die Daten per Semikolon getrennt in die Zieldatei geschrieben.