Я хочу отправить файл в свою учетную запись Gmail через файл bat и зашифровать информацию о моей электронной почте в этом файле bat, чтобы, если кто-то откроет файл bat, он не мог получить информацию о нем из электронной почты.

Логика такая как:

  1. проверьте, правильно ли работает интернет

    • если все в порядке, отправьте файл, а затем удалите файл bat
  2. проверьте, правильно ли работает интернет

    • если нет Запланируйте это сделать позже или добавьте его к запуску

    • когда закончите, удалите его из расписания или запуска!

1 ответ1

5

Если вам нужно отправить электронное письмо - даже с вложением - с помощью скрипта 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

Дополнительные ресурсы

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .