2015-10-27 37 views
7

私はpowershell.exeの-EncodedCommandパラメータを使用して、別のユーザーとしてpowershellスクリプトを実行しようとしています。私は引用符やその他の特殊文字をエスケープするコマンドラインの問題に対処することを避けるためにこれをやっています。私は、エンコードされたコマンドの長さが916文字を超えた場合、それは次のメッセージで失敗することを発見しました:Powershell EncodedCommand長さの問題

Start-Process : This command cannot be run due to the error: The stub received bad data. 

はここで私が使用しているコードです:

$path = 'c:\temp' 

$UserName = '.\someuser' 
$Password = 'somepassword' 
$securePassword = ($Password | ConvertTo-SecureString -AsPlainText -Force) 
$credential = New-Object System.Management.Automation.PSCredential $UserName, $securePassword 

$command = {& .\Restore-DatabaseFromBackupFile.ps1 -DatabaseName 'aaaaaaaaaaaaaaa' -DatabaseBackupFilePath 'aaaaaaaaaaaaaaaaaaaaaaaaaaa' -DatabaseDataLogicalName 'aaaaaaaaaaaaaaa' -DatabaseLogLogicalName 'aaaaaaaaaaaaaaaaaaa' -DatabaseDataFilePath 'abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdef' -DatabaseLogFilePath 'a';Start-Sleep -Seconds 2} 
$commandBytes = [System.Text.Encoding]::Unicode.GetBytes($command) 
$encodedCommand = [Convert]::ToBase64String($commandBytes) 
Write-Warning $encodedCommand.Length 
Write-Warning $encodedCommand 
Start-Process -FilePath 'powershell.exe' -ArgumentList "-ExecutionPolicy Unrestricted -EncodedCommand $encodedCommand" -WorkingDirectory $path -LoadUserProfile -Credential $Credential 

このコードは失敗します。ただし、いずれかのパラメータ値から1文字を削除する(または、スクリプトブロック内でコマンドを短縮する)と、正常に実行されます。

Windows XP以降でcmd.exeに8190文字の制限があります(これはWindows Server 2012 R2上で実行されています)が、この制限から遠く離れているようです。

アイデア?

** UPDATE1:この動作は、-Credentialパラメータの影響を受けます。 -Credentialパラメータを削除して現在のユーザーとして実行すると、コード化されたコマンドの長さが19,000を超えるとコマンドを正常に実行できました。

** UPDATE2:@ Xalorousのコメントが問題を解決しました。 ExecutionPolicyをバイパスに設定する。私は彼/彼女は答えを投稿する場合は、信用を与えることを喜んででしょう。

ありがとうございます!

+1

Unrestrictedの代わりに '-ExecutionPolicy Bypass'を試してください。制限なしは、マシンポリシーまたはユーザーポリシー、ローカルまたはGPOの設定には意味があります。コマンドラインには意味がありません。 – Xalorous

+0

問題を見つけた場合は、自分の質問に対する回答として投稿してください。 – Shelvacu

+0

私は自分の問題を理解しなかったが、@ Xalorousはそうだと思う。私がその変更を加えたとき、私はそれをPowerShellウィンドウで対話的にうまく実行することができました。私は実際にAzureカスタムスクリプトエクステンションを使ってこの作業をしようとしていますが、同じ問題を抱えています。しかし、Xalorousの提案は、私が投稿した質問の正解と思われる。どのように私は適切なクレジットを与えるのですか? – Sean

答えて

1

Try -ExecutionPolicy Try-ExecutionPolicy Unrestrictedの代わりにTryを実行します。制限なしは、マシンポリシーまたはユーザーポリシー、ローカルまたはGPOの設定には意味があります。コマンドラインにはあまり意味がありません