2015-10-27 35 views
7

我正在嘗試使用powershell.exe的-EncodedCommand參數來以不同的用戶身份運行PowerShell腳本。我這樣做是爲了避免處理逃脫引號和其他特殊字符的命令行困難。我發現,當編碼指令的長度超過916個字符時,出現以下消息:Powershell編碼指令長度問題

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 

此代碼將失敗。但是,如果您從任何參數值中刪除單個字符(或以任何方式縮短腳本塊中的命令),它將成功執行。

我發現在Windows XP和更新版本(這是在Windows Server 2012 R2上運行)上對cmd.exe有8190個字符限制的引用,但我似乎距離此限制很遠。

任何想法?

** UPDATE1:此行爲受-Credential參數影響。如果我刪除-Credential參數並以當前用戶身份運行,那麼當編碼的命令長度超過19,000時,我可以成功執行該命令。

**更新2:@ Xalorous的評論確實解決了這個問題。將ExecutionPolicy設置爲繞過。如果他/她會發布答案,我會很樂意提供信用。

謝謝!

+1

嘗試使用'-ExecutionPolicy Bypass'而不是Unrestricted。不受限制對於設置機器或用戶策略,本地或GPO是有意義的。它對命令行的意義不大。 – Xalorous

+0

如果你發現了你的問題,請將它作爲你自己問題的答案發布。 – Shelvacu

+0

我沒有弄清楚我的問題,但我認爲@Xalorous的確如此。當我做出改變時,我能夠在PowerShell窗口中成功交互地運行它。實際上我試圖通過Azure自定義腳本擴展來完成這項工作,並且仍然存在相同的問題。但是,Xalorous的建議似乎是我發佈的問題的正確答案。我如何正確地給予信貸? – Sean

回答

1

試試-ExecutionPolicy繞過而不是無限制。不受限制對於設置機器或用戶策略,本地或GPO是有意義的。它對命令行的意義不大