Isostar 10 Geschrieben 31. August 2013 Melden Teilen Geschrieben 31. August 2013 Hallo zusammen ich versuche folgende Powershell-Ausgabe via Email zu verschicken: Get-MailboxDatabase | Sort Name | ForEach{ $db = $_.Name $curServer = $_.Server.Name $ownServer = $_.ActivationPreference | ? {$_.Value -eq 1} Write-Host “$db on $curServer should be on $($ownServer.Key) – ” -NoNewLine If ($curServer -ne $ownServer.Key) { Write-Host “WRONG” -ForegroundColor Red } Else { Write-Host “OK” -ForegroundColor Green }} Quelle: http://msexchangeguru.com/2011/08/16/monitor-dags/ Vorweg, ich bin kein großer Powershell-Spezi. Leider bekomme ich es auch nicht hin, es als simple Textausgabe, sprich ">Ausgabe.txt" auszugeben. Ich hatte versucht, dieses als Variable abzuspeichern, jedoch ohne Erfolg :-( Ich möchte damit, mehr unsere DAG im Auge behalten. Hin und wieder werden nämlich die passiven Datenbanken zu aktiven. Diese Powershell-Ausgabe liefert genau das, was ich brauche. Gruß Iso Zitieren Link zu diesem Kommentar
RobertWi 81 Geschrieben 31. August 2013 Melden Teilen Geschrieben 31. August 2013 Moin, kurz gesagt; Wenn Dir die Erfahrung in der PowerShell fehlt, wirst Du am Anfang sehr große Probleme haben, die man nicht in einem Forum lösen kann. In der PowerShell ist alles ein Objekt und muss auch so behandelt werden. Eine einfach Umlenkung in eine Datei geht zwar, aber bringt eventuell nicht das gewünschte Ergebnis. Dein Script ist ja eigentlich ganz simpel. Ich würde den Text, den Du da mit Write-Host ausgibst, in eine Variable speichern. Und dann den Inhalt als "Body" mit "Send-Mailmessage" verschicken. Schau Dir die Beispiele an, da ist schon einiges erklärt. Nachtrag: In Deinem Link ist doch sogar eine Komplett-Lösung mit Mailversand beschrieben. Was ist den jetzt noch das Problem? Zitieren Link zu diesem Kommentar
Isostar 10 Geschrieben 31. August 2013 Autor Melden Teilen Geschrieben 31. August 2013 (bearbeitet) Hi Danke für die Rückmeldung. 0815-Powershell-Befehle kann ich schon lesen bzw. erstellen. Bin halt auf dem Gebiet aber noch Anfänger. Möchte mich in Zukunft da schon intensiver einarbeiten, weil die Shell immer wichtiger für die Administration wird. Zum Problem: Eine Einfache Umlenkung in eine Text-Datei könnte auch schon reichen. Dann könnte man es sich als Anlage zuschicken oder man lädt sich den Inhalt der Textdatei in den Body der Email hinein. Ein einfaches SendMailmessage samt Anlage bzw. mit Body via Shell würde ich hinbekommen. Schöner wäre es natürlich, die komplette obige Befehlsausgabe als eine Variable zu haben...und das check ich irgendwie nicht bzw. bekomme es nicht hin :( Wie gesagt, brauche ich nur die obige Befehlsausgabe via Email. Die anderen Checks in dem Artikel brauche ich nicht. Aus dem Teil mit der Email Funktion werde ich nicht schlau bearbeitet 31. August 2013 von Isostar Zitieren Link zu diesem Kommentar
Alith Anar 40 Geschrieben 31. August 2013 Melden Teilen Geschrieben 31. August 2013 (bearbeitet) Nimm anstelle von Write-Host ein Write-Output Das -Foregroundcolor kannst du da weglassen, spielt in einer Textdatei sowieso keine Rolle. Aussehen könnte dein Script z.B. so: $Log = c:\temp\Logfile.txt # Mailfunktion function sendmail($body) { $SmtpClient = new-object system.net.mail.smtpClient $MailMessage = New-Object system.net.mail.mailmessage $att = new-object Net.Mail.Attachment($Log) $SmtpClient.Host = "<deinMailserver>" $mailmessage.from = "<deineAbsenderadresse>" $mailmessage.To.add("<Zielpostfach>") $mailmessage.Subject = "<Betreff>" $MailMessage.IsBodyHtml = $true $mailmessage.Body = $body $mailmessage.Attachments.Add($att) $smtpclient.Send($mailmessage) } Get-MailboxDatabase | Sort Name | ForEach{ $db = $_.Name $curServer = $_.Server.Name $ownServer = $_.ActivationPreference | ? {$_.Value -eq 1} Write-Output“$db on $curServer should be on $($ownServer.Key) – ” -NoNewLine If ($curServer -ne $ownServer.Key) { Write-Output “$curServer” >> $Log Write-Output “WRONG” >> $Log } Else { Write-Output “$curServer” >> $Log Write-Output “OK” >> $Log } } $body = "<Mailtext einfügen>" sendmail $body bearbeitet 1. September 2013 von Alith Anar Zitieren Link zu diesem Kommentar
RobertWi 81 Geschrieben 1. September 2013 Melden Teilen Geschrieben 1. September 2013 Moin, @Alith Anar: Zwei kleiner "Fehler" in Deinem Bespiel: Eine Zeile mit "Write-Host" gibt es noch. Und Dein Output wird immer angehängt, d.h. die Datei wird immer länger und länger (im ersten Entwurf wurde sie dagegen immer überschrieben). Ok, das ist für eine Log-Datei eventuell sinnvoll, aber nicht für die Mail zur Benachrichtigung. In einer Log-Datei müsste man dann aber auch Datum/Zeit schreiben, sonst bringt einen die reine Auflistung gar nichts. @Isostar: Wenn Dein Wissen nicht mal ausreicht, aus einem Write-Host “WRONG” ein $a = “WRONG” zu machen, fehlen Dir vermutlich wirklich sehr viele Grundlagen des allgemeinen Scriptings. Dann wirst Du es mit der PS sehr schwer haben, Get-MailboxDatabase | Sort Name | ForEach{ $db = $_.Name $curServer = $_.Server.Name $ownServer = $_.ActivationPreference | ? {$_.Value -eq 1} $body += “$db on $curServer should be on $($ownServer.Key) – ” If ($curServer -ne $ownServer.Key) { $body += “WRONG” } Else { $body += “OK” } $body += "`n" #Zeilenumbruch, eventuell muss es $body += "`r`n" sein, in der Mail kontrollieren}send-mailmessage -to "AN" -from "VON" -subject "BETREFF" -body $body Zitieren Link zu diesem Kommentar
Alith Anar 40 Geschrieben 1. September 2013 Melden Teilen Geschrieben 1. September 2013 @RobertFehler 1: Danke - hab ich übersehen Fehler 2: Is mir in diesem Fall bewusst. Bei mir habe ich noch eine Erweiterung drin, das ich die Logfile gleich am Anfang komlett lösche und die Datei neu erstelle (was aber nicht notwendig ist das >> im Bedarfsfall die Datei auch neu erstellt, wenn nicht vorhanden) Danke :) Zitieren Link zu diesem Kommentar
Isostar 10 Geschrieben 1. September 2013 Autor Melden Teilen Geschrieben 1. September 2013 @ Alith Anar Besten Dank für deine Hilfe. Ich habe das Script etwas verändert. Mit dem Ergebnis bin ich nun zufrieden ;-) Erweitern bzw. verändern kann man es immer noch... So sieht es im Moment aus: $Log = "c:\Logfile.txt"Get-MailboxDatabase | Sort Name | ForEach{ $db = $_.Name $curServer = $_.Server.Name $ownServer = $_.ActivationPreference | ? {$_.Value -eq 1} If ($curServer -ne $ownServer.Key) { Write-Output “$db on $curServer should be on $($ownServer.Key) : WRONG” >> $Log } Else { Write-Output “$db on $curServer should be on $($ownServer.Key) : OK” >> $Log }}$datei = Get-content C:\Logfile.txtSend-MailMessage -To "administrator@contoso.com" -From "test@xyz.com" -Subject "DatenbankCheck" -Body ($datei | out-string) -smtpServer "EX01.contoso.com"Remove-Item c:\Logfile.txt Zitieren Link zu diesem Kommentar
Dukel 454 Geschrieben 1. September 2013 Melden Teilen Geschrieben 1. September 2013 Ich würde als erstes überall wo du "C:\Logfile.txt" stehen hast dieses durch die Variable $log ersetzen. Außerdem brauchst du das ganze nicht unbedingt in eine Datei schreiben sondern kannst den Inhalt direkt in eine Variable schreiben, die du als Body nutzt. Zitieren Link zu diesem Kommentar
RobertWi 81 Geschrieben 1. September 2013 Melden Teilen Geschrieben 1. September 2013 Ich habe das Script etwas verändert. Mit dem Ergebnis bin ich nun zufrieden ;-) Ok, Du magst es wohl eher komplizierter. Solang es es funktioniert, egal. :) 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.