Я пишу простой скрипт (Windows PowerShell) для отправки автоматических писем. Компьютер будет постоянно работать, собирая данные, а затем через регулярные промежутки времени отправляя электронные письма. Очевидно, что часть отправки электронного письма - это сбор учетных данных, и, поскольку он автоматизирован, у нас не может быть никого, кто бы каждый раз вводил пользователя и пароль. Очевидное решение - просто хранить информацию в переменных $ user и $ pass в скрипте, но мне это кажется ужасно небезопасным и подверженным атакам. Есть ли лучший способ сделать это? Может быть, один раз установить безопасное соединение с электронной почтой с адресом пользователя и не вводить его снова? Я новичок в PowerShell, поэтому я не совсем понимаю, как это сделать. В настоящее время я делаю следующее:
$from = '[email protected]'
$to = '[email protected]'
$smtpServer = 'smtp-mail.outlook.com'
$smtpPort = '587'
$mailSubject = 'PowerShell Script Email Test'
$password = 'p@ssword'
$mailBody = 'body text'
$credentials = New-Object System.Management.Automation.PSCredential -ArgumentList $from, $($password | ConvertTo-SecureString -AsPlainText -Force)
Send-MailMessage -To "$to" -From "$from" -Subject $mailSubject -SmtpServer $smtpServer -UseSsl -Credential $credentials -BodyAsHtml -Body $mailBody
Мы будем очень благодарны за любые советы или документацию для чтения.





Возможно, вы захотите изучить командлет Защитить-CMSMessage, который позволяет вам зашифровать / расшифровать данные с использованием криптографии с открытым ключом, чтобы только пользователи с правильным сертификатом могли расшифровать пароль.
Если это кажется излишним, другой, более простой, но, возможно, менее безопасный вариант - экспортировать учетные данные в XML и при необходимости прочитать их обратно.
Чтобы создать файл, сделайте следующее:
Get-Credential | Export-CliXml <path>\cred.xmlВ полученном XML-файле будут надежно сохранены имя пользователя и пароль, и его можно будет прочитать следующим образом:
$cred = Import-CliXml <path>\cred.xml
Затем вы можете передать $cred любому командлету, у которого есть параметр -Credential.
Пароль зашифрован таким образом, что его может открыть только тот же пользователь на том же компьютере, поэтому, если кто-то другой откроет его, он не сможет получить доступ к деталям. Очевидно, что если они смогут войти в систему как пользователь, который зашифровал его (или убедить этого пользователя запустить «плохой» скрипт), то у них будет доступ к деталям, но в остальном это довольно безопасно.
Третий вариант - использовать встроенный диспетчер учетных данных в Windows. Это требует некоторого сложного взаимодействия .NET для старых систем, но, к счастью, какой-то хороший человек уже проделал за вас тяжелую работу:
Диспетчер учетных данных PowerShell
В Windows 10 это немного проще:
Спасибо, экспорт в XML кажется мне лучшим вариантом для меня, я попробую реализовать что-то подобное!
@ P.Caruana - Я сам использую CliXml, потому что это просто и безопасно, но обратите внимание на его может открыть только один и тот же пользователь на том же компьютере. Полученные файлы пользователей и паролей никоим образом не переносимы.
@boxdog - у вас есть дополнительная информация о том, что CliXml менее безопасен?
@LievenKeersmaekers, нет, я просто немного параноик. Я использовал эту технику много раз, и у меня никогда не было проблем, но всегда казалось слишком простым добавить свои учетные данные в такой файл, и у меня всегда были мучительные сомнения, что есть какой-то способ (кроме входа в систему как вы) чтобы другие могли получить доступ к информации. На самом деле я не думаю, что это так.
Ух ты, это отлично работает! Это действительно простое решение, мне нравится его компактность.
Конечно, это небезопасно. Не делай этого. Изучите
SecureString,ConvertFrom-SecureStringиConvertTo-SecureString, чтобы узнать о способах защиты учетных данных при хранении.