我想重新启动一台属于域的远程计算机。我有一个管理员账户,但我不知道如何从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
<any other parameters relevant to you>
你可能需要一个不同的-Authentication
开关值,因为我不知道你的环境。
有另一种方法,但...
如果你不想让你的密码出现在脚本文件中,请不要这样做。 (在脚本中存储密码并不是一个好主意,但我们中的一些人就是喜欢知道怎么做。)
好了,这就是警告,下面是代码。
$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文件中的加密字符串中。当你第二次运行该行时,xml文件就在那里,并会自动打开。