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.

.Net Framework-Unterst├╝tzung von TLS 1.2

Ich habe vor ein paar Jahren ein kleines Tool programmiert. In diesem wurde eine Webschnittstelle abgefragt. Bei einer Aktualisierung wurde nun die interne Schnittstelle ebenfalls auf TLS1.2 umgestellt.

Das .Net Framework unterst├╝tzt unterschiedlich das Protokoll:

  • .Net Framework 3.5: Keine direkte Unterst├╝tzung von TLS 1.2
    ├ťber KB3156421 vom 10. Mai 2016 wird diese in Windows 10 implementiert
  • .Net Framework 4.0: Keine native Unterst├╝tzung von TLS 1.2
    Wenn der Client allerdings .Net Framework 4.5 installiert hat, kann TLS 1.2 angesteuert werden:

    ServicePointManager.SecurityProtocol = (SecurityProtocolType)3072;
  • .Net Framework 4.5: Native Unterst├╝tzung von TLS 1.2
    Das Protokoll ist allerdings nicht als Standard gesetzt:

    ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12
  • .Net Framework 4.6: Native Unterst├╝tzung und Standard-Protokoll von TLS 1.2

Genauere Informationen gibt es in diesem Artikel.

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.