将PSCredential保存在文件中

时间:2016-10-13 19:19:32

标签: powershell credentials

我知道我可以将密码保存到文件中:

Read-Host "Enter Password" -AsSecureString |  ConvertFrom-SecureString | Out-File $passwordfile

并从文件中读取:

$secpasswd = (Get-Content $passwordfile | ConvertTo-SecureString)

然后创建PSCredential对象:

$credential = New-Object System.Management.Automation.PSCredential($user, $secpasswd)

但是我可以在文件中保存$ credential,所以用户名和密码保存在一起吗?

2 个答案:

答案 0 :(得分:26)

要轻松存储和检索加密凭据,请使用PowerShell的内置XML序列化(Clixml):

$credential = Get-Credential

$credential | Export-CliXml -Path 'C:\My\Path\cred.xml'

重新导入:

$credential = Import-CliXml -Path 'C:\My\Path\cred.xml'

要记住的重要一点是,默认情况下,它使用Windows数据保护API,用于加密密码的密钥特定于运行代码的用户和计算机

因此,加密凭证不能由其他用户导入,也不能导入其他计算机上的同一用户。

通过使用不同的正在运行的用户和不同的计算机加密同一凭据的多个版本,您可以为多个用户提供相同的机密。

通过将用户和计算机名称放在文件名中,您可以以允许相同代码使用它们的方式存储所有加密机密,而无需对任何内容进行硬编码:

加密器

# run as each user, and on each computer

$credential = Get-Credential

$credential | Export-CliXml -Path "C:\My\Secrets\myCred_${env:USERNAME}_${env:COMPUTERNAME}.xml"

使用存储凭据的代码:

$credential = Import-CliXml -Path "C:\My\Secrets\myCred_${env:USERNAME}_${env:COMPUTERNAME}.xml"

正在运行的用户文件的正确版本将自动加载(或者因为文件不存在而失败)。

答案 1 :(得分:0)

建立在Briantist&Graham的基础上:这将要求一个证书并将其存储在第一次运行时,然后在以后的运行中从同一代码重复使用它。在我的情况下,驱动器H是用户的主目录,用于整理而不是安全。

# the path to stored credential
$credPath = "H:\Secrets\Cred_${env:USERNAME}_${env:COMPUTERNAME}.xml"
# check for stored credential
if ( Test-Path $credPath ) {
    #crendetial is stored, load it 
    $cred = Import-CliXml -Path $credPath
} else {
    # no stored credential: create store, get credential and save it
    $parent = split-path $credpath -parent
    if ( -not test-Path $parent) {
        New-Item -ItemType Directory -Force -Path $parent
    }
    $cred = get-credential
    $cred | Export-CliXml -Path $credPath
}

此代码块可放入需要它的任何脚本中,此后问题或多或少得以解决。

如果应用程序允许,也可以在写入证书之前检查其是否成功。请注意,如果密码更改,则用户必须删除该文件。