ドメインに属しているリモートコンピュータを再起動したいのですが、どうすればよいですか?管理者アカウントは持っていますが、powershellからそれを使用する方法がわかりません。
Restart-Computerコマンドレットがあり、クレデンシャルを渡すことができることは知っていますが、例えばドメインが
mydomainで、ユーザー名が
myuserで、パスワードが
mypassword` だとすると、これを使うには正しい構文とは何でしょうか。
私はパスワードを入力する必要がないように再起動をスケジュールする必要があります。
Get-Credential` の問題は、常にパスワードを要求されることです。しかし、これを回避する方法があります。それは、パスワードをファイルシステム上に安全な文字列として保存することです。
以下の記事で、この仕組みを解説しています。
要約すると、パスワードを(暗号化された文字列として)保存するためのファイルを作成します。次の行は、パスワードの入力を促し、それを暗号化された文字列として c:\securestring.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
認証情報の保存については、私は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回目にこの行を実行すると、xmlファイルが存在し、自動的に開かれます。
別の資格情報を必要とするリモートサーバーから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つの方法を次に示します。
まず、別のマシンを接続して再起動するために必要な権限を持つ資格情報を使用して、あるマシンにタスクを作成できます。 これにより、スケジューラーは資格情報を安全に保存する責任が生じました。 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 "パスワード"
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を入力するだけで、パスワードフィールドは空白のままになります。
ソリューション。
$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
ビルドマシンの場合< br />。 前のコードでは、ユーザー名とパスワードの値をbuild-machineの秘密(「ログから非表示」)環境変数に置き換えます。
テスト結果による。
'# Results'
$credential.GetNetworkCredential().Domain
$credential.GetNetworkCredential().UserName
$credential.GetNetworkCredential().Password
わかります。
# Results
test-domain
test-login
test-password
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
Securtyに関するメモ:
ソリューションを読むとき、最初はディスクにパスワードを保存することに注意するかもしれません。 ハードドライブをポイ捨てすることに注意するのは自然なことです(そして賢明です)。 機密情報であるExport-CliXml cmdletは、を使用して資格オブジェクトを暗号化します。 Windows標準のデータ保護API。これにより、ユーザーアカウントのみができるようになります。 内容を適切に復号化します。 同様に、ConvertFrom-SecureString cmdletも。 提供するパスワードを暗号化します。
編集:元の質問を読み直してください。 上記は、ハードディスクに「 [predential]
」を初期化している限り機能します。 つまり、それをスクリプトにドロップしてスクリプトを実行すると、そのファイルが作成され、無人でスクリプトを実行するのは簡単です。