Если вам нужно отправить электронное письмо - даже с вложением - с помощью скрипта PowerShell с логикой, которая создает и отправляет электронное письмо, вы можете выполнить его с помощью пакетного скрипта, передавая конфиденциальные значения в качестве аргументов, а не жестко кодирующие конфиденциальные значения в логика сценария
Логика скрипта PowerShell может принимать такие аргументы, как имя пользователя локального почтового ящика Gmail, пароль для аутентификации при отправке электронной почты и все, что вы не хотите жестко запрограммировать в сценарии.
PowerShell Args
Внутри скрипта или функции вы можете ссылаться на безымянные аргументы, используя массив $ 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
Дополнительные ресурсы