Hallo,
ich habe folgendes Skript gebastelt. Leider funktioniert es nicht richtig. Wenn eine neue Datei auftaucht, bekomme ich folgende Fehlermeldung: 2025-11-21 07:39:08 [INFO] Neue Datei erkannt:
2025-11-21 07:39:14 [ERROR] FEHLER bei Verarbeitung von - Ausnahme beim Aufrufen von ".ctor" mit 1 Argument(en): "Der Wert darf nicht NULL sein.
Parametername: cert"
Leider kann ich nicht sagen, wodurch der Fehler kommt.
Kann jemnad helfen?
Gruß
>>> Einstellungen <<<
$WatchPath = "\\192.168.102.130\certexpo\geant"
$LogFile = "\\192.168.102.130\certexpo\Logs\ZertImport.log"
# >>> Logging-Funktion <<<
function Write-Log {
param(
[string]$Message,
[string]$Level = "INFO"
)
$ts = Get-Date -Format "yyyy-MM-dd HH:mm:ss"
$line = "$ts [$Level] $Message"
Write-Host $line
Add-Content -Path $LogFile -Value $line
}
# >>> Exchange Online verbinden <<<
try {
if (-not (Get-Module -ListAvailable -Name ExchangeOnlineManagement)) {
Install-Module ExchangeOnlineManagement -Force
}
Import-Module ExchangeOnlineManagement
Connect-ExchangeOnline
Write-Log "Verbindung zu Exchange Online hergestellt."
}
catch {
Write-Log "FEHLER bei ExO-Anmeldung: $_" "ERROR"
throw
}
# >>> Ordnerüberwachung einrichten <<<
$watcher = New-Object System.IO.FileSystemWatcher
$watcher.Path = $WatchPath
$watcher.Filter = "*.pem"
$watcher.IncludeSubdirectories = $false
$watcher.EnableRaisingEvents = $true
# >>> Falls Event bereits existiert: deregistrieren <<<
Unregister-Event -SourceIdentifier "PemFileFound" -ErrorAction SilentlyContinue
# >>> Event-Handler registrieren <<<
Register-ObjectEvent $watcher Created -SourceIdentifier "PemFileFound" -Action {
$file = $Event.FullPath
Start-Sleep -Seconds 1
Write-Log "Neue Datei erkannt: $file"
# ===========================
# Desktop-Benachrichtigung
# ===========================
New-BurntToastNotification -Text "Neue Zertifikatsdatei erkannt", $file
# Warten, bis Datei nutzbar ist
for ($i = 1; $i -le 10; $i++) {
try {
$stream = [System.IO.File]::Open($file, "Open", "Read", "None")
if ($stream) { $stream.Close(); break }
}
catch { Start-Sleep -Milliseconds 500 }
}
try {
# Zertifikat laden
$cert = [System.Security.Cryptography.X509Certificates.X509Certificate2]::new($file)
# CN extrahieren und Umlaute korrigieren
$cn = $cert.Subject `
-replace '.*CN=([^,]+).*','$1' `
-replace 'oe','ö' `
-replace 'ae','ä' `
-replace 'ue','ü'
Write-Log "CN identifiziert: $cn"
# Zertifikat zuweisen
Set-Mailbox -Identity $cn -UserCertificate (,$cert.GetRawCertData())
Write-Log "Zertifikat erfolgreich zugewiesen."
# ===============================
# Datei nach "verarbeitet" verschieben
# ===============================
$ProcessedPath = "\\192.168.102.130\certexpo\verarbeitet"
if (!(Test-Path $ProcessedPath)) {
New-Item -ItemType Directory -Path $ProcessedPath | Out-Null
Write-Log "Zielordner angelegt: $ProcessedPath"
}
Move-Item -Path $file -Destination $ProcessedPath -Force
Write "Datei verschoben nach: $ProcessedPath"
}
catch {
Write-Log "FEHLER bei Verarbeitung von $file - $_" "ERROR"
}
```
}
Write-Log "Ordnerüberwachung aktiv. Skript läuft. Strg+C zum Beenden."
try {
while ($true) {
Wait-Event -Timeout 5 | Out-Null
}
}
finally {
Write-Host "Watcher wird beendet…"
Unregister-Event -SourceIdentifier "PemFileFound" -ErrorAction SilentlyContinue
$watcher.Dispose()
}
Hallo,
Fehler gefunden:
# >>> Event-Handler registrieren <<<
Register-ObjectEvent $watcher Created -SourceIdentifier "PemFileFound" -Action {$file = $Event.FullPath
Hier muss folgendes rein:
$file = $Event.SourceEventArgs.FullPath
Nur noch als Hinweis, dass die Verwendung von IP Adressen in UNC Pfaden automatisch NTLM Authentifizierung bedeutet. In Zeiten in denen man versucht davon wegzukommen, sollte man evtl. darauf achten, sich nicht selbst solche Stolperfallen einzurichten. ;)
Bis dann
Norbert