我正在嘗試使用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設置爲繞過。如果他/她會發布答案,我會很樂意提供信用。
謝謝!
嘗試使用'-ExecutionPolicy Bypass'而不是Unrestricted。不受限制對於設置機器或用戶策略,本地或GPO是有意義的。它對命令行的意義不大。 – Xalorous
如果你發現了你的問題,請將它作爲你自己問題的答案發布。 – Shelvacu
我沒有弄清楚我的問題,但我認爲@Xalorous的確如此。當我做出改變時,我能夠在PowerShell窗口中成功交互地運行它。實際上我試圖通過Azure自定義腳本擴展來完成這項工作,並且仍然存在相同的問題。但是,Xalorous的建議似乎是我發佈的問題的正確答案。我如何正確地給予信貸? – Sean