私は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をバイパスに設定する。私は彼/彼女は答えを投稿する場合は、信用を与えることを喜んででしょう。
ありがとうございます!
Unrestrictedの代わりに '-ExecutionPolicy Bypass'を試してください。制限なしは、マシンポリシーまたはユーザーポリシー、ローカルまたはGPOの設定には意味があります。コマンドラインには意味がありません。 – Xalorous
問題を見つけた場合は、自分の質問に対する回答として投稿してください。 – Shelvacu
私は自分の問題を理解しなかったが、@ Xalorousはそうだと思う。私がその変更を加えたとき、私はそれをPowerShellウィンドウで対話的にうまく実行することができました。私は実際にAzureカスタムスクリプトエクステンションを使ってこの作業をしようとしていますが、同じ問題を抱えています。しかし、Xalorousの提案は、私が投稿した質問の正解と思われる。どのように私は適切なクレジットを与えるのですか? – Sean