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


147

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

我知道有一个Restart-Computercmdlet,并且可以传递凭据,但是如果我的域是例如mydomain,我的用户名是myuser,密码是mypassword使用它的正确语法?

我需要安排重新启动,因此不必键入密码。


您应该阅读此链接
卡纸

get-credential domain01 \ admin01是什么意思?下一个命令是restart-computer -computername $ s -force -throttlelimit 10 -credential $ c。这是否意味着get-credential无需询问即可获取密码?
2011年

Answers:


202

问题Get-Credential在于它将始终提示您输入密码。但是,有一种解决方法,但它涉及将密码作为安全字符串存储在文件系统上。

下面的文章解释了它是如何工作的:

在没有提示的情况下使用PSCredentials

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

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

只要-Credential在PowerShell命令上看到自变量,则表示可以传递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开关值,因为我不知道您的环境。


23
您也可以ConvertTo-SecureString "password" -AsPlainText -Force
x0n

14
为了清楚$password = ConvertTo-SecureString "password" -AsPlainText -Force
山本晃(Akira Yamamoto)

我需要在读取主机参数中使用- 凭据[用户名],否则powershell会挂起。将-Credential传递给读取主机后,将直接在Powershell控制台中提示您,并且密码已正确存储。谢谢!
sephirot

我试图弄清楚在Powershell中使用Send-MailMessage函数时如何使其工作。我想存储我的电子邮件用户的凭据并通过,所以我不必一直输入它。任何想法如何做到这一点?
KangarooRIOT

@ user3681591-我建议您提出一个新问题,而不要在评论中这样做。谢谢。
凯夫

71

还有另一种方法,但是...

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

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

$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

谢谢。这非常有帮助。在我的情况下,我正在创建一个自定义的powershell cmdlet,该cmdlet需要一个用户名和密码(作为secureString)。在内部,该cmdlet会调用其他几个cmdlet,其中一些仅需要用户名和密码,但是其中一个需要凭据,因此我实际上不需要在脚本中对密码进行硬编码。
BenR 2012年

20
稍微简单一些:$ password = convertto-securestring -String“ notverysecretpassword” -AsPlainText -Force
Sam

我试图弄清楚在Powershell中使用Send-MailMessage函数时如何使其工作。我想存储我的电子邮件用户的凭据并通过,所以我不必一直输入它。任何想法如何做到这一点?
KangarooRIOT

@ user3681591这将是Send-MailMessage -Credential $ cred(如本文中所示创建$ cred)
Jeroen Landheer

@JeroenLandheer我已经尝试了您的答案(感谢您的帮助!),但是它没有用。我的错误是:-Credential:不能将术语“ -Credential”识别为cmdlet,函数,脚本文件或可运行程序的名称。
KangarooRIOT

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存在,并且将自动打开。


10

我必须从需要不同证书的远程服务器上运行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

如果您计划重新启动,可以通过以下两种方法执行此操作。

首先,您可以使用具有连接和重新启动另一台计算机所需权限的凭据在一台计算机上创建任务。这使调度程序负责安全地存储凭据。reboot命令(我是一个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作为用户名,密码字段为空白即可。


1
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

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


1

我看到了一个使用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

证券注意事项

将凭据安全地存储在磁盘上

阅读解决方案时,起初您可能会警惕在磁盘上存储密码。虽然谨慎(谨慎)做法是不要在硬盘上堆满敏感信息,但是Export-CliXml cmdlet使用Windows标准的Data Protection API加密凭据对象。这样可以确保只有您的用户帐户才能正确解密其内容。同样,ConvertFrom-SecureString cmdlet也会加密您提供的密码。

编辑:只是重新阅读原始问题。只要您已将初始化[pscredential]为硬盘,以上内容就可以使用。就是说,如果将其放在脚本中并一旦创建该文件就运行脚本,然后无人值守运行脚本将很简单。


1

$userName = 'test-domain\test-login'
$password = 'test-password'

$pwdSecureString = ConvertTo-SecureString -Force -AsPlainText $password
$credential = New-Object -TypeName System.Management.Automation.PSCredential `
    -ArgumentList $userName, $pwdSecureString

对于建筑机械
在上面的代码你的秘密(“从日志隐藏”)环境变量替换用户名和密码值堆积机

检测结果通过

'# Results'
$credential.GetNetworkCredential().Domain
$credential.GetNetworkCredential().UserName
$credential.GetNetworkCredential().Password

你会看到

# Results
test-domain
test-login
test-password

-3

你为什么不尝试一些简单的东西?

在命令“ shutdown / r / f / t 0”和CMD中的PC列表中使用psexec。


这是一个具体情况。关键是在任何随机情况下都不会生成登录窗口。
忘了
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.