Mario-HS 5 Geschrieben 20. Februar 2020 Melden Teilen Geschrieben 20. Februar 2020 Hallo allerseits und danke für die Aufnahme, folglich bin ich neu hier. Ich bin Fachinformatiker und beschäftige mich ab und an wenn es die Zeit zuläst mit der PS, also noch ehr Neuling. Zu meinem Problem. Wir haben etliche HyperV-Hosts im Einsatz und auch HA-Lösungen. Da HyperV keine Mailbenachrichtigung integriert hat, wollte ich das mit einem script lösen. Ich ich habe mir folgendes Script zusammen gebastelt und ich habe das Problem, das es nicht in die IF-Anweisung springt, bzw. die Bedingung nicht erfüllt ist/wird. $MailBetreff_Name = (Get-WmiObject Win32_ComputerSystem).Name $MailBetreff_Domain = (Get-WmiObject Win32_ComputerSystem).Domain $Mail_Absender = "Admin@_______.de" $Erstelle_HyperV_Infodatei = Get-VMReplication $Pruefe_HyperV_Replica_1 = Get-VMReplication -ReplicationHealth "Warning" $Pruefe_HyperV_Replica_2 = Get-VMReplication -ReplicationHealth "Critical" $VM_Deltadatein_Pfad1 = "D:\VM" #$VM_Deltadatein_Pfad2 = ":\VM" $Info_Datei = "C:\Powershell\HyperV Infodatei.txt" If ($Pruefe_HyperV_Replica_1 -like $true) { New-Item $Info_Datei $Serverbezeichnung = "Der Replikationstatus von Server: $MailBetreff_Name@$MailBetreff_Domain ist auf WARNUNG gewechselt!" | Out-File $Info_Datei -append Get-VMReplication | Out-File $Info_Datei -append Get-PSDrive | Out-File $Info_Datei -append GCI -Path $VM_Deltadatein_Pfad1 -Recurse -Force | Out-File $Info_Datei -append Send-MailMessage –To "HyperV@_____.de" –Subject "HyperV-Replica Warnung" –Body (gc $Info_Datei | Out-String) –SmtpServer "_____.de" –From "$Mail_Absender" } elseif ($Pruefe_HyperV_Replica_2 -Like $True) { New-Item $Info_Datei $Serverbezeichnung = "Der Replikationstatus von Server: $MailBetreff_Name@$MailBetreff_Domain ist auf KRITISCH gewechselt!" | Out-File $Info_Datei -append Get-VMReplication | Out-File $Info_Datei -append Get-PSDrive | Out-File $Info_Datei -append GCI -Path $VM_Deltadatein_Pfad1 -Recurse -Force | Out-File $Info_Datei -append Send-MailMessage –To "HyperV@_____.de" –Subject "HyperV-Replica Alarm" –Body (gc $Info_Datei | Out-String) –SmtpServer "_____.de" –From "$Mail_Absender" } else { Get-Date Write-Host "Alles OK!" } Wenn mir jemand Helfen könnte, wäre das super. Mit freundlichen Grüßen Mario Zitieren Link zu diesem Kommentar
4077 30 Geschrieben 20. Februar 2020 Melden Teilen Geschrieben 20. Februar 2020 (bearbeitet) Ohne es gerade prüfen zu können, aber ich vermute, das Get-VMReplication -ReplicationHealth "Critical" kein 'true' oder 'false' zurück gibt, sondern einen anderen Wert? bearbeitet 20. Februar 2020 von 4077 Tippfehler Zitieren Link zu diesem Kommentar
BOfH_666 577 Geschrieben 20. Februar 2020 Melden Teilen Geschrieben 20. Februar 2020 Wenn ich die Doku richtig verstehe, liefert es die "Settings" der VM mit dem angegebenen Status. Gib den Befehl doch einfach mal auf der Konsole ein und sieh, was Du als Ausgabe erhältst. Wenn da kein "$true" dabei ist, wird's nix. Zitieren Link zu diesem Kommentar
Beste Lösung mwiederkehr 373 Geschrieben 20. Februar 2020 Beste Lösung Melden Teilen Geschrieben 20. Februar 2020 (bearbeitet) So sollte es gehen: $VMReplication = Get-VMReplication | select Name,Health,State foreach ($vm in $VMReplication) { $name = $vm.Name if ($vm.Health -Contains "Normal" -and $vm.State -Contains "Replicating") { # Mit $name ist alles OK } elseif ($vm.Health -eq "Warning") { # $name hat Warnungen } elseif ($vm.Health -eq "Critical") { # $name hat Fehler } } Bei Replikationen an externe Standorte mit nicht so hoher Bandbreite toleriere ich im Monitoring ein paar Stunden "Warning", denn das kommt meist, wenn er mit der Replikation nicht nachkommt und Zyklen verpasst. "Critical" ist aber eigentlich immer ein Fehler. bearbeitet 20. Februar 2020 von mwiederkehr Zitieren Link zu diesem Kommentar
Dukel 454 Geschrieben 20. Februar 2020 Melden Teilen Geschrieben 20. Februar 2020 Habt ihr kein Monitoring (Icinga, PRTG,...)? Da würde ich dann erstmal da ansetzen und eine integration in das Monitoring erreichen. Zitieren Link zu diesem Kommentar
Nobbyaushb 1.471 Geschrieben 20. Februar 2020 Melden Teilen Geschrieben 20. Februar 2020 PRTG wurde ja schon genannt, bis 100 Sensoren ohne Einschränkung kostenlos nutzbar.. Zitieren Link zu diesem Kommentar
mwiederkehr 373 Geschrieben 20. Februar 2020 Melden Teilen Geschrieben 20. Februar 2020 Mein Beispiel ist ein Ausschnitt aus einem Script, welches von PRTG ausgeführt wird. Eure Beiträge haben mich dazu animiert, wieder mal bei Paessler nachzusehen, ob es mittlerweile einen offiziellen Sensor für die Hyper-V-Replikation gibt. Gibt es nicht, aber sie empfehlen folgendes Script: https://kb.paessler.com/en/topic/50023-monitoring-hyper-v-replication. Dieses hat gegenüber meinem Beispiel den Vorteil, gleich die Minuten seit der letzten erfolgreichen Replikation zurück zu liefern. Es ist eleganter, bei kleinen Bandbreiten eine höhere Zeit zuzulassen als Warnungen zu tolerieren. 2 Zitieren Link zu diesem Kommentar
Mario-HS 5 Geschrieben 20. Februar 2020 Autor Melden Teilen Geschrieben 20. Februar 2020 Hallo alle zusammen vor 6 Stunden schrieb mwiederkehr: So sollte es gehen: $VMReplication = Get-VMReplication | select Name,Health,State foreach ($vm in $VMReplication) { $name = $vm.Name if ($vm.Health -Contains "Normal" -and $vm.State -Contains "Replicating") { # Mit $name ist alles OK } elseif ($vm.Health -eq "Warning") { # $name hat Warnungen } elseif ($vm.Health -eq "Critical") { # $name hat Fehler } } Ich habe es gerade eingearbeitet und es funktioniert ganz wunderbar. Recht herzlichen Dank @mwiederkehr 1 Zitieren Link zu diesem Kommentar
Mario-HS 5 Geschrieben 21. Februar 2020 Autor Melden Teilen Geschrieben 21. Februar 2020 (bearbeitet) Hallo alle zusammen, da mir hier auch tatkräftig geholfen wurde, möchte ich das fertige Script hier zur Verfügung stellen. Zitat $MailBetreff_Name = (Get-WmiObject Win32_ComputerSystem).Name $MailBetreff_Domain = (Get-WmiObject Win32_ComputerSystem).Domain $Mail_Absender = "Admin@____________.de" $Mail_Server = "____________" $Pruefe_HyperV_Replica = Get-VMReplication | select Name,Health,State $Info_Datei = "C:\Powershell\HyperV Infodatei.txt" $Log_Datei = "C:\Powershell\HV Logdatei.txt" $Datum = Get-Date $VMReplication = Get-VMReplication | select Name,Health,State $Datum | Out-File $Log_Datei -append foreach ($vm in $Pruefe_HyperV_Replica) { $name = $vm.Name if ($vm.Health -Contains "Normal" -and $vm.State -Contains "Replicating") { "$name - Alles OK!" | Out-File $Log_Datei -append } elseif ($vm.Health -eq "Warning") { New-Item $Info_Datei $Serverbezeichnung = "Der Replikationstatus von Server: $MailBetreff_Name@$MailBetreff_Domain ist auf WARNUNG gewechselt!" | Out-File $Info_Datei -append Get-VMReplication | Out-File $Info_Datei -append Get-PSDrive | Out-File $Info_Datei -append GCI -Path "D:\VM\$name\Virtual Hard Disks" -Recurse -Force | Out-File $Info_Datei -append Send-MailMessage –To "______@______.de" –Subject "HyperV-Replica Warnung" –Body (gc $Info_Datei | Out-String) –SmtpServer "$Mail_Server" –From "$Mail_Absender" "$name - Replikation meldet Warnung!" | Out-File $Log_Datei -append } elseif ($vm.Health -eq "Critical") { New-Item $Info_Datei $Serverbezeichnung = "Der Replikationstatus von Server: $MailBetreff_Name@$MailBetreff_Domain ist auf KRITISCH gewechselt!" | Out-File $Info_Datei -append Get-VMReplication | Out-File $Info_Datei -append Get-PSDrive | Out-File $Info_Datei -append GCI -Path "D:\VM\$name\Virtual Hard Disks" -Recurse -Force | Out-File $Info_Datei -append Send-MailMessage –To "______@______.de" –Subject "HyperV-Replica Alarm" –Body (gc $Info_Datei | Out-String) –SmtpServer "$Mail_Server" –From "$Mail_Absender" "$name - Kritischer Replikationsstatus!" | Out-File $Log_Datei -append } } " " | Out-File $Log_Datei -append " ----------------------------------------" | Out-File $Log_Datei -append bearbeitet 21. Februar 2020 von Mario-HS 3 Zitieren Link zu diesem Kommentar
BOfH_666 577 Geschrieben 21. Februar 2020 Melden Teilen Geschrieben 21. Februar 2020 (bearbeitet) ... nur ein kleiner Tipp, um Deinen Code leichter lesbar zu machen. Bei cmdlets, die ziemlich viele Parameter erfordern oder verdauen, liest sich der Code leichter, wenn man Splatting benutzt ... so ungefähr: $SendMailProps = @{ To = 'empfaenger@maildomain.tld' Subject = 'HyperV-Replica Alarm' Body = Get-Content -Path $Info_Datei | Out-String SmtpServer = $Mail_Server From = $Mail_Absender } Send-MailMessage @SendMailProps Hier was zum Nachlesen: https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.core/about/about_splatting?view=powershell-7 bearbeitet 21. Februar 2020 von BOfH_666 1 1 Zitieren Link zu diesem Kommentar
Sunny61 806 Geschrieben 21. Februar 2020 Melden Teilen Geschrieben 21. Februar 2020 Danke für das Script, jetzt nur den Code noch anonymisieren. ;) Zitieren Link zu diesem Kommentar
Mario-HS 5 Geschrieben 21. Februar 2020 Autor Melden Teilen Geschrieben 21. Februar 2020 (bearbeitet) Huch, oh ja die e-mail habe ich vergessen zu streichen^^. @BOfH_666 danke für denn Tipp, das schau ich mir mal an. bearbeitet 21. Februar 2020 von Mario-HS Zitieren Link zu diesem Kommentar
Mario-HS 5 Geschrieben 4. März 2020 Autor Melden Teilen Geschrieben 4. März 2020 Einen wunderschönen guten Morgen, ich habe feststellen müssen, dass es einige Probleme mit dem Senden der Mail gibt, und habe daher das Skript noch mal komplett überarbeitet. Es wäre super wenn die Experten unter euch noch mal drüber schauen können, gerade der Teil mit dem Mailversand ist Neuland für mich, da ich mit Objekterstellung noch nichts gemacht habe. Zitat $Pruefe_HyperV_Replica = Get-VMReplication | select Name,Health,State $Info_Datei = "C:\Powershell\HyperV Infodatei.txt" $Log_Datei = "C:\Powershell\HV Logdatei.txt" $Datum = Get-Date $VMReplication = Get-VMReplication | select Name,Health,State ##Authentifizierung für Mailserver Anmeldung $CredUser = "_____" $CredPassword = ConvertTo-SecureString "_____" -AsPlainText -Force $MailBetreff_Name = (Get-WmiObject Win32_ComputerSystem).Name $MailBetreff_Domain = (Get-WmiObject Win32_ComputerSystem).Domain $Datum | Out-File $Log_Datei -append ##Skript Start foreach ($vm in $Pruefe_HyperV_Replica) { $name = $vm.Name if ($vm.Health -Contains "Normal" -and $vm.State -Contains "Replicating") { "$name - Alles OK!" | Out-File $Log_Datei -append } elseif ($vm.Health -eq "Warning") # <-- Schleife für Replikationen mit dem Status Warnung! { New-Item $Info_Datei $Serverbezeichnung = "Der Replikationstatus von Server: $name auf $MailBetreff_Name@$MailBetreff_Domain ist auf WARNUNG gewechselt!" | Out-File $Info_Datei -append Get-VMReplication | Out-File $Info_Datei -append Get-PSDrive -PSProvider FileSystem | Out-File $Info_Datei -append GCI -Path "D:\VM\$name\Virtual Hard Disks" -Recurse -Force | Out-File $Info_Datei -append ##Einstellungen zum Sender der Mail $Mail_Absender = "_____@_____" $Mail_Empfaenger = "_____@_____e" $Mail_Betreff = "HyperV-Replica Warnung" $Mail_Body = "(gc $Info_Datei | Out-String)" $Mail_Server = "_____" $SMTPClient = New-Object Net.Mail.SmtpClient($Mail_Server, 587) $SMTPClient.EnableSsl = $true $SMTPClient.Credentials = New-Object System.Net.NetworkCredential($CredUser, $CredPassword); $SMTPClient.Send($Mail_Absender, $Mail_Empfaenger, $Mail_Betreff, $Mail_Body) Send-MailMessage –To "$Mail_Empfaenger" –Subject $Mail_Betreff –Body $Mail_Body –SmtpServer "$Mail_Server" –From "$Mail_Absender" "$name - Replikation meldet Warnung!" | Out-File $Log_Datei -append Remove-Item -Path "C:\Powershell\Info_Datei.txt" } elseif ($vm.Health -eq "Critical") # <-- Schleife für Replikationen mit dem Status Kritisch! { New-Item $Info_Datei $Serverbezeichnung = "Der Replikationstatus von Server: $name auf $MailBetreff_Name@$MailBetreff_Domain ist auf KRITISCH gewechselt!" | Out-File $Info_Datei -append Get-VMReplication | Out-File $Info_Datei -append Get-PSDrive -PSProvider FileSystem | Out-File $Info_Datei -append GCI -Path "D:\VM\$name\Virtual Hard Disks" -Recurse -Force | Out-File $Info_Datei -append ##Einstellungen zum Sender der Mail $Mail_Absender = "_____@_____" $Mail_Empfaenger = "_____@_____" $Mail_Betreff = "HyperV-Replica Alarm" $Mail_Body = "(gc $Info_Datei | Out-String)" $Mail_Server = "_____" $SMTPClient = New-Object Net.Mail.SmtpClient($Mail_Server, 587) $SMTPClient.EnableSsl = $true $SMTPClient.Credentials = New-Object System.Net.NetworkCredential($CredUser, $CredPassword); $SMTPClient.Send($Mail_Absender, $Mail_Empfaenger, $Mail_Betreff, $Mail_Body) Send-MailMessage –To "$Mail_Empfaenger" –Subject $Mail_Betreff –Body $Mail_Body –SmtpServer "$Mail_Server" –From "$Mail_Absender" "$name - Kritischer Replikationsstatus!" | Out-File $Log_Datei -append Remove-Item -Path "C:\Powershell\Info_Datei.txt" } } " " | Out-File $Log_Datei -append " ----------------------------------------" | Out-File $Log_Datei -append Wohltuende Grüsse Mario Zitieren Link zu diesem Kommentar
mwiederkehr 373 Geschrieben 4. März 2020 Melden Teilen Geschrieben 4. März 2020 Was kommt denn für eine Fehlermeldung? Grundsätzlich kannst Du den (alten?) Weg über die .Net-Klasse "Net.Mail.SmtpClient" gehen oder den neuen über den Befehl "Send-MailMessage", aber nicht beide gleichzeitig. Zitieren Link zu diesem Kommentar
Mario-HS 5 Geschrieben 4. März 2020 Autor Melden Teilen Geschrieben 4. März 2020 Hallo mwiederkehr, habe nun Folgendes ausprobiert Zitat $CredPassword = ConvertTo-SecureString "aaaaa" -AsPlainText -Force $cred = New-Object System.Management.Automation.PSCredential "bbbbb", $CredPassword $Mail_Absender = "Admin@ccccc" $Mail_Empfaenger = "1234@5678.de" $Mail_Betreff = "HyperV-Replica Alarm" $Mail_Body = "(gc $Info_Datei | Out-String)" $Mail_Server = "ddddd" Send-MailMessage –To "$Mail_Empfaenger" –Subject $Mail_Betreff –Body $Mail_Body –SmtpServer "$Mail_Server" –From "$Mail_Absender" -Port 25 -Credential $cred Ich habe extra "bbbbb" in unseren Mailserver angelegt, der kein SSL benötigt aber das Ergebnis ist folgendermaßen Zitat Send-MailMessage : Die Verbindung mit dem Remoteserver kann nicht hergestellt werden. In Zeile:12 Zeichen:6 + Send-MailMessage –To "$Mail_Empfaenger" –Subject $Mail_Betreff – ... + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + CategoryInfo : InvalidOperation: (System.Net.Mail.SmtpClient:SmtpClient) [Send-MailMessage], SmtpException + FullyQualifiedErrorId : SmtpException,Microsoft.PowerShell.Commands.SendMailMessage So recht habe ich noch keine Vermutung was da in den Organisierten Wiederstand getreten ist. Zitieren Link zu diesem Kommentar
Empfohlene Beiträge
Schreibe einen Kommentar
Du kannst jetzt antworten und Dich später registrieren. Falls Du bereits ein Mitglied bist, logge Dich jetzt ein.