使用PowerShell凭证而不被提示输入密码

我想重新启动一台属于域的远程计算机。我有一个管理员账户,但我不知道如何从powerhell中使用它。

我知道有一个 "Restart-Computer "cmdlet,而且我可以传递证书,但如果我的域是 "mydomain",我的用户名是 "myuser",我的密码是 "mypassword",使用它的正确语法如何?

我需要安排重启,这样我就不用输入密码了。

解决办法

Get-Credential "的问题是,它总是提示需要密码。有一个方法可以解决这个问题,但它涉及到将密码作为一个安全字符串存储在文件系统中。

下面的文章解释了这是如何工作的。

总之,你创建一个文件来存储你的密码(作为一个加密的字符串)。下面一行将提示你输入密码,然后把它作为一个加密的字符串存储在c:\mysecurestring.txt中。你只需要做这一次。

read-host -assecurestring | convertfrom-securestring | out-file C:\mysecurestring.txt

只要你在PowerShell命令中看到一个-Credential'参数,就意味着你可以传递一个PSCredential'。所以在你的例子中。

$username = "domain01\admin01"
$password = Get-Content 'C:\mysecurestring.txt' | ConvertTo-SecureString
$cred = new-object -typename System.Management.Automation.PSCredential `
         -argumentlist $username, $password

$serverNameOrIp = "192.168.1.1"
Restart-Computer -ComputerName $serverNameOrIp `
                 -Authentication default `
                 -Credential $cred

你可能需要一个不同的-Authentication开关值,因为我不知道你的环境。

评论(6)

有另一种方法,但...

如果你不想让你的密码出现在脚本文件中,请不要这样做。 (在脚本中存储密码并不是一个好主意,但我们中的一些人就是喜欢知道怎么做。)

好了,这就是警告,下面是代码。

$username = "John Doe"
$password = "ABCDEF"
$secstr = New-Object -TypeName System.Security.SecureString
$password.ToCharArray() | ForEach-Object {$secstr.AppendChar($_)}
$cred = new-object -typename System.Management.Automation.PSCredential -argumentlist $username, $secstr

$cred将有John Doe的证书,密码是"ABCDEF"。

另一种方法是将密码准备好供使用。

$password = convertto-securestring -String "notverysecretpassword" -AsPlainText -Force
评论(5)

关于存储证书,我使用了两个函数(通常是在一个从我的资料中加载的模块中)。

#=====================================================================
# Get-MyCredential
#=====================================================================
function Get-MyCredential
{
param(
$CredPath,
[switch]$Help
)
$HelpText = @"

    Get-MyCredential
    Usage:
    Get-MyCredential -CredPath `$CredPath

    If a credential is stored in $CredPath, it will be used.
    If no credential is found, Export-Credential will start and offer to
    Store a credential at the location specified.

"@
    if($Help -or (!($CredPath))){write-host $Helptext; Break}
    if (!(Test-Path -Path $CredPath -PathType Leaf)) {
        Export-Credential (Get-Credential) $CredPath
    }
    $cred = Import-Clixml $CredPath
    $cred.Password = $cred.Password | ConvertTo-SecureString
    $Credential = New-Object System.Management.Automation.PsCredential($cred.UserName, $cred.Password)
    Return $Credential
}

还有这个。

#=====================================================================
# Export-Credential
# Usage: Export-Credential $CredentialObject $FileToSaveTo
#=====================================================================
function Export-Credential($cred, $path) {
      $cred = $cred | Select-Object *
      $cred.password = $cred.Password | ConvertFrom-SecureString
      $cred | Export-Clixml $path
}

你这样使用它。

$Credentials = Get-MyCredential (join-path ($PsScriptRoot) Syncred.xml)

如果证书文件不存在,第一次会提示你,这时它将把证书存储在一个XML文件中的加密字符串中。当你第二次运行该行时,xml文件就在那里,并会自动打开。

评论(0)