将 PSCredential 保存在文件中
save PSCredential in the file
我知道我可以将密码保存到文件中:
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保存在文件里,让用户名和他的密码一起保存吗?
在非Windows 平台
上更新
自从第一次写这个答案以来,发生了很多变化。现代版本的 PowerShell 基于 .net 核心,运行 跨平台。支持整个答案的基础类型称为 [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,用于加密密码的密钥特定于 用户和代码 运行ning 所在的机器。
因此,不同用户或不同计算机上的同一用户均无法导入加密凭据。
通过在不同的 运行ning 用户和不同的计算机上加密同一凭证的多个版本,您可以让多个用户使用相同的秘密。
通过将用户名和计算机名放在文件名中,您可以以一种允许相同代码使用它们而无需硬编码任何内容的方式存储所有加密的秘密:
加密器
# 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"
运行ning 用户的文件的正确版本将自动加载(否则加载失败,因为文件不存在)。
建立在 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
}
可以将这段代码块放入任何需要它的脚本中,从那时起问题或多或少就解决了。
如果应用程序允许,也可以在写入之前检查成功的凭据。请注意,如果密码更改,用户必须删除该文件。 [编辑:代码中缺少括号]
我知道我可以将密码保存到文件中:
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保存在文件里,让用户名和他的密码一起保存吗?
在非Windows 平台
上更新自从第一次写这个答案以来,发生了很多变化。现代版本的 PowerShell 基于 .net 核心,运行 跨平台。支持整个答案的基础类型称为 [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,用于加密密码的密钥特定于 用户和代码 运行ning 所在的机器。
因此,不同用户或不同计算机上的同一用户均无法导入加密凭据。
通过在不同的 运行ning 用户和不同的计算机上加密同一凭证的多个版本,您可以让多个用户使用相同的秘密。
通过将用户名和计算机名放在文件名中,您可以以一种允许相同代码使用它们而无需硬编码任何内容的方式存储所有加密的秘密:
加密器
# 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"
运行ning 用户的文件的正确版本将自动加载(否则加载失败,因为文件不存在)。
建立在 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
}
可以将这段代码块放入任何需要它的脚本中,从那时起问题或多或少就解决了。
如果应用程序允许,也可以在写入之前检查成功的凭据。请注意,如果密码更改,用户必须删除该文件。 [编辑:代码中缺少括号]