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

问题描述 投票:133回答:8

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

我知道有一个Restart-Computer cmdlet,我可以通过凭证,但如果我的域名是mydomain,我的用户名是myuser,我的密码是mypassword什么是正确的语法使用它?

我需要安排重启,所以我不必输入密码。

powershell powershell-remoting
8个回答
191
投票

Get-Credential的问题是它总是会提示输入密码。然而,有一种解决方法,但它涉及将密码存储为文件系统上的安全字符串。

以下文章解释了这是如何工作的:

Using PSCredentials without a prompt

总之,您创建一个文件来存储您的密码(作为加密字符串)。以下行将提示输入密码,然后将其作为加密字符串存储在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
                 <any other parameters relevant to you>

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


68
投票

还有另一种方式,但......

如果你不想在脚本文件中输入密码,请不要这样做(在脚本中存储密码不是一个好主意,但我们中的一些人只是想知道如何。)

好的,这是警告,这是代码:

$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

29
投票

关于存储凭证,我使用两个函数(通常在从我的配置文件加载的模块中):

#=====================================================================
# 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文件中的加密字符串中。第二次运行该行时,xmlfile就会出现并自动打开。


9
投票

我必须从需要不同凭据的远程服务器运行SCOM 2012功能。我通过将密码解密函数的输出作为输入传递给ConvertTo-SecureString来避免使用明文密码。为清楚起见,此处未显示。

我喜欢强烈地输入我的声明。 $ strPass的类型声明正常工作。

[object] $objCred = $null
[string] $strUser = 'domain\userID'
[System.Security.SecureString] $strPass = '' 

$strPass = ConvertTo-SecureString -String "password" -AsPlainText -Force
$objCred = New-Object -TypeName System.Management.Automation.PSCredential -ArgumentList ($strUser, $strPass)

4
投票

如果您要安排重新启动,可以使用以下两种方法执行此操作。

首先,您可以使用具有连接和重新启动另一台计算机所需权限的凭据在一台计算机上创建任务。这使得调度程序负责安全地存储凭证。重启命令(我是一个Powershell家伙,但这个更干净。)是:

SHUTDOWN /r /f /m \\ComputerName

在本地计算机上创建计划任务以远程重新启动另一计划任务的命令行将是:

SCHTASKS /Create /TN "Reboot Server" /TR "shutdown.exe /r /f /m \\ComputerName" /SC ONCE /ST 00:00 /SD "12/24/2012" /RU "domain\username" /RP "password"

我更喜欢第二种方式,您可以使用当前凭据创建与远程计算机上的系统帐户一起运行的计划任务。

SCHTASKS /Create /TN "Reboot Server" /TR "shutdown.exe /r /f" /SC ONCE /ST 00:00 /SD "12/24/2012" /RU SYSTEM /S ComputerName

这也可以通过GUI工作,只需输入SYSTEM作为用户名,将密码字段留空。


0
投票
read-host -assecurestring | convertfrom-securestring | out-file C:\securestring.txt
$pass = cat C:\securestring.txt | convertto-securestring
$mycred = new-object -typename System.Management.Automation.PSCredential -argumentlist "test",$pass
$mycred.GetNetworkCredential().Password

以这种方式存储密码要非常小心......它不如......安全


0
投票

我看到一个使用Import / Export-CLIXML的示例。

这些是我想要解决的问题的最喜欢的命令。最简单的使用方法是。

$passwordPath = './password.txt'
if (-not (test-path $passwordPath)) {
    $cred = Get-Credential -Username domain\username -message 'Please login.'
    Export-Cli -InputObject $cred -Path $passwordPath
}
$cred = Import-CliXML -path $passwordPath

因此,如果文件本地不存在,它将提示输入凭据并存储它们。这将使[pscredential]对象没有问题,并将凭证作为安全字符串隐藏。

最后,像通常那样使用凭证。

Restart-Computer -ComputerName ... -Credentail $cred

安全注意事项:

Securely store credentials on disk

阅读解决方案时,您可能首先要小心将密码存储在磁盘上。虽然谨慎使用敏感信息乱丢硬盘驱动器是很自然的(也是谨慎的),但Export-CliXml cmdlet使用Windows标准Data Protection API加密凭据对象。这可确保只有您的用户帐户才能正确解密其内容。同样,ConvertFrom-SecureString cmdlet也会加密您提供的密码。

编辑:重读原始问题。只要您将[pscredential]初始化为硬盘,上述操作就可以正常工作。也就是说,如果你在脚本中删除它并在创建该文件后运行脚本,然后无人参与运行脚本将很简单。


-3
投票

为什么你不尝试一些非常简单的事情?

使用带有'shutdown / r / f / t 0'命令的psexec和来自CMD的PC列表。

© www.soinside.com 2019 - 2024. All rights reserved.