代码之家  ›  专栏  ›  技术社区  ›  Alexan Amani Kanu

在文件中保存PSCredential

  •  26
  • Alexan Amani Kanu  · 技术社区  · 8 年前

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

    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)
    

    2 回复  |  直到 8 年前
        1
  •  52
  •   briantist    4 年前

    非Windows平台上的更新

    自从第一次写下这个答案以来,发生了很多变化。现代版本的PowerShell基于.net核心,跨平台运行。启用整个答案的基础类型称为 [securestring] 支持它的安全和加密来自Windows上的数据保护API(DPAPI),即 非开源 并且跨平台不可用。

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

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

    More information available in this excellent answer on a related question .


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

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

        2
  •  3
  •   jim birch    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
    }
    

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

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