将 PSCredential 保存在文件中

问题描述 投票:0回答:3

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

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 保存在文件中,以便将用户名和密码保存在一起吗?

powershell credentials
3个回答
54
投票

非 Windows 平台上的更新

自从第一次写这个答案以来,发生了很多变化。现代版本的 PowerShell 基于 .net core,并且跨平台运行。实现整个答案的底层类型称为

[securestring]
,支持它的安全性和加密来自 Windows 上的数据保护 API (DPAPI),它不是开源且不可跨平台使用。

因此,虽然您可以在非 Windows 平台上使用相同的代码,但请注意,绝对不会有加密支持。

tl;dr:不要在非 Windows 平台上使用此功能!

有关相关问题的精彩答案中提供了更多信息


要轻松存储和检索加密凭据,请使用 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"

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


4
投票

基于 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
}

可以将这段代码放入任何需要它的脚本中,从那时起问题或多或少就得到了解决。

如果应用程序允许,还可以在写入之前检查凭证是否成功。请注意,如果密码更改,用户必须删除该文件。 [编辑:代码中缺少括号]


0
投票

命令 Export-Clixml 绝对是最佳选择,但对于非 Windows 用户,请记住这一点,该命令来自 learn.microsoft.com 上的页面:重要 - Export-Clixml only 导出加密凭据在 Windows 上。在 macOS 和 Linux 等非 Windows 操作系统上,凭据将导出为存储为 Unicode 字符数组的纯文本。这提供了一些混淆,但不提供加密。

这是关于 Export-Clixml 的页面,其中有很好的帮助;示例 3 特别解决了将其用于此目的的问题,并附有我在上面粘贴的注释:https://learn.microsoft.com/en-us/powershell/module/microsoft.powershell.utility/export-clixml?view=powershell- 7.3

© www.soinside.com 2019 - 2024. All rights reserved.