ドメインに属しているリモートコンピュータを再起動したいのですが。管理者アカウントを持っていますが、powershellからそれを使用する方法がわかりません。
Restart-Computer
コマンドレットがあり、資格情報を渡すことができることは知っていますが、ドメインがたとえばの場合mydomain
、ユーザー名はmyuser
で、パスワードはmypassword
それを使用するための正しい構文です。
パスワードを入力する必要がないように、再起動をスケジュールする必要があります。
ドメインに属しているリモートコンピュータを再起動したいのですが。管理者アカウントを持っていますが、powershellからそれを使用する方法がわかりません。
Restart-Computer
コマンドレットがあり、資格情報を渡すことができることは知っていますが、ドメインがたとえばの場合mydomain
、ユーザー名はmyuser
で、パスワードはmypassword
それを使用するための正しい構文です。
パスワードを入力する必要がないように、再起動をスケジュールする必要があります。
回答:
の問題Get-Credential
は、常にパスワードを要求することです。これを回避する方法はありますが、パスワードをファイルシステムに安全な文字列として保存する必要があります。
次の記事では、この仕組みについて説明しています。
要約すると、パスワードを(暗号化された文字列として)保存するファイルを作成します。次の行はパスワードの入力を求めc:\mysecurestring.txt
、暗号化された文字列として保存します。これを行う必要があるのは1回だけです。
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
資格情報の保存に関して、2つの関数を使用します(通常、これらはプロファイルからロードされるモジュールにあります)。
#=====================================================================
# 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ファイル内の暗号化された文字列に格納されます。その行を2回目に実行すると、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)
再起動をスケジュールしている場合、これを行うには2つの方法があります。
最初に、別のマシンに接続して再起動するために必要な権限を持つ資格情報を使用して、1つのマシンでタスクを作成できます。これにより、スケジューラは資格情報を安全に保存します。再起動コマンド(私は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"
現在の資格情報を使用して、リモートマシンのシステムアカウントで実行されるスケジュールされたタスクを作成する2番目の方法をお勧めします。
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を使用する1つの例を見ました。
これらは、解決しようとしている問題に対する私のお気に入りのコマンドです。そして、それらを使用する最も簡単な方法は、です。
$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コマンドレットは、Windows標準のデータ保護APIを使用して資格情報オブジェクトを暗号化します。これにより、ユーザーアカウントのみがコンテンツを適切に復号化できるようになります。同様に、ConvertFrom-SecureStringコマンドレットも、指定したパスワードを暗号化します。
編集:元の質問を読み直してください。上記は[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