【问题标题】:How can I use encrypted secure password in smtp credentials如何在 smtp 凭据中使用加密的安全密码
【发布时间】:2017-05-26 06:17:04
【问题描述】:

在我的 .ps1 文件中,我想执行一项工作并通过电子邮件发送结果。我希望密码不可读,所以我事先通过这样做来加密它。

$password = read-host -prompt "Enter your Password"
write-host "$password is password"
$secure = ConvertTo-SecureString $password -force -asPlainText
$bytes = ConvertFrom-SecureString $secure
$bytes | out-file .\securepassword.txt

到目前为止工作正常。

然后我想在 .ps1 中使用安全密码,这是我遇到困难的地方。我尝试了很多变化,但我认为这是我迄今为止最可靠的尝试:

 $usercred = "myemail@gmail.com"
 $encryptedpw = Get-Content .\securepassword.txt
 $pwcred = $ecryptedpw | ConvertTo-SecureString

当我尝试在我的$smtp.credentials 中使用它时:

$smtp.Credentials = New-Object System.Net.NetworkCredential($usercred, $pwcred);

它在$smtp.send($msg)处输出以下错误The SMTP server requires a secure connection or the client was not authenticated. The server response was: 5.5.1 Authentication Required.

而且我知道密码是问题所在(至少我很确定),因为如果我手动输入密码,它就可以正常工作。有什么想法吗?

_ 编辑 1 _

如果有人想知道,下面是整个发送邮件部分:

# Send Notification if alert $i is greater then 0 
if ($i -gt 0) 
{ 
    foreach ($user in $users) 
{ 

  $smtpServer = "smtp.gmail.com" 
  $port = "587"
  $smtp.EnableSSL = $true
  $smtp = New-Object Net.Mail.SmtpClient($smtpServer, $port) 
  $smtp.EnableSsl = $true 
  $smtp.Credentials = New-Object System.Net.NetworkCredential($usercred, $pwcred);
  $msg = New-Object Net.Mail.MailMessage 
  $msg.To.Add($user) 
        $msg.From = "myemail@gmail.com" 
  $msg.Subject = "Environment DiskSpace Report for $titledate" 
        $msg.IsBodyHTML = $true 
        $msg.Body = get-content $blablabla
  $smtp.Send($msg) 
        $body = "" 
    } 
  } 

【问题讨论】:

  • stackoverflow.com/questions/12460950/… 也有类似的问题,他们建议添加$smtp.EnableSsl = $true
  • 嗨 Micky,我也试过了。我将编辑帖子以添加整个发送邮件部分。无论如何,谢谢!
  • 如果不使用 SecureString 创建 NetworkCredential,而是将密码以纯文本形式传递给它,会发生什么?
  • 如果我这样做,例如($usercred, "Password123"),那将起作用。
  • 你为什么不用Send-MailMessage

标签: powershell powershell-3.0


【解决方案1】:

感谢这里的一些输入,我能够找到解决方案。我认为另一个因素也在其中发挥了作用。

1) 我从另一台机器上加密了密码,我显然不应该这样做。我注意到加密的结果会根据执行加密的计算机而有所不同(请随意解释这一点)。

2) 我最终得到的代码如下:

$usercred = "myemail@gmail.com" $encryptedpw = Get-Content .\securepassword.txt $password = ConvertTo-SecureString -String $encryptedpw

然后

$smtp.Credentials = New-Object System.Net.NetworkCredential($usercred, $password);

【讨论】:

  • SecureStrings 是使用 DPAPI 存储的,这基本上意味着它是使用用户的凭据加密的。如果您在不同的 PC 上,您将无法使用相同的用户(除非它是域用户),因此您将没有必要的信息来解密字符串。
【解决方案2】:

根据link 的回答,您可以尝试以下方法:

$cred=New-Object -TypeName System.Management.Automation.PSCredential -ArgumentList $User, (Get-Content $FileWhereYouIsStored | ConvertTo-SecureString)
$smtp.Credentials = New-Object System.Net.NetworkCredential($cred.UserName, $cred.Password);

希望有帮助

【讨论】:

  • 感谢您的建议。我尝试过类似的东西,但这个有点不同。但是,它似乎输出相同的错误。很奇怪吧?
猜你喜欢
  • 1970-01-01
  • 2021-10-31
  • 2012-10-05
  • 1970-01-01
  • 2013-11-19
  • 2011-02-07
  • 2012-06-14
  • 1970-01-01
  • 2011-06-29
相关资源
最近更新 更多