Если вам нужно отправить электронное письмо - даже с вложением - с помощью скрипта PowerShell с логикой, которая создает и отправляет электронное письмо, вы можете выполнить его с помощью пакетного скрипта, передавая конфиденциальные значения в качестве аргументов, а не жестко кодирующие конфиденциальные значения в логика сценария
Сценарий PowerShell логика может принимать аргументы, такие как имя пользователя локального почтового ящика Gmail, пароль для аутентификации для отправки электронной почты, и все, что вы не хотите жестко закодированы в сценарии.
Внутри скрипта или функции вы можете ссылаться на безымянные аргументы, используя массив $ args, например, передавая все аргументы в командлет. Вы также можете ссылаться на конкретные аргументы по их позиции:
«Первый аргумент -« +
$Args[0]
»"Второй аргумент" +
$Args[1]
"
Вы также можете поместить логику в пакетный скрипт, чтобы он также имел аргументы, которые вы можете передавать чувствительным значениям во время выполнения, и использовать заполнители аргументов, а не жестко кодировать чувствительные значения.
Вы можете получить значение любого аргумента, используя
%
после него его числовую позицию в командной строке. Первый элемент передается всегда,%1
второй элемент всегда%2
и т. Д.% * в пакетном скрипте относится ко всем аргументам (например,
%1 %2 %3 %4 %5
...%255
только по аргументам,%1
на%9
которые можно ссылаться по номеру).
Таким образом, если сценарии открыты, конфиденциальные значения, которые необходимо защитить, не будут выставлены или жестко закодированы в логике сценария для тех, кто может видеть, кто может иметь доступ для чтения к сценарию.
Важное примечание. Внизу каждого примера сценария PowerShell есть раздел с именем « Пакетный сценарий выполнения», в котором есть логика, которую нужно использовать из пакетного сценария для выполнения, или что угодно, поэтому вы будете использовать полный путь имени пользователя, пароля и / или вложения в качестве соответствующие аргументы для пакетного сценария, т.е.sendemail.bat "<GmailAccountName>" "<GmailPassword>" "<FullPathAttachment>"
Скрипт PowerShell (без вложений)
$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)
Пакетный сценарий выполнения
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 (с вложением)
$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)
Пакетный сценарий выполнения
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%'"
Пакетный скрипт (динамический)
Вот динамический пакетный сценарий «все в одном», в котором вы просто передаете имя пользователя учетной записи Gmail, пароль учетной записи Gmail и полный путь к вложению.
@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
Вы выполняете пакетный скрипт следующим образом., ,
sendemail.bat "<GmailAccountName>" "<GmailPassword>" "<FullPathAttachment>"
Пакетный скрипт (статический и самоуничтожающийся)
Этот сценарий будет иметь жестко закодированные значения, заданные в переменных GmailAccount=
, GmailPassword=
и, Attachment=
но как только выполняется, он удалит [сам] скрипт целиком с помощью "%~FN0"
которой 0
является сам скрипт. Это означает, что вы захотите убедиться, что скопировали этот сценарий, а затем запускаете копию только с машин, на которых вы будете запускать, где вы не хотите, чтобы эта информация была раскрыта.
@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
Дополнительные ресурсы
- Конструкторы MailMessage
- Конструкторы вложений
- SmtpClient Constructors
- Свойство SmtpClient.EnableSsl
- NetworkCredential Constructors
Переменные замены (FOR /?)
Кроме того, была улучшена замена ссылок на переменные FOR. Теперь вы можете использовать следующий необязательный синтаксис:
%~I - expands %I removing any surrounding quotes (") %~nI - expands %I to a file name only %~fI - expands %I to a fully qualified path name