是的,您可以使用ConvertTo-SecureString和ConvertFrom-SecureString cmdlet 对密码进行加密,然后再将其保存到磁盘上的文件中。
但是,请记住,您需要一个加密密钥才能使用 cmdlet 加密/解密密码。从文档中:
如果使用Key
orSecureKey
参数指定加密密钥,则使用高级加密标准 (AES) 加密算法。指定密钥的长度必须为 128、192 或 256 位,因为这些是 AES 加密算法支持的密钥长度。
如果未指定密钥,则将使用 Windows 数据保护 API (DPAPI) 进行加密。这意味着密钥将与调用 cmdlet 的用户帐户相关联。现在,如果您将脚本作为计划作业运行,则此解决方案可以正常工作。
下面是几个脚本,它们将使用生成的密钥将加密密码保存并读取到磁盘上的 XML 文件中:
function Get-SecurePassword {
<#
.Synopsis
Gets a password stored securely in an XML file.
.Parameter Path
The path to the XML file to import the password from.
#>
[CmdletBinding()]
param(
[Parameter(Position=1)]
[string]$Path = "Password.xml"
)
if (Test-Path $Path) {
$cache = Import-Clixml $Path
$key = [System.Convert]::FromBase64String($cache.Secret)
$password = $cache.EncryptedPassword | ConvertTo-SecureString -Key $key
$password
}
}
function Set-SecurePassword {
<#
.Synopsis
Stores a password securely in an XML file.
.Parameter Path
The path to the XML file to export the password to.
#>
[CmdletBinding()]
param(
[Parameter(Position=1)]
[string]$Password,
[Parameter(Position=2)]
[string]$Path = "Password.xml"
)
$key = New-StrongPasswordBytes -Length 32
$textualKey = [System.Convert]::ToBase64String($key)
$securePassword = $Password | ConvertFrom-SecureString -Key $key
$cache = New-Object PSObject -Property @{ "EncryptedPassword" = $securePassword; "Secret" = $textualKey }
$cache.PSObject.TypeNames.Insert(0, "SecurePassword")
$cache | Export-Clixml $Path
}
function New-StrongPasswordBytes ($length) {
Add-Type -Assembly System.Web
$password = [System.Web.Security.Membership]::GeneratePassword($length, $length / 2)
[System.Text.Encoding]::UTF8.GetBytes($password)
}