我可以使用PowerShell SecureString更改服务器管理员密码吗?

时间:2013-01-22 08:50:22

标签: powershell passwords powershell-v2.0 securestring

我正在寻找一个脚本,它将使用PowerShell更改远程服务器上的管理员密码。以下命令将执行此操作

$Admin=[adsi]("WinNT://" + MyServer + "/Administrator, user")
$Admin.SetPassword("NewPassword")

但我希望能够隐藏脚本中的"NewPassword"以使其更安全。

那么有没有办法将"NewPassword"保存到安全的.txt文件中,然后才能像这样使用它?

$Admin.SetPassword("$secureFile")

该脚本将作为计划任务运行。

1 个答案:

答案 0 :(得分:1)

,您可以使用ConvertTo-SecureStringConvertFrom-SecureString cmdlet加密密码,然后再将其保存到磁盘上的文件中。

但是,请记住您需要加密密钥才能使用cmdlet加密/解密密码。来自the documentation

  

如果使用KeySecureKey指定加密密钥   参数,高级加密标准(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)
}