E-Mails mit der PowerShell versenden mit vielen Beispielen

Teilen Sie diesen Beitrag:

Die Möglichkeit, E-Mails mit der PowerShell zu versenden, ist ein tolles Feature und kann uns enorm helfen, wenn es richtig umgesetzt wird. Deshalb zeige ich Ihnen viele Beispiele, wie Sie mit der PowerShell E-Mails versenden können und wie Sie dies in Ihrer täglichen IT-Routine weiter umsetzen können.

Um E-Mails mit der PowerShell zu versenden, werden wir das PowerShell-CmdLet Send-MailMessage verwenden, und wir benötigen ein paar Voraussetzungen, bevor wir es verwenden können, die ich hier erläutern werde:

  • Zuerst benötigen wir einen SMTP-Server, der einen Dienst zum Übertragen unserer E-Mails an die Empfänger bereitstellt.
  • Zweitens erhalten wir von unserem SMTP-Server-Anbieter SMTP-Anmeldeinformationen (Benutzername und Kennwort), um uns bei der Übertragung von E-Mails gegenüber dem Dienst zu authentifizieren.
  • Schließlich, nachdem wir den SMTP-Server-Anbieter und die Anmeldeinformationen geklärt haben, können wir mit der Verwendung von Send-MailMessage PowerShell CmdLet mit mehreren Beispielen beginnen, die ich für Sie vorbereitet habe.

Lassen Sie uns in mehrere großartige Beispiele eintauchen, damit wir das Aussehen und das Gefühl der E-Mail-Versandfähigkeiten mit PowerShell bekommen können.

Inhaltsverzeichnis

E-Mail mit PowerShell senden – einfaches Beispiel

Wie wir bereits festgestellt haben, hilft uns das PowerShell Send-MailMessage CmdLet, um E-Mails aus der PowerShell zu senden und hier ist ein sehr einfaches Beispiel:

Send-MailMessage -To "recipient’s email address" -From "sender’s email address" -Subject "Your message subject" -Body "Message text!" -Credential (Get-Credential) -SmtpServer "SMTP server" -Port 587

WICHTIG: Die Werte für alle Parameter außer Port sollten durch die für Ihren Fall zutreffenden Werte ersetzt werden, damit diese Code-Zeile funktioniert.

In diesem einfachen Beispiel haben wir nur ein paar notwendige Parameter von Send-MailMessage PowerShell CmdLet verwendet, um eine einfache E-Mail an den Empfänger zu senden:

  • -To-Parameterwert ist die E-Mail-Adresse des Empfängers
  • -From-Parameterwert ist die E-Mail-Adresse des Absenders
  • -Subject-Parameterwert ist der Betrefftext der E-Mail
  • -Body-Parameterwert ist der Inhalt der E-Mail. Dies ist ein einfacher Textinhalt. Später werden wir sehen, wie wir HTML-Inhalte im Body-Text der E-Mail senden können.
  • -Parameter -Credential ist der Benutzername und das Kennwort des SMTP-Servers. Schauen Sie sich bitte die folgenden Unterthemen in diesem Artikel an, in denen ich die Möglichkeiten zur Übergabe der Anmeldeinformationen erklärt habe. Es ist sehr wichtig, also achten Sie darauf.
  • -SmtpServer-Parameterwert ist die SMTP-Serveradresse.
  • -Port-Parameterwert ist die Portnummer, die SMTP für die E-Mail-Nachrichten abhört.

Hinweis: Wenn Sie für den Parameter -From eine Absender-E-Mail-Adresse verwenden, die nicht als Absender beim SMTP-Server registriert ist, erhalten Sie möglicherweise eine E-Mail vom SMTP-Server-Support, dass Sie versuchen, E-Mails von einer nicht registrierten Absender-E-Mail-Adresse zu senden. Sie müssen also entweder eine registrierte E-Mail-Adresse verwenden oder eine zusätzliche Absender-E-Mail-Adresse registrieren.

Hier ist die E-Mail, die ich mit meiner SMTP-Server-Adresse und meinen Anmeldedaten erhalten habe. Wie Sie sehen können, haben wir ein Beispiel für das Senden einer E-Mail mit Anhang und wir sehen den Betrefftext und einen Teil des E-Mail-Textes im Gmail-Posteingang.

E-Mail-Nachricht im Google Mail-Posteingang, die mit einem PowerShell-Skript gesendet wurde

Im E-Mail-Text können wir den Inhalt der E-Mail-Nachricht sehen, die mit PowerShell gesendet wurde. Dies ist ein Beispiel für das Senden einer E-Mail mit PowerShell mit Betrefftext, über MailJet SMTP Server, der Textkörper ist nur einfacher Text und mit Anhang an die E-Mail.

E-Mail-Nachricht mit einfachem Text und Anhang

Es gibt noch viele weitere Parameter von Send-MailMessage CmdLet, die wir in den folgenden Beispielen etwas weiter unten in diesem Artikel sehen werden.

Aber bevor wir uns mit weiteren Beispielen und Feinheiten des Versendens von E-Mails mit PowerShell beschäftigen, sollten wir die Voraussetzungen klären, die für das Versenden von E-Mails benötigt werden, und das sind der SMTP-Server und die SMTP-Server-Authentifizierungsanmeldedaten.

Welchen SMTP-Server verwenden und wie man einen SMTP-Server erhält

Jetzt fragen Sie sich wahrscheinlich, Moment mal, ich möchte eine E-Mail mit PowerShell senden und warum sprechen wir über SMTP-Server.

Tja, erinnern Sie sich noch an die alten Zeiten, als wir Nachrichten in Umschlägen verschickt haben? Haben Sie Ihre Briefumschläge persönlich beim Empfänger abgegeben? Nein, natürlich nicht. Die Wahrscheinlichkeit ist groß, dass Sie zumindest einige Anbieter wie Post Office genutzt haben, um dies für Sie zu tun.

So ist SMTP Server unser Anbieter, der die E-Mails, die wir in PowerShell schreiben, für uns an die Empfänger sendet.

INFO: SMTP steht für (Simple Mail Transfer Protocol) und ist eine vereinbarte „Sprache“ oder ein Kommunikationsprotokoll für die Anwendungen auf Servern, um E-Mails zu übertragen.

Wenn Sie sich fragen, welchen SMTP-Server Sie verwenden sollen, recherchieren Sie bitte, denn es gibt viele Unternehmen im Internet, die diesen Dienst anbieten, um nur einige zu nennen: Gmail, Hotmail, Yahoo, etc.

Für meine Beispiele und zum Testen des Codes habe ich MailJet verwendet, weil es einfach war, ein Konto zu erstellen und alles einzurichten.

Wenn ich ein Konto mit MailJet erstellt habe, kann man die SMTP-Einstellungen sehen:

  • die SMTP-Server-Adresse („in-v3.mailjet.com“),
  • ein Port, der verwendet wird (587),
  • Benutzername und
  • Passwort für die SMTP-Anmeldedaten.

Alle diese Informationen sind wichtig, wenn wir E-Mails mit dem PowerShell-CmdLet Send-MailMessage senden möchten. Stellen Sie also sicher, dass Sie sie haben, bevor Sie die PowerShell-Funktion zum Senden von E-Mails verwenden.

So senden Sie SMTP-E-Mails mit Authentifizierung mit PowerShell

Es gibt mehrere Möglichkeiten, SMTP-Anmeldeinformationen beim Senden von E-Mails mit PowerShell bereitzustellen. Wir zeigen Ihnen zwei verschiedene Ansätze.

Der erste ist einfacher, aber weniger sicher, da das Kennwort des SMTP-Servers für andere sichtbar ist, die Zugriff auf den Quellcode haben.

Der zweite hat einen zusätzlichen Schritt, ist aber sicherer, da er uns erlaubt, das Kennwort gesichert und verschlüsselt in einer externen Datei aufzubewahren, die wir bei der Bereitstellung von SMTP-Anmeldeinformationen verwenden können.

Senden von SMTP-Anmeldeinformationen mit sichtbarem Kennwort im Quellcode (weniger sicher)

In diesem Beispiel übergeben wir mehrere Parameter an Send-MailMessage CmdLet, aber die wichtigsten Parameter für die Erklärung dieses Beispiels sind:

  • SmtpServer
  • Credential

Hinweis: Damit dieses Beispiel für Sie funktioniert, ersetzen Sie bitte die Werte dieser Variablen durch Ihre eigenen Daten: $EmailFrom, $EmailTo, $SMTPserver, $username.

$EmailFrom = "sender’s email address" $EmailTo = "recipient’s email address" $EmailSubject = "Learn PowerShell With Dejan - ImproveScripting.com." $EmailBody = "This email has an attachment error log." $SMTPserver= "SMTP server"$username="your_user_name" $password = "your_password" | ConvertTo-SecureString -AsPlainText -Force$credential = New-Object System.Management.Automation.PSCredential($username, $password)Send-MailMessage -ErrorAction Stop -from "$EmailFrom" -to "$EmailTo" -subject "$EmailSubject" -body "$EmailBody" -SmtpServer "$SMTPserver" -Attachments "$home\Documents\PSlogs\Error_Log.txt" -Priority "Normal" -Credential $credential -Port 587 -UseSsl

Der Parameterwert SMTPServer hat eine Adresse des SMTP-Servers, zum Beispiel ist der MailJet SMTP-Server „in-v3.mailjet.com“.

Der Parameter Credential umschließt die Anmeldedaten des SMTP-Servers für Benutzer und Passwort und muss als PSCredential-Objekt übergeben werden. Bei der Übergabe eines Passworts an die Erstellung eines PSCredential-Objekts müssen wir besonders aufpassen, da ein Passwort nicht im Klartext, sondern vom Datentyp SecureString sein kann. Also müssen wir unser einfaches Passwort in den SecureString-Datentyp konvertieren, indem wir ConvertTo-SecureString CmdLet verwenden.

$password = "your_password" | ConvertTo-SecureString -AsPlainText -Force

Wie bereits erwähnt, ist diese Methode nicht zu kompliziert, hat aber ein Sicherheitsproblem, da wir unser SMTP-Server-Passwort als Klartext in unserem Quellcode behalten, was nicht die beste Praxis ist.

Schließlich sehen Sie hier das Ergebnis und die empfangene E-Mail mit diesem Beispiel:

E-Mail-Nachricht

SMTP-Anmeldedaten mit verstecktem Passwort im Quellcode senden (sicherer)

In diesem Beispiel, geben wir die SMTP-Anmeldeinformationen beim Aufruf von Send-MailMessage CmdLet an, aber dieses Mal wird das Kennwort nicht sichtbar sein. Allerdings erfordert diese Methode einen zusätzlichen Schritt von unserer Seite, um zu funktionieren.

Zunächst verschlüsseln wir unser Kennwort in einer externen txt-Datei nur einmal und verwenden diese Datei, um unser Kennwort zu entschlüsseln und zu lesen, wann immer wir es in unserem Quellcode benötigen.

Wenn wir diesen Code ausführen, werden wir aufgefordert, SMTP-Server-Kennwortdaten anzugeben. Wenn Sie auf die Schaltfläche OK klicken (wie Sie auf dem Screenshot sehen können), wird das verschlüsselte Passwort in einer externen Datei gespeichert (in diesem Beispiel ist das die Datei MailJet.txt).

Read-Host -AsSecureString | ConvertFrom-SecureString | Out-File -FilePath "C:\Users\dekib\Documents\PSCredential\MailJet.txt"
Verschlüsseltes Passwort in externer Datei speichern.

Jetzt ist unser Passwort verschlüsselt und in einer externen Datei gespeichert, so dass wir es beim Aufruf von Send-MailMessage CmdLet verwenden können.

Hier ist ein Beispiel, das uns zeigt, wie wir das verschlüsselte Passwort in einer externen txt-Datei verwenden können.

Hinweis: Damit dieses Beispiel für Sie funktioniert, ersetzen Sie bitte die Werte dieser Variablen durch Ihre eigenen Daten: $EmailFrom, $EmailTo, $SMTPserver, $username.

$EmailFrom = "sender’s email address" $EmailTo = "recipient’s email address" $EmailSubject = "Learn PowerShell With Dejan - ImproveScripting.com." $EmailBody = "This email has an attachment error log." $SMTPserver= "SMTP server"$EncryptedPasswordFile = "$home\Documents\PSCredential\MailJet.txt"$username="your_user_name" $password = Get-Content -Path $EncryptedPasswordFile | ConvertTo-SecureString$credential = New-Object System.Management.Automation.PSCredential($username, $password)Send-MailMessage -ErrorAction Stop -from "$EmailFrom" -to "$EmailTo" -subject "$EmailSubject" -body "$EmailBody" -SmtpServer "$SMTPserver" -Attachments "$home\Documents\PSlogs\Error_Log.txt" -Priority "Normal" -Credential $credential -Port 587 -UseSsl

Nun, da wir die Möglichkeiten zur Übergabe von SMTP-Zugangsdaten an das Send-MailMessage CmdLet geklärt haben, können wir uns auf verschiedene Beispiele konzentrieren.

Senden von Anhängen mit einer E-Mail mithilfe von PowerShell

Manchmal ist es sehr praktisch, eine E-Mail mit einigen Anhängen zu versehen, die uns zusätzliche Informationen liefern. Obwohl wir bereits Beispiele für das Senden von E-Mails mit Anhängen mithilfe von PowerShell verwendet haben, sehen wir uns nun ein spezielles Beispiel an. Wir verwenden den Parameter -Attachments von Send-MailMessage CmdLet, um die Arbeit zu beenden:

Hinweis: Damit dieses Beispiel für Sie funktioniert, ersetzen Sie bitte die Werte dieser Variablen durch Ihre eigenen Daten: $EmailFrom, $EmailTo, $SMTPserver, $username.

$EmailFrom = "sender’s email address" $EmailTo = "recipient’s email address" $EmailSubject = "Learn PowerShell With Dejan - ImproveScripting.com. (Multiple recipients example)" $EmailBody = "This email has an attachment error log." $SMTPserver= "SMTP server"$EncryptedPasswordFile = "$home\Documents\PSCredential\MailJet.txt"$username="your_user_name" $password = Get-Content -Path $EncryptedPasswordFile | ConvertTo-SecureString$credential = New-Object System.Management.Automation.PSCredential($username, $password)Send-MailMessage -ErrorAction Stop -from "$EmailFrom" -to $EmailTo -subject "$EmailSubject" -body "$EmailBody" -SmtpServer "$SMTPserver" -Attachments "$home\Documents\PSlogs\Error_Log.txt" -Priority "Normal" -Credential $credential -Port 587 -UseSsl

Wenn wir mehrere Anhänge in der gleichen E-Mail versenden wollen, können wir das leicht tun, da der Parameter -Attachments des Send-MailMessage CmdLet ein Array von Strings als Eingabewerte akzeptiert. Seien Sie jedoch vorsichtig, wie Sie das Array von Strings übergeben, um nicht mit unerwarteten Ergebnissen überrascht zu werden.

Dies ist der korrekte Weg, um zwei Anhänge zu übergeben

$Attachments = "$home\Documents\PSlogs\Error_Log.txt", "$home\Documents\PSReports\Excel_report.xls"

und auch dieser:

$Attachments = @("$home\Documents\PSlogs\Error_Log.txt", "$home\Documents\PSReports\Excel_report.xls")

aber dieser ist falsch. Achten Sie also darauf.

$Attachments = "$home\Documents\PSlogs\Error_Log.txt, $home\Documents\PSReports\Excel_report.xls"
E-Mail mit Anhang (Error_Log.txt) mit PowerShell

Wie man E-Mails mit PowerShell an mehrere Empfänger sendet

Wenn wir E-Mails mit PowerShell an mehrere Empfänger senden möchten, dann haben wir die Bequemlichkeit des Parameters -To, der ein Array von Strings in Send-MailMessage CmdLet akzeptiert. Es ist wichtig, darauf zu achten, dass wir mehrere E-Mail-Adressen als Array von Strings hinzufügen und nicht nur einen einzelnen String mit kommagetrennten Werten. Am Ende dieses Unterthemas habe ich einige Beispiele für die richtige und falsche Art der Übergabe von mehreren Empfängern gegeben.

Hier ist ein Beispiel für das Senden von E-Mails an mehrere Empfänger mit PowerShell :

Hinweis: Damit dieses Beispiel für Sie funktioniert, ersetzen Sie bitte die Werte dieser Variablen durch Ihre eigenen Daten: $EmailFrom, $ToRecipients, $SMTPserver, $username.

$EmailFrom = "sender’s email address" $ToRecipients = "recipient’s email address 1", "recipient’s email address 2", "recipient’s email address 3" $EmailSubject = "Learn PowerShell With Dejan - ImproveScripting.com. (Multiple recipients example)" $EmailBody = "This email has an attachment error log." $SMTPserver= "SMTP server"$EncryptedPasswordFile = "$home\Documents\PSCredential\MailJet.txt"$username="your_user_name" $password = Get-Content -Path $EncryptedPasswordFile | ConvertTo-SecureString$credential = New-Object System.Management.Automation.PSCredential($username, $password)Send-MailMessage -ErrorAction Stop -from "$EmailFrom" -to $ToRecipients -subject "$EmailSubject" -body "$EmailBody" -SmtpServer "$SMTPserver" -Attachments "$home\Documents\PSlogs\Error_Log.txt" -Priority "Normal" -Credential $credential -Port 587 -UseSsl

Beachten Sie den Unterschied zwischen der korrekten Übergabe der Empfänger-E-Mail-Adressen als String-Array:

$ToRecipients = "recipient’s email address 1", "recipient’s email address 2", "recipient’s email address 3"

und der falschen Übergabe nur als einzelner String (E-Mail-Adressen sind kommagetrennte Werte, aber innerhalb eines einzelnen Strings) statt eines String-Arrays.

$ToRecipients = "recipient’s email address 1, recipient’s email address 2, recipient’s email address 3"

Zusätzlich zum Senden von E-Mails an mehrere Empfänger haben wir normalerweise die E-Mail-Funktionen des Sendens von Cc (Carbon Copy) und Bcc (Blind Carbon Copy), und dafür verwenden wir die Parameter -Cc bzw. -Bcc (Send-MailMessage CmdLet), während wir die E-Mail-Adressen als Werte für jeden von ihnen angeben.

Senden von E-Mails mit HTML-Text mit PowerShell

Wir haben die Möglichkeit, unsere E-Mails mit PowerShell mit HTML-Inhalt innerhalb des E-Mail-Textes mit Send-MailMessage CmdLet zu senden. Um E-Mails mit PowerShell als HTML zu senden, müssen wir zwei zusätzliche Dinge tun:

  • Der Wert des Parameters -body sollte gut formatiertes HTML sein, damit der E-Mail-Client uns eine HTML-E-Mail anzeigt.
  • Der Schalterparameter -BodyAsHtml wurde an Send-MailMessage CmdLet übergeben, um ihm mitzuteilen, dass der Parameter -body HTML-Code enthält.

Hier ist ein Beispiel für einen Aufruf von Send-MailMessage CmdLet, der eine HTML-E-Mail anstelle von einfachem Text im E-Mail-Body erzeugt.

Hinweis: Damit dieses Beispiel für Sie funktioniert, ersetzen Sie bitte die Werte dieser Variablen durch Ihre eigenen Daten: $EmailFrom, $EmailTo, $SMTPserver, $username.

$EmailFrom = "sender’s email address" $EmailTo = "recipient’s email address" $EmailSubject = "Learn PowerShell With Dejan - ImproveScripting.com. HTML Example" $EmailHTMLBody = 'Learn PowerShell With Dejan - ImproveScripting.com'$SMTPserver= "SMTP server"$EncryptedPasswordFile = "$home\Documents\PSCredential\MailJet.txt"$username="your_user_name" $password = Get-Content -Path $EncryptedPasswordFile | ConvertTo-SecureString$credential = New-Object System.Management.Automation.PSCredential($username, $password)Send-MailMessage -ErrorAction Stop -from "$EmailFrom" -to "$EmailTo" -subject "$EmailSubject" -body "$EmailHTMLBody" -BodyAsHtml -SmtpServer "$SMTPserver" -Attachments "$home\Documents\PSlogs\Error_Log.txt" -Priority "Normal" -Credential $credential -Port 587 -UseSsl

Hier ist die resultierende E-Mail, die empfangen wurde, und wie Sie sehen können, haben wir im E-Mail-Body einen HTML-Link zu dieser Website anstelle von einfachem Text.

HTML-E-Mail mit PowerShell senden

So senden Sie E-Mail von PowerShell mit Gmail-SMTP-Server

Vielleicht wird Sie meine Antwort überraschen, aber ich empfehle nicht die Verwendung des Gmail-SMTP-Servers zum Senden von E-Mails mit PowerShell Send-MailMessage CmdLet.

Der Grund dafür ist die Tatsache, dass wir im Gmail-Konto die Funktion aktivieren müssen: „Enable less secure apps to access Gmail“. Dies wird die Sicherheit unseres Gmail-Kontos herabsetzen, und ich ziehe es vor, dies nicht zu tun, zumal es viele andere Optionen gibt, die öffentlich verfügbar sind.

System.Net.Mail API

Einer der alternativen Ansätze zum Senden von E-Mails mit PowerShell ist die Verwendung von .NET-Klassen im System.Net.Mail-Namensraum. Dieser Ansatz stammt aus der Zeit vor Send-MailMessage CmdLet, als Send-MailMessage CmdLet noch nicht verfügbar war.

Hier ein Beispielaufruf mit System.Net.Mail API:

Hinweis: Damit dieses Beispiel für Sie funktioniert, ersetzen Sie bitte die Werte dieser Variablen durch Ihre eigenen Daten: $EmailFrom, $EmailTo, $SMTPserver, $username.

$EmailFrom = "sender’s email address”$EmailTo = "recipient’s email address”$EmailSubject = "Learn PowerShell With Dejan - ImproveScripting.com. (System.Net.Mail API Example)”$EmailBody = "This email has as the attachments error log."$SMTPServer = "SMTP server”$SMTPClient = New-Object Net.Mail.SmtpClient($SmtpServer, 587)$SMTPClient.EnableSsl = $true$EncryptedPasswordFile = "$home\Documents\PSCredential\MailJet.txt"$username="your_user_name" $password = Get-Content -Path $EncryptedPasswordFile | ConvertTo-SecureString$SMTPClient.Credentials = New-Object System.Net.NetworkCredential($username, $password);$SMTPClient.Send($EmailFrom, $EmailTo, $EmailSubject, $EmailBody)

Hier ist die empfangene E-Mail im Posteingang nach dem Ersetzen des Beispiels mit den tatsächlich benötigten Werten der Parameter:

E-Mail Betreff im Posteingang
E-Mail mit System.Net.Mail API mit PowerShell

Meiner Meinung nach ist die Verwendung von System.Net.Mail .NET-Namespace-Klassen ein natürlicherer Ansatz für .NET-Entwickler, während die Verwendung von Send-MailMessage CmdLet ein nativerer PowerShell-Ansatz ist. Wie auch immer, es ist gut, mit Alternativen vertraut zu sein, und beide Ansätze sind nützlich, um im PowerShell-Skript-Skillset zu haben.

Wie man ein eigenes CmdLet für das Senden von E-Mails mit PowerShell schreibt

Ich habe mein eigenes PowerShell-CmdLet geschrieben, das die E-Mail-Sendefunktionalität namens Send-Email CmdLet bereitstellt.

Dieses CmdLet gehört zum Efficiency Booster PowerShell-Projekt. Dieses Projekt ist eine Bibliothek verschiedener CmdLets, die uns IT-Mitarbeitern helfen können, unsere täglichen Aufgaben effizienter und genauer zu erledigen.

Der Quellcode für das Send-Email CmdLet kann von dieser Zip-Datei heruntergeladen werden, also laden Sie es bitte herunter oder schauen Sie sich den Quellcode am Ende dieses Artikels an.

Send-Email CmdLet ist Teil des Utils-Moduls und wenn Sie den Quellcode heruntergeladen haben, finden Sie ihn im Ordner …\ Documents\WindowsPowerShell\Modules\02utils

Ich werde nicht zu viel über dieses CmdLet erklären, da es im Grunde ein Wrapper um Send-MailMessage CmdLet ist und nicht besonders innovativ ist, aber es ist wichtig, die PowerShell-Funktionen zum Senden von E-Mails als einen wichtigen Mechanismus zur Automatisierung und Effizienz zu nutzen.

INFO: Wenn Sie wissen möchten, wie Sie die Efficiency Booster PowerShell Projektdateien installieren und konfigurieren, lesen Sie bitte den folgenden Artikel: Wie man PowerShell installiert und konfiguriert: CmdLets, Modules, Profiles.

How To Use Send Email Feature In PowerShell

Ich werde Ihnen ein paar Beispiele geben, wie ich E-Mails in Kombination mit einigen anderen PowerShell-Funktionen verwendet habe, um effizienter zu sein oder um einen besseren Überblick über das zu wartende System zu haben.

Beispiel: Freier Speicherplatz auf Servern

Ich wollte einen Überblick über den freien Speicherplatz auf den Festplatten von Servern haben, die ich betreue. Also habe ich mein eigenes PowerShell CmdLet Get-DiskFreeSpace geschrieben, das den freien Speicherplatz auf jeder Festplatte aller Server überprüft. Außerdem wurde dieses CmdLet so geplant, dass es einmal pro Woche ausgeführt wird und einen Bericht als Excel-Tabelle erstellt, der an meine E-Mail gesendet wird, damit ich ihn überprüfen und niedrige freie Speicherplätze vermeiden kann.

Dieses Beispiel kann weiter ausgebaut werden, um für die Kapazitätsplanung verwendet zu werden und die Daten weiter an MS SQL Table zu senden und mit MS SQL Reporting Service zu kombinieren, um Graphen mit Trends der Plattenspeicherauslastung zu erhalten, um Upgrades und Erweiterungen des Speichers in der Zukunft zu planen.

Ich empfehle jedem, den Artikel zu diesem PowerShell Cmdlet „How To Get Disk Size And Disk Free Space Using PowerShell“ zu lesen.

How To Get Disk Size And Disk Free Space Using PowerShell
How To Get Disk Size And Disk Free Space Using PowerShell

Beispiel: Windows-Ereignisprotokolle auf Servern

Das zweite Beispiel gehört zu meiner monatlichen Wartungsroutine, um alle Windows-Ereignisprotokolle nach Fehlern zu durchsuchen, die auf den Servern auftreten, insbesondere in Bezug auf das Betriebssystem und geschäftskritische Anwendungen.

Zu diesem Zweck habe ich ein eigenes PowerShell-CmdLet Get-ErrorFromEventLog geschrieben, das die Windows-Ereignisprotokolle überprüft und auf allen Servern nach Fehlern sucht. Dieses Skript wurde so geplant, dass es einmal im Monat vor der Wartung ausgeführt wird, und außerdem würde es eine Excel-Tabelle erstellen, sodass es einfach ist, die Daten zu filtern und zu betrachten. Schließlich wurde ein Excel-Bericht an meine E-Mail-Adresse gesendet. So kann ich die Fehler überprüfen und darauf vorbereitet sein, notwendige Maßnahmen zu ergreifen und dieselben Fehler in der Zukunft zu vermeiden.

In diesem Sinne würde ich eine enorme Menge an Zeit sparen, indem ich nicht jeden Server manuell anmelden und jedes Windows-Ereignisprotokoll auf jedem Server manuell überprüfen müsste.

Wenn Sie eine Umgebung mit vielen Servern verwalten, empfehle ich Ihnen dringend, diese monatliche Routine zu übernehmen und sich den Artikel „How To Get Windows Event Logs Details Using PowerShell“ anzusehen.

How To Get Windows Event Logs Details Using PowerShell Featured
How To Get Windows Event Logs Details Using PowerShell

Ich hoffe, dass diese beiden Beispiele Ihre Ideen anregen, fantastische Möglichkeiten zu implementieren, indem Sie eine E-Mail mithilfe von PowerShell in Kombination mit anderen PowerShell-Funktionen senden.

Nützliche PowerShell-Artikel zum Senden von E-Mails

Hier sind einige nützliche Artikel und Ressourcen:

  • Send-MailMessage
  • DE0005: SmtpClient sollte nicht verwendet werden
  • MailKit
  • System.Net.Mail API
  • SmtpClient
  • NetworkCredential Klasse

Send-Email CmdLet – Quellcode

DISCLAIMER: Die Send-Email Funktion ist Teil des Efficiency Booster PowerShell Projekts und verwendet als solche andere CmdLets, die Teil des gleichen Projekts sind. Die beste Option für Sie, damit diese Funktion ohne zusätzliche Anpassungen funktioniert, ist also der Download des Quellcodes des gesamten Projekts von hier.

INFO: Ich kann jedem PowerShell-Skripter nur raten, das Schreiben eigener PowerShell Advanced Functions und CmdLets zu lernen und habe dazu mehrere Artikel geschrieben, die Sie bitte lesen. Wie man ein benutzerdefiniertes PowerShell CmdLet erstellt (Schritt für Schritt). Hier erkläre ich, wie man PowerShell-Zusatzfunktionen verwendet, um beim Schreiben von PowerShell-Funktionen schneller zu sein How To Write Advanced Functions Or CmdLets With PowerShell (Fast).

Hier ist der Quellcode des gesamten Send-Email CmdLet:

Hinweis: Damit dieses Beispiel für Sie funktioniert, ersetzen Sie bitte die Werte dieser Variablen durch Ihre eigenen Daten: $EmailFrom, $EmailTo, $SMTPserver, $EncryptedPasswordFile, $username.

<#.SYNOPSISSend email..DESCRIPTIONSend email..PARAMETER AttachmentsEmail attachments. File path to file(s) that will be attachments..PARAMETER PriorityEmail priority. Valid values are: Normal, High, and Low..PARAMETER errorlogWrite to Error log or not. Switch parameter. Error log is in PSLogs Folder of My documents..PARAMETER clientOK - O clientBK - B client.PARAMETER solutionFIN - Financial solution HR - Humane Resource solution.EXAMPLESend-Email -Attachments "$home\Documents\PSlogs\Error_Log.txt" -Priority "Normal" -errorlog -client "Test" -solution "Test" -Verbose.NOTESFunctionName : Send-EmailCreated by : Dejan MladenovicDate Coded : 09/23/2020 15:13:00More info : https://improvescripting.com/send-emails-using-powershell-with-many-examples/.LINK Send-MailMessagehttps://improvescripting.com/send-emails-using-powershell-with-many-examples/#>Function Send-Email {param ( ]$Attachments, $Priority = "Normal", $errorlog, $client, $solution)BEGIN { }PROCESS { try { Write-Verbose "Sending email..." if( $client -eq "OK" -and $solution -eq "FIN") { ##REPLACE THIS VALUE!!! $EmailFrom = "your_email" ##REPLACE THIS VALUE!!! $EmailTo = "your_email" $EmailSubject = "Report from Financial solution - OK client." $EmailBody = "This email has as attachments error log and report file from Financial Solution - OK client." ##REPLACE THIS VALUE!!! $SMTPserver= "your_SMTP_server" ##REPLACE THIS VALUE!!! $EncryptedPasswordFile = "$home\Documents\PSCredential\MailJet.txt" ##REPLACE THIS VALUE!!! $username="your_user_name" $password = Get-Content -Path $EncryptedPasswordFile | ConvertTo-SecureString $credential = New-Object System.Management.Automation.PSCredential($username, $password) ##Change this as splatting syntax in Send-MailMessage CmdLet Send-MailMessage -ErrorAction Stop -from "$EmailFrom" -to "$EmailTo" -subject "$EmailSubject" -body "$EmailBody" -SmtpServer "$SMTPserver" -Attachments $Attachments -Priority $Priority -Credential $credential -Port 587 } elseif ( $client -eq "Test" -and $solution -eq "Test" ) { ##REPLACE THIS VALUE!!! $EmailFrom = "your_email" ##REPLACE THIS VALUE!!! $EmailTo = "your_email" $EmailSubject = "Test of Send-Email cmdlet" $EmailBody = "This is test email." ##REPLACE THIS VALUE!!! $SMTPserver= "your_SMTP_server" ##REPLACE THIS VALUE!!! $EncryptedPasswordFile = "$home\Documents\PSCredential\MailJet.txt" ##REPLACE THIS VALUE!!! $username="your_user_name" $password = Get-Content -Path $EncryptedPasswordFile | ConvertTo-SecureString $credential = New-Object System.Management.Automation.PSCredential($username, $password) ##Change this as splatting syntax in Send-MailMessage CmdLet Send-MailMessage -ErrorAction Stop -from "$EmailFrom" -to "$EmailTo" -subject "$EmailSubject" -body "$EmailBody" -SmtpServer "$SMTPserver" -Attachments $Attachments -Priority $Priority -Credential $credential -Port 587 } Write-Verbose "Email sent." } catch { Write-Warning "There was a problem with sending email, check error log. Value of error is: $_" if ( $errorlog ) { $errormsg = $_.ToString() $exception = $_.Exception $stacktrace = $_.ScriptStackTrace $failingline = $_.InvocationInfo.Line $positionmsg = $_.InvocationInfo.PositionMessage $pscommandpath = $_.InvocationInfo.PSCommandPath $failinglinenumber = $_.InvocationInfo.ScriptLineNumber $scriptname = $_.InvocationInfo.ScriptName Write-Verbose "Start writing to Error log." Write-ErrorLog -hostname "Send Email was failing." -errormsg $errormsg -exception $exception -scriptname $scriptname -failinglinenumber $failinglinenumber -failingline $failingline -pscommandpath $pscommandpath -positionmsg $pscommandpath -stacktrace $stacktrace Write-Verbose "Finish writing to Error log." } }}END { }}#Send-Email -Attachments "$home\Documents\PSlogs\Error_Log.txt" -Priority "Normal" -errorlog -client "Test" -solution "Test" -Verbose

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.