当密码在外部文件中受到保护时,我尝试使用带有安全凭据的WinSCP .NET程序集。
# Load WinSCP .NET assembly
Add-Type -Path "D:\WinSCPnet.dll"
# Setup session options
$sessionOptions = New-Object WinSCP.SessionOptions
$sessionOptions.Protocol = [WinSCP.Protocol]::Sftp
# Env
$sessionOptions.HostName = "blabla.com"
$sessionOptions.UserName = "UUUU"
#$sessionOptions.Password = "PPPP"
$sessionOptions.SshHostKeyFingerprint = "XXXXXXXXX"
$remotePath = "/home/UUUU/"
使用硬编码密码工作。如果我想使用securestring作为密码,我应该怎么做?
我试过了:
read-host -assecurestring | convertfrom-securestring | out-file D:\securestring.txt
将安全密码保存在文件中。然后,在我的脚本中,我得到了回复:
$sessionOptions.Password = get-Content D:\securestring.txt | convertto-securestring
$Cred = new-object -typename System.Management.Automation.PSCredential -argumentlist $sessionOptions.UserName, $sessionOptions.Password}
但它不起作用......
答案 0 :(得分:4)
自WinSCP 5.7起,程序集使用SecureString
接受SessionOptions.SecurePassword
。
请参阅https://winscp.net/eng/docs/library_sessionoptions
感谢鼓舞人心的this improvement。
虽然程序集将密码保存在内存中,但它仍然需要最终解密。限制解密密码的内部副本的改进正在等待。
答案 1 :(得分:2)
正如@Matt所指出的,WinSCP .Net程序集不接受安全字符串或凭证对象。您需要将密码作为纯文本字符串传递。您可以将secure string存储在文件中:
Read-Host 'Enter password' -AsSecureString |
ConvertFrom-SecureString |
Out-File 'C:\password.txt'
并使用PSCredential
对象从文件中读取后从安全字符串中检索解密的密码:
$un = 'username'
$pw = Get-Content 'C:\password.txt' | ConvertTo-SecureString
$cred = New-Object Management.Automation.PSCredential $un, $pw
try {
Add-Type -Path 'WinSCPnet.dll'
$opt = New-Object WinSCP.SessionOptions
$opt.Protocol = [WinSCP.Protocol]::Sftp
$opt.HostName = 'example.org'
$opt.UserName = $cred.UserName
$opt.Password = $cred.GetNetworkCredential().Password
$opt.SshHostKeyFingerprint = 'ssh-rsa 2048 ...'
$sftp = New-Object WinSCP.Session
$sftp.Open($opt)
...
} catch {
...
} finally {
if ($sftp) { $sftp.Dispose() }
}
WinSCP示例代码取自documentation。
但请注意,密码必须由运行SFTP PowerShell脚本的同一用户保存,因为加密密钥是从该用户的密码派生的。
答案 2 :(得分:1)
根据WinSCP,password属性只支持一个字符串。因此,尝试传递安全字符串将无法正常工作。如果确实想要将密码存储在文件中,您可以尝试将其存储为安全字符串,但一般来说只有really bad idea,因为它可以很容易地解除安全性(同样不确定是否可能)。我推荐以下选项。
# Only stored in memory which is safer.
$sessionOptions.Password = read-host
如果你有其他的东西,你可以试试这个。只是因为以前的原因知道我不宽恕这一点。此外,我必须看看它是否有效,因为它看起来你不能输出securestring
到文件。
read-host | out-file D:\securestring.txt
$sessionOptions.Password = get-Content D:\securestring.txt
Ansgar解释了我不知道的可能性。您可以将安全字符串存储在文件中,并在其他地方使用它。