2017-02-17 3 views
0

私は、リモートマシン上で実行されるPowerShellスクリプトから終了コードを返そうとしています。しかし、ExitCodeにチェックすると乱数があります。私のPowerShellスクリプトが間違った終了コードを返すのはなぜですか?

私は間違っていますか?さらに、テキスト全体を返すことは可能ですか?

私のスクリプト

$proc = Start-Process -Filepath "$PSExec" -ArgumentList "\\$server -h -u $user -p $pass -d PowerShell $command" -PassThru -Wait 
$proc.ExitCode 

リモートスクリプト

New-Item "c:\temp\1.txt" -type file -force 
exit 123 

UPDATE

$secureString = ConvertTo-SecureString $password -Force -AsPlainText #$password includes password in clear text 
$cred = New-Object System.Management.Automation.PSCredential($usrName, $secureString) 
$sess = New-PSSession -ComputerName $serverName -Credential $cred 
$command = "`"C:\temp\1.ps1`"" 
$result = Invoke-Command -Session $sess -ScriptBlock { 
    Start-Process -Filepath "$PSExec" -ArgumentList "\\$server -h -u $usrName -p $password -d PowerShell $command" -PassThru -Wait 
} 

答えて

0

あなたはを使用することができます代わりに?

例:あなたが資格情報オブジェクトを作成し、Invoke-Command-Credential PARAMTERを経由して、それを渡すことができGet-Credentialに代わるものとして

$session = New-PSSesson -ComputerName $serverName -Credential (Get-Credential) 
$result = Invoke-Command -Session $session -ScriptBlock { 
    Start-Process ... 
} 

。例:PowerShellのリモーティングは、リモートオブジェクトをシリアル化するため

$secureString = ConvertTo-SecureString $password -Force -AsPlainText #$password includes password in clear text 
$cred = [System.Management.Automation.PSCredential]::new($usrName, $secureString) 
$sess = New-PSSession -ComputerName $ComputerName -Credential $cred 
Invoke-Command -Session $sess -ScriptBlock { ... } 

$resultはまた、ExitCode性を含むべきです。 Powershell Remotingは、コマンドレット固有のComputerNameの実装と比較して、私は常に提案します。より標準化された方法(WsMan→HTTP(S))を使用します。詳細はlinkを参照してください。

希望に役立ちます。

+0

@whenは(ゲット-資格を)'それは、ユーザー名とパスワードを入力するポップアップウィンドウが開きます。スクリプトでユーザー名とパスワードを渡す方法は? – theateist

+0

'New-PSSession'に' Logon failure'例外がスローされます。'PSExec'がサーバーにアクセスするのに成功したので、ユーザー名とパスワードが正しいことが分かりました。私は、コードを使って投稿に更新を加えました。ありがとう – theateist

+0

私のパスワードで何かができますか?私のパスワードは '$ password =" $ mypass! "です。ここには表示されていませんが、 "$"記号の前に "$"記号をエスケープするには ""文字を使用します。それが正しいか? – theateist

0

(待機しない)フラグを使用してpsexecを実行すると、exitcodeを待機して戻すのではなく、起動したコマンドのpidが返されるという問題があります。

プロセス全体を最適化することもできます。最初にpsexec.exeを使用する場合は、待機して通過しているので、Start-Processの理由は表示されません。ちょうど& $psexec ...で十分です。

しかし、Invoke-Commandを使用するためのMoerwaldの提案は素晴らしいものです。更新されたコードでは、依然としてStart-ProcessPsexecが実行されていますが、これらは不要です。このコマンドを呼び出しているとき、あなたはすでにリモートでこれだけのコード実行、コードを実行している:それはあなたがセッションを再利用しているように見えていないので、また

$secureString = ConvertTo-SecureString $password -Force -AsPlainText 
$cred = New-Object System.Management.Automation.PSCredential($usrName, $secureString) 
$result = Invoke-Command -ComputerName $serverName -Credential $cred -ScriptBlock { 
    New-Item "c:\temp\1.txt" -type file -force 
    exit 123 
} 

を、私はドロップにセッションを保存変数。また、平文のパスワードを渡すのではなく、すべての資格情報の設定をGet-Credentialで置き換える方が良いでしょう(パスワードが保存されたトランスクリプトで終わるのを避ける)。それは次のようになります。私は `$セッション=新しい-PSSessionは-ComputerName $ serverNameの-Credentialを実行

$result = Invoke-Command -ComputerName $serverName -Credential (Get-Credential) -ScriptBlock { 
    New-Item "c:\temp\1.txt" -type file -force 
    exit 123 
} 
+0

しかし、あなたの最後のコードは、ユーザー名とパスワードを入力するために資格情報ウィンドウをポップアップします – theateist

+0

私がやろうとしているのは、リモートマシン上でpowershellスクリプトを実行することです。そのためには、まずリモートマシン上で 'ExecutionPolicy'を有効にする必要があります。私は手動ではしたくないが、すべてを遠隔操作する。私はリモートマシンへのVPNを持っています。ですから、私がしたのは、バッチファイルをリモートマシンにコピーして、 'ExecutionPolicy = RemoteSigned'というレジストリを追加することです。そのバッチファイルを 'PsExec'でexectしたいのですが、そのリモートマシン上でpowershellスクリプトを実行できるようになります。 'Invoke-Command'は私のすべてのリモートサーバを設定する必要があります。 PsExecでは何も設定する必要はありません。 – theateist

+0

いずれにせよ、私は '-d'を削除しましたが、私はまだ終了コードを取得しません。あなたは実際の事例を投稿していただけますか? – theateist

関連する問題