Wenn Sie eine E-Mail - auch mit einem Anhang - senden müssen, indem Sie ein PowerShell-Skript mit der Logik zum Erstellen und Senden der E- Mail verwenden, können Sie sie über ein Stapelskript ausführen, wobei vertrauliche Werte als Argumente übergeben werden, anstatt empfindliche Werte hart zu codieren die Skriptlogik.
Die PowerShell- Skriptlogik kann Argumente akzeptieren, z. B. den Benutzernamen des lokalen Google Mail-Postfachs, das zu authentifizierende Kennwort für das Senden von E-Mails und alle anderen Elemente, die im Skript nicht fest codiert werden sollen.
Innerhalb eines Skripts oder einer Funktion können Sie mit dem Array $ args auf nicht benannte Argumente verweisen, beispielsweise indem Sie alle Argumente an ein Cmdlet übergeben. Sie können sich auch auf bestimmte Argumente über ihre Position beziehen:
"Das erste Argument ist" +
$Args[0]
""Zweites Argument ist" +
$Args[1]
"
Sie können auch eine Logik in das Batch-Skript einfügen, damit auch Argumente zur Verfügung stehen, mit denen Sie zur Ausführungszeit sensible Werte übergeben und Argumentplatzhalter verwenden können, anstatt empfindliche Werte fest zu codieren.
Sie können den Wert eines beliebigen Arguments abrufen,
%
indem Sie eine numerische Position in der Befehlszeile verwenden. Der erste übergebene Artikel ist immer%1
der zweite Artikel ist immer%2
und so weiter% * in einem Batch-Skript bezieht sich auf alle Argumente (z. B.
%1 %2 %3 %4 %5
...%255
nur Argumente,%1
auf%9
die durch Nummer verwiesen werden kann).
Auf diese Weise werden die sensiblen Werte, die Sie schützen müssen, beim Öffnen der Skripts weder offengelegt noch in die Skriptlogik eingebettet, sodass jeder sehen kann, der Lesezugriff auf das Skript hat.
Wichtiger Hinweis: Am Ende jedes PowerShell-Skript-Beispiels befindet sich ein Abschnitt mit dem Namen " Batch Execute Script" (Batch Execute Script), das die Logik enthält, die vom Batch-Skript zur Ausführung verwendet werden soll. Geben Sie dabei den Benutzernamen, das Kennwort und / oder den vollständigen Pfad als Anhang ein entsprechende Argumente für den Batch - Skript dhsendemail.bat "<GmailAccountName>" "<GmailPassword>" "<FullPathAttachment>"
PowerShell-Skript (kein Anhang)
$Username = $args[0] $EmailPassword = $args[1] $Username = $Username $EmailTo = "EmailAddress@domain.com" $EmailFrom = "noreply@Whatever.notify" $Subject = "Email Subject" $Body = "Email Body" $SMTPServer = "smtp.gmail.com" $SMTPMessage = New-Object System.Net.Mail.MailMessage($EmailFrom, $EmailTo, $Subject, $Body) $SMTPClient = New-Object Net.Mail.SmtpClient($SmtpServer, 587) $SMTPClient.EnableSsl = $true $SMTPClient.Credentials = New-Object System.Net.NetworkCredential($Username, $EmailPassword); $SMTPClient.Send($SMTPMessage)
Batch Execute Script
SET GmailAccount=%~1 SET GmailPassword=%~2 SET PowerShellDir=C:\Windows\System32\WindowsPowerShell\v1.0 CD /D "%PowerShellDir%" Powershell -ExecutionPolicy Bypass -Command "& 'C:\Scripts\SendEmail.ps1' '%GmailAccount%' '%GmailPassword%'"
PowerShell-Skript (mit Anhang)
$Username = $args[0] $EmailPassword = $args[1] $Attachment = $args[2] $Username = $Username $EmailTo = "EmailAddress@domain.com" $EmailFrom = "noreply@Whatever.notify" $Subject = "Email Subject" $Body = "Email Body" $SMTPServer = "smtp.gmail.com" $SMTPMessage = New-Object System.Net.Mail.MailMessage($EmailFrom, $EmailTo, $Subject, $Body) $Attachment = New-Object System.Net.Mail.Attachment($Attachment) $SMTPMessage.Attachments.Add($Attachment) $SMTPClient = New-Object Net.Mail.SmtpClient($SmtpServer, 587) $SMTPClient.EnableSsl = $true $SMTPClient.Credentials = New-Object System.Net.NetworkCredential($Username, $EmailPassword); $SMTPClient.Send($SMTPMessage)
Batch Execute Script
SET GmailAccount=%~1 SET GmailPassword=%~2 SET Attachment=%~3 SET PowerShellDir=C:\Windows\System32\WindowsPowerShell\v1.0 CD /D "%PowerShellDir%" Powershell -ExecutionPolicy Bypass -Command "& 'C:\Scripts\SendEmail.ps1' '%GmailAccount%' '%GmailPassword%' '%Attachment%'"
Batch-Skript (dynamisch)
Hier ist ein dynamisches All-in-One-Batch-Skript, bei dem Sie einfach den Benutzernamen des Google Mail-Kontos, das Passwort für das Google Mail-Konto und den vollständigen Pfad zum Anhang übergeben.
@ECHO OFF SET GmailAccount=%~1 SET GmailPassword=%~2 SET Attachment=%~3 CALL :PowerShell CD /D "%PowerShellDir%" Powershell -ExecutionPolicy Bypass -Command "& '%PSScript%' '%GmailAccount%' '%GmailPassword%' '%Attachment%'" EXIT :PowerShell SET PowerShellDir=C:\Windows\System32\WindowsPowerShell\v1.0 SET PSScript=%temp%\~tmpSendeMail.ps1 IF EXIST "%PSScript%" DEL /Q /F "%PSScript%" ECHO $Username = $args[0]>> "%PSScript%" ECHO $EmailPassword = $args[1]>> "%PSScript%" ECHO $Attachment = $args[2]>> "%PSScript%" ECHO >> "%PSScript%" ECHO $Username = $Username >> "%PSScript%" ECHO $EmailTo = "EmailAddress@domain.com" >> "%PSScript%" ECHO $EmailFrom = "noreply@Whatever.notify" >> "%PSScript%" ECHO $Subject = "Email Subject" >> "%PSScript%" ECHO $Body = "Email Body" >> "%PSScript%" ECHO $SMTPServer = "smtp.gmail.com" >> "%PSScript%" ECHO $SMTPMessage = New-Object System.Net.Mail.MailMessage($EmailFrom, $EmailTo, $Subject, $Body) >> "%PSScript%" ECHO $Attachment = New-Object System.Net.Mail.Attachment($Attachment) >> "%PSScript%" ECHO $SMTPMessage.Attachments.Add($Attachment) >> "%PSScript%" ECHO $SMTPClient = New-Object Net.Mail.SmtpClient($SmtpServer, 587) >> "%PSScript%" ECHO $SMTPClient.EnableSsl = $true >> "%PSScript%" ECHO $SMTPClient.Credentials = New-Object System.Net.NetworkCredential($Username, $EmailPassword) >> "%PSScript%" ECHO $SMTPClient.Send($SMTPMessage) >> "%PSScript%" GOTO :EOF
Sie führen das Batch-Skript so aus. . .
sendemail.bat "<GmailAccountName>" "<GmailPassword>" "<FullPathAttachment>"
Batch-Skript (statisch und selbstlöschend)
Für dieses Skript werden die hartcodierten Werte in den Variablen von GmailAccount=
, festgelegt GmailPassword=
. Attachment=
Sobald es jedoch ausgeführt wird, wird es das Skript vollständig löschen, und zwar dort, "%~FN0"
wo 0
sich das Skript selbst befindet. Dies bedeutet, dass Sie sicher sein möchten, dass Sie dieses Skript kopieren und dann die Kopie nur von den Maschinen ausführen, die Sie ausführen, wenn diese Informationen nicht verfügbar gemacht werden sollen.
@ECHO OFF SET GmailAccount=<GmailAccountName> SET GmailPassword=<GmailPassword> SET Attachment=<FullAttachmentPath> CALL :PowerShell CD /D "%PowerShellDir%" Powershell -ExecutionPolicy Bypass -Command "& '%PSScript%' '%GmailAccount%' '%GmailPassword%' '%Attachment%'" IF EXIST "%~FN0" DEL /Q /F "%~FN0" EXIT :PowerShell SET PowerShellDir=C:\Windows\System32\WindowsPowerShell\v1.0 SET PSScript=%temp%\~tmpSendeMail.ps1 IF EXIST "%PSScript%" DEL /Q /F "%PSScript%" ECHO $Username = $args[0]>> "%PSScript%" ECHO $EmailPassword = $args[1]>> "%PSScript%" ECHO $Attachment = $args[2]>> "%PSScript%" ECHO >> "%PSScript%" ECHO $Username = $Username >> "%PSScript%" ECHO $EmailTo = "EmailAddress@domain.com" >> "%PSScript%" ECHO $EmailFrom = "noreply@Whatever.notify" >> "%PSScript%" ECHO $Subject = "Email Subject" >> "%PSScript%" ECHO $Body = "Email Body" >> "%PSScript%" ECHO $SMTPServer = "smtp.gmail.com" >> "%PSScript%" ECHO $SMTPMessage = New-Object System.Net.Mail.MailMessage($EmailFrom, $EmailTo, $Subject, $Body) >> "%PSScript%" ECHO $Attachment = New-Object System.Net.Mail.Attachment($Attachment) >> "%PSScript%" ECHO $SMTPMessage.Attachments.Add($Attachment) >> "%PSScript%" ECHO $SMTPClient = New-Object Net.Mail.SmtpClient($SmtpServer, 587) >> "%PSScript%" ECHO $SMTPClient.EnableSsl = $true >> "%PSScript%" ECHO $SMTPClient.Credentials = New-Object System.Net.NetworkCredential($Username, $EmailPassword) >> "%PSScript%" ECHO $SMTPClient.Send($SMTPMessage) >> "%PSScript%" GOTO :EOF
Weitere Ressourcen
- MailMessage-Konstruktoren
- Befestigungskonstruktoren
- SmtpClient-Konstruktoren
- SmtpClient.EnableSsl-Eigenschaft
- NetworkCredential-Konstruktoren
Variablensubstitutionen (FOR /?)
Darüber hinaus wurde die Ersetzung von FOR-Variablenreferenzen verbessert. Sie können jetzt die folgende optionale Syntax verwenden:
%~I - expands %I removing any surrounding quotes (") %~nI - expands %I to a file name only %~fI - expands %I to a fully qualified path name