パスワードの入力を求められずにPowerShell資格情報を使用する


147

ドメインに属しているリモートコンピュータを再起動したいのですが。管理者アカウントを持っていますが、powershellからそれを使用する方法がわかりません。

Restart-Computerコマンドレットがあり、資格情報を渡すことができることは知っていますが、ドメインがたとえばの場合mydomain、ユーザー名はmyuserで、パスワードはmypasswordそれを使用するための正しい構文です。

パスワードを入力する必要がないように、再起動をスケジュールする必要があります。


このリンク
jams

get-credential domain01 \ admin01はどういう意味ですか?次のコマンドは、restart-computer -computername $ s -force -throttlelimit 10 -credential $ cです。get-credentialが確認せずにパスワードを取得するということですか?
私のすべてのeyez

回答:


202

の問題Get-Credentialは、常にパスワードを要求することです。これを回避する方法はありますが、パスワードをファイルシステムに安全な文字列として保存する必要があります。

次の記事では、この仕組みについて説明しています。

プロンプトなしでPSCredentialsを使用する

要約すると、パスワードを(暗号化された文字列として)保存するファイルを作成します。次の行はパスワードの入力を求めc:\mysecurestring.txt、暗号化された文字列として保存します。これを行う必要があるのは1回だけです。

read-host -assecurestring | convertfrom-securestring | out-file C:\mysecurestring.txt

-CredentialPowerShellコマンドの引数がどこにあるかは、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私はあなたの環境を知らないので、別のスイッチ値が必要になるかもしれません。


23
あなたも行うことができますConvertTo-SecureString "password" -AsPlainText -Force
x0n 2013年

14
明確にするために$password = ConvertTo-SecureString "password" -AsPlainText -Force
山本明

-Credential [username]はRead-Hostパラメータで必要でしたが、そうでないとPowerShellがハングします。-Credentialをread-hostに渡した後、Powershellコンソールで直接プロンプトが表示され、パスワードが正しく保存されます。ありがとうございました!
sephirot 2017年

PowerShellでSend-MailMessage関数を使用するときにこれを機能させる方法を理解しようとしています。メールユーザーの資格情報を保存して渡したいので、入力し続ける必要はありません。これを行う方法はありますか?
カンガルー

@ user3681591-コメントでこれを行うのではなく、新しい質問をすることをお勧めします。ありがとう。
ケフ

71

別の方法がありますが...

スクリプトファイルに パスワードが必要ない場合は、これを行わないでください(パスワードをスクリプトに保存することはお勧めしませんが、一部のユーザーは方法を知りたいだけです)。

さて、それは警告でした、これがコードです:

$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

ありがとう。これは非常に役立ちます。私の場合、ユーザー名とパスワードを(secureStringとして)取るカスタムPowerShellコマンドレットを作成していました。コマンドレットは内部的に他のいくつかのコマンドレットを呼び出します。一部はユーザーとパスワードのみを必要としますが、そのうちの1つは資格情報を必要とするため、実際にスクリプトでパスワードをハードコーディングする必要はありません。
BenR 2012

20
ややシンプル:$ password = convertto-securestring -String "notverysecretpassword" -AsPlainText -Force
Sam

PowerShellでSend-MailMessage関数を使用するときにこれを機能させる方法を理解しようとしています。メールユーザーの資格情報を保存して渡したいので、入力し続ける必要はありません。これを行う方法はありますか?
カンガルー

@ user3681591それはSend-MailMessage -Credential $ cred(この投稿に示されているように作成された$ credを使用)です
Jeroen Landheer

@JeroenLandheer私はあなたの答えを試しました(助けてくれてありがとう!)しかしそれはうまくいきませんでした。私のエラーは:-Credential:「-Credential」という用語は、コマンドレット、関数、スクリプトファイル、または操作可能なプログラムの名前として認識されません。
カンガルー

29

資格情報の保存に関して、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が存在し、自動的に開かれます。


10

別の資格情報を必要とするリモートサーバーから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)

4

再起動をスケジュールしている場合、これを行うには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」と入力し、パスワードフィールドは空白のままにします。


1
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

この方法でパスワードを保存する場合は十分に注意してください...安全性は低くなります...


1

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]ハードディスクを初期化している限り機能します。つまり、それをスクリプトにドロップしてスクリプトを実行すると、そのファイルが作成され、無人でスクリプトを実行するのは簡単です。


1

解決

$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

-3

なぜあなたはとてもシンプルなものを試してみませんか?

コマンド 'shutdown / r / f / t 0'およびCMDからのPCリストを指定してpsexecを使用します。


それは特定のケースです。ポイントは、ランダムなシナリオでログインウィンドウを生成することではありません。
オーバーマインド
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.