我想重新启动属于域的远程计算机。我有一个管理员帐户,但是我不知道如何从Powershell使用它。
我知道有一个Restart-Computer
cmdlet,并且可以传递凭据,但是如果我的域是例如mydomain
,我的用户名是myuser
,密码是mypassword
使用它的正确语法?
我需要安排重新启动,因此不必键入密码。
我想重新启动属于域的远程计算机。我有一个管理员帐户,但是我不知道如何从Powershell使用它。
我知道有一个Restart-Computer
cmdlet,并且可以传递凭据,但是如果我的域是例如mydomain
,我的用户名是myuser
,密码是mypassword
使用它的正确语法?
我需要安排重新启动,因此不必键入密码。
Answers:
问题Get-Credential
在于它将始终提示您输入密码。但是,有一种解决方法,但它涉及将密码作为安全字符串存储在文件系统上。
下面的文章解释了它是如何工作的:
总而言之,您将创建一个文件来存储密码(作为加密的字符串)。下一行将提示您输入密码,然后将其存储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
开关值,因为我不知道您的环境。
ConvertTo-SecureString "password" -AsPlainText -Force
。
$password = ConvertTo-SecureString "password" -AsPlainText -Force
还有另一种方法,但是...
如果您 不想在脚本文件中输入密码,请不要这样做(将密码存储在脚本中不是一个好主意,但我们中有些人只是想知道如何使用。)
好的,这是警告,这是代码:
$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
关于存储凭据,我使用两个函数(通常在从我的配置文件加载的模块中):
#=====================================================================
# 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存在,并且将自动打开。
我必须从需要不同证书的远程服务器上运行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)
如果您计划重新启动,可以通过以下两种方法执行此操作。
首先,您可以使用具有连接和重新启动另一台计算机所需权限的凭据在一台计算机上创建任务。这使调度程序负责安全地存储凭据。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作为用户名,密码字段为空白即可。
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
以这种方式存储密码时要非常小心...它不如...
我看到了一个使用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]
为硬盘,以上内容就可以使用。就是说,如果将其放在脚本中并一旦创建该文件就运行脚本,然后无人值守运行脚本将很简单。
解
$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