使用PowerShell凭据而不提示input密码
我想要重新启动属于某个域的远程计算机。 我有一个pipe理员帐户,但我不知道如何从PowerShell中使用它。
我知道有一个Restart-Computer
cmdlet,我可以通过凭证,但如果我的域是例如mydomain
,我的用户名是myuser
,我的密码是mypassword
什么是正确的语法使用它?
我需要安排重新启动,所以我不必input密码。
Get-Credential
的问题是它总是会提示input密码。 有一种解决方法,但它涉及将密码存储为文件系统上的安全string。
以下文章解释了这是如何工作的:
没有提示使用PSCredentials
总之,你创build一个文件来存储你的密码(作为一个encryption的string)。 以下行将提示input密码,然后将其作为encryptionstring存储在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
开关值,因为我不知道您的环境。
还有另一种方法,但…
如果您不希望在脚本文件中input密码 ,请不要这么做(在脚本中存储密码不是一个好主意,但我们中的一些人只是想知道如何)。
好的,那是警告,这是代码:
$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
关于存储凭据,我使用了两个函数(通常在从我的configuration文件加载的模块中):
#===================================================================== # 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文件中的encryptionstringforms存储凭据。 第二次运行该行时,xmlfile在那里,将自动打开。
我必须从需要不同证书的远程服务器运行SCOM 2012function。 通过将密码解密函数的输出作为input传递给ConvertTo-SecureString,我避免了明文密码。 为了清楚起见,这里没有显示。
我喜欢强烈地键入我的声明。 $ strPass的types声明可以正常工作。
[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)
如果您正在计划重新启动,则可以使用以下两种方法来执行此操作。
首先,您可以使用具有连接和重新启动另一台计算机所需权限的凭据在一台计算机上创build任务。 这使得调度程序负责安全地存储凭证。 重新启动命令(我是一个Powershell的家伙,但这是更清洁)是:
SHUTDOWN /r /f /m \\ComputerName
用于在本地计算机上创build计划任务的命令行可以远程重启另一个计算机:
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"
我更喜欢第二种方式,使用当前的凭据来创build一个在远程计算机上使用系统帐户运行的计划任务。
SCHTASKS /Create /TN "Reboot Server" /TR "shutdown.exe /r /f" /SC ONCE /ST 00:00 /SD "12/24/2012" /RU SYSTEM /S ComputerName
这也可以通过GUI工作,只需inputSYSTEM作为用户名,将密码字段留空。
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
以这种方式存储密码时要非常小心……它不如…
为什么不尝试一些非常简单的事情?
使用命令“shutdown / r / f / t 0”的psexec和来自CMD的PC列表。