sirmank
Goto Top

Get-WMIObject hat keine Rückgabe als geplanter Task

Hallo zusammen,
ich habe vor ein Skript zu schreiben, dass die Fehlerhafte Mailfunktion eines Backupprogramms ersetzt und zusätzlich das Angeschlossene USB-Laufwerk ausliest auf dem das Backup gespeichert wurde.

Das Mailproblem habe ich bereits hier gelöst:
Send-Mailmessage schickt nicht aus geplantem Task

Das Skript funktioniert, wenn ich es direkt ausführe oder als geplanter Task mit der Option "Nur ausführen, wenn der Benutzer angemeldet ist". Nutze ich die Funktion "Unabhängig von Benutzeranmeldung", egal ob mit oder ohne gespeichertem Kennwort ist die Rückgabe von Get-WMIObject leer. Hat jemand eine Idee woran das liegt oder besser noch, wie ich die Laufwerke identifizieren kann?

Hier noch mal der aktuelle Code
$drives = (gwmi Win32_USBControllerDevice | % {[wmi]($_.Dependent)} | Where-Object {($_.Description -like '*massen*')}).deviceid     # Alle USB Massenspeicher IDs auslesen  
[array]$drives=$drives|%{     # Bekannte IDs in sprechende Namen ändern [array] sorgt dafür, dass auch ein einzelnes Laufwerk in einem Array landet
    switch($_){
        "USB\VID_1A5A&PID_0006\007820719538" {"RDX Laufwerk"}  
        "USB\VID_1058&PID_260D\575837324442314C37505343" {"WD My Passport"}  
        "USB\VID_04E8&PID_61FB\MSFT30S6YKNS0W200386Z" {"Montag"}  
        "USB\VID_04E8&PID_61FB\MSFT30S6YKNS0W200382V" {"Dienstag"}  
        "USB\VID_04E8&PID_61FB\MSFT30S6YKNS0W201056V" {"Mittwoch"}  
        "USB\VID_04E8&PID_61FB\MSFT30S6YKNS0W200367D" {"Donnerstag"}  
        "USB\VID_04E8&PID_61FB\MSFT30S6YKNS0W200414Y" {"Freitag1"}  
        "USB\VID_04E8&PID_61FB\MSFT30S6YKNS0W200439V" {"Freitag2"}  
        "USB\VID_04E8&PID_61FB\MSFT30S6YKNS0W200393A" {"Freitag3"}  
        "USB\VID_04E8&PID_61FB\MSFT30S6YKNS0W200438F" {"Freitag4"}  
        Default {"Unbekanter Datenträger: "+$_}  
        }
    }
if ((Get-Content C:\backup\auswertung-Sicherung.txt |Select-String -Pattern "Gesamt") -like "*Gesamtergebnis: OK*") {$status="OK"} else {$status="Fehler"}     # Status aus Textdatei auslesen  

$body="Sicherung`n`nFolgende USB Laufwerke sind angeschlossen`n`n"+ $drives[0] +"`n"+ $drives[1]+ "`n"+ $drives[2]+"`nStatus Datensicherung: $status"     # Body für die Mail erzeugen  

# Mail mit Mailkit erzeugen
Add-Type -Path "C:\Program Files\WindowsPowerShell\Modules\send-mailkitmessage\MailKit.dll"  
Add-Type -Path "C:\Program Files\WindowsPowerShell\Modules\send-mailkitmessage\MimeKit.dll"  
$SMTP     = New-Object MailKit.Net.Smtp.SmtpClient
$Builder  = New-Object MimeKit.BodyBuilder
$Message  = New-Object MimeKit.MimeMessage
$TextPart = New-Object MimeKit.TextPart("PLAIN")  
$SMTP.CheckCertificateRevocation=$false
$Message.From.Add("hyperv@ho.local")  
$Message.To.Add("servermeldungen@local.de")  
$Message.Subject = 'Backup MVZ HO'  
$Message.Body    = $TextPart
$Builder.TextBody=$body
$Builder.Attachments.Add("C:\backup\auswertung-Sicherung.txt")  
$Message.Body = $Builder.ToMessageBody()
$SMTP.Connect('exchange.ctc.local', 25, $False)  
$SMTP.Send($Message)
$SMTP.Disconnect($true)
$SMTP.Dispose()
# Mailkit Ende
 

Mit freundlichen Grüßen
SirMank

Content-ID: 43884705497

Url: https://administrator.de/contentid/43884705497

Ausgedruckt am: 21.11.2024 um 21:11 Uhr

7907292512
7907292512 23.10.2023 aktualisiert um 16:39:09 Uhr
Goto Top
Wie immer bei sowas, Logging ins Skript einbauen mittels Start-Transcript.
Des weiteren solltest du Get-WMIObject besser ersetzen durch Get-CimInstance
Get-WMIObject ist veraltet und ist auch erheblich langsamer beim Zugriff. Des weiteren ist für bestimmte Zugriffe teilweise der Parameter -EnableAllPrivileges nötig.

Du prüfst auch gar nicht ob $drives überhaupt Einträge hat usw. da fehlt sämtliches Error-Handling im Skript!

Im Task bitte auch als ausführendes Principal SYSTEM hinterlegen.

Uns fehlen hier btw. sämtliche Task-Einstellungen ...

Gruß Sid.
erikro
Lösung erikro 24.10.2023 um 09:15:44 Uhr
Goto Top
Moin,

ich vermute mal ein Sprachproblem. Du suchst in Deinem WHERE-Statement nach der Beschreibung "Massen". Das funktioniert so lange, solange die culture de-de ist. Ist es eine andere, dann funktioniert das nicht. Du solltest nach was anderem suchen z. B.

$_.Service -eq USBSTOR

Ich bin mir nicht sicher, ob das für Deinen Fall ok ist. Das Nachschlagen den geeigneten Attributs überlasse ich Dir. face-wink

hth

Erik
SirMank
SirMank 24.10.2023 um 09:40:56 Uhr
Goto Top
Danke Euch beiden,

@7907292512
Du hast natürlich Recht, dass überhaupt kein Error Handling vorhanden ist. Das Skript soll eigentlich nur die Zeit überbrücken, bis der Server der Übernommenen Praxis in unsere Umgebung intrigiert ist. (OK. Ich bin zu faul für ordentliches Error Handling)
Get-CimInstance werde ich mir aber noch mal anschauen.

@erikro
Das ist tatsächlich das Problem. Ich habe die Abfrage von einem Englisch Sprachigen Skript übernommen und sogar auf das Deutsche System angepasst, aber dass die Spracheinstellung natürlich nicht für "System" und scheinbar auch nicht für Benutzer mit oder ohne hinterlegtes Passwort gelten ist mir nicht mal in den Sinn gekommen. Vielen Dank für den Tipp.

Mit freundlichen Grüßen
SirMank