2014-10-05 91 views
2

我想使用WinSCP .NET程序集與安全證書,當密碼保護在外部文件中。PowerShell使用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} 

但它不工作...

回答

1

根據WinSCP密碼屬性只是支持的字符串。所以試圖通過一個安全的字符串將無法正常工作。如果你確實想要將密碼存儲在一個文件中,你可以嘗試將它作爲安全字符串存儲,但這通常是一個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's解釋了我不知道是可能的。您可以將安全字符串存儲在一個文件中並在其他地方使用。

+0

WinSCP .NET程序集已經支持'SecureString',請參見[我的答案](http://stackoverflow.com/a/26279430/850848)。 – 2015-06-02 20:21:09

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腳本的同一用戶保存,因爲加密密鑰是從該用戶的密碼派生的。

+0

WinSCP .NET程序集已經支持'SecureString',請參閱[我的答案](http://stackoverflow.com/a/26279430/850848)。 – 2015-06-02 20:21:03

+0

在添加'SecureString'支持之前,我沒有寫過答案。 ;)非常感謝你的工作,順便說一句。 – 2015-06-02 20:26:06

+0

我知道這就是爲什麼我寫「已經」:) – 2015-06-02 20:39:07

相關問題