Page 1 of 1

PowerShell script: the command line is too long

Published: May 30, 2023 - 4:48 PM
by jlatieule
Good morning,



I'm going in circles trying to run a PowerShell script. I can run it via cmd or the PowerShell console, but I can't run the script via Wapt.
The return is a very large string of characters when there shouldn't be much of it.
I saw a post that talks about blobs but I don't see how to use it.

Can you help me?

Here are some excerpts

Code: Select all

AAIAAkAHIAdQBzAHQAZABlAHMAawBfAHAAdwAgAD0AIAAkAHIAdQBzAHQAZABlAHMAawBfAHAAdwAuAFMAcABsAGkAdAAoACIAJwAiACkAWwAxAF0ACgAgACAAVwByAGkAdABlAC0ATwB1AHQAcAB1AHQAIAAiAEMAbwBuAGYAaQBnACAAZgBpAGwAZQAgAGYAbwB1AG4AZAAgAGkAbgAgAHcAaQBuAGQAbwB3AHMAIABzAGUAcgB2AGkAYwBlACAAZgBvAGwAZABlAHIAIgAKACAAIABPAHUAdABwAHUAdABJAEQAYQBuAGQAUABXACAAJAByAHUAcwB0AGQAZQBzAGsAXwBpAGQAIAAkAHIAdQBzAHQAZABlAHMAawBfAHAAdwAKAH0ACgAKAFMAdABvAHAALQBQAHIAbwBjAGUAcwBzACAALQBOAGEAbQBlACAAUgB1AHMAdABEAGUAcwBrACAALQBGAG8AcgBjAGUAIAA+ACAAbgB1AGwAbAAKAFMAdABhAHIAdAAtAFMAZQByAHYAaQBjAGUAIAAtAE4AYQBtAGUAIABSAHUAcwB0AEQAZQBzAGsAIAA+ACAAbgB1AGwAbAAKACAAIAB8ACAAQwBvAG4AdgBlAHIAdABUAG8ALQBKAHMAbwBuACAA" ' returned non-zero exit status 1.
Output:La ligne de commande est trop longue.
:
Traceback (most recent call last):
  File "C:\Program Files (x86)\wapt\setuphelpers_windows.py", line 1088, in run_powershell
    result = run(cmd,
  File "C:\Program Files (x86)\wapt\waptutils.py", line 2110, in run
    raise CalledProcessErrorOutput(proc.returncode, cmd, ''.join(output+return_stderr))
waptutils.CalledProcessErrorOutput: Command 'powershell -NoLogo -NoProfile -NonInteractive -ExecutionPolicy Unrestricted -OutputFormat text -EncodedCommand "JABQAHIAbwBnAHIAZQBzAHMAUAByAGUAZgBlAHIAZQBuAGMAZQAgAD0AIAAiAFMAaQBsAGUAbgB0AGwAeQBDAG8AbgB0AGkAbgB1AGUAIgAKAAoAPAAjACAATABpAHMAdABlACAAZABlAHMAIABjAG8AbQBtAGEAbgBkAGUAcwAgAHMAaQBsAGUAbgBjAGkAZQB1AHMAZQAgADoAIABoAHQAdABwAHMAOgAvAC8AdwB3AHcALgByAGUAZABkAGkAdAAuAGMAbwBtAC8AcgAvAHIAdQBzAHQAZABlAHMAawAvAGMAbwBtAG0AZQBuAHQAcwAvAHoAcgAyAHcAdABxAC8AYQBsAGwAXwBpAG4AcwB0AGEAbABsAF8AcABhAHIAYQBtAGUAdABlAHIAcwBfAGkAXwBrAG4AbwB3AF8AYQBiAG8AdQB0AF8AcwBpAGwAZQBuAHQAaQBuAHMAdABhAGwAbAAvAAoACQAtAC0AdQBuAGkAbgBzAHQAYQBsAGwACgAJAC0ALQBhAGYAdABlAHI

Code: Select all

MAcwB3AG8AcgBkACIAKQAgAH0AKQAKACAAIAAkAHIAdQBzAHQAZABlAHMAawBfAHAAdwAgAD0AIAAkAHIAdQBzAHQAZABlAHMAawBfAHAAdwAuAFMAcABsAGkAdAAoACIAJwAiACkAWwAxAF0ACgAgACAAVwByAGkAdABlAC0ATwB1AHQAcAB1AHQAIAAiAEMAbwBuAGYAaQBnACAAZgBpAGwAZQAgAGYAbwB1AG4AZAAgAGkAbgAgAHcAaQBuAGQAbwB3AHMAIABzAGUAcgB2AGkAYwBlACAAZgBvAGwAZABlAHIAIgAKACAAIABPAHUAdABwAHUAdABJAEQAYQBuAGQAUABXACAAJAByAHUAcwB0AGQAZQBzAGsAXwBpAGQAIAAkAHIAdQBzAHQAZABlAHMAawBfAHAAdwAKAH0ACgAKAFMAdABvAHAALQBQAHIAbwBjAGUAcwBzACAALQBOAGEAbQBlACAAUgB1AHMAdABEAGUAcwBrACAALQBGAG8AcgBjAGUAIAA+ACAAbgB1AGwAbAAKAFMAdABhAHIAdAAtAFMAZQByAHYAaQBjAGUAIAAtAE4AYQBtAGUAIABSAHUAcwB0AEQAZQBzAGsAIAA+ACAAbgB1AGwAbAAKACAAIAB8ACAAQwBvAG4AdgBlAHIAdABUAG8ALQBKAHMAbwBuACAA" ' returned non-zero exit status 1.
Output:La ligne de commande est trop longue.


During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "C:\Program Files (x86)\wapt\common.py", line 4074, in install_wapt
    exitstatus = setup.install()
  File "C:\waptdev\ophlm-rustdesk_1.1.9_Windows_DEV\setup.py", line 47, in install
    run_powershell_from_file('WindowsAgentAIOInstall.ps1')
  File "C:\Program Files (x86)\wapt\setuphelpers_windows.py", line 1120, in run_powershell_from_file
    return run_powershell(content, output_format, **kwargs)
  File "C:\Program Files (x86)\wapt\setuphelpers_windows.py", line 1092, in run_powershell
    raise CalledProcessErrorOutput(e.returncode, cmd, e.output)
waptutils.CalledProcessErrorOutput: Command 'powershell -NoLogo -NoProfile -NonInteractive -ExecutionPolicy Unrestricted -OutputFormat text -EncodedCommand "JABQAHIAbwBnAHIAZQBzAHMAUAByAGUAZgBlAHIAZQBuAGMAZQAgAD0AIAAiAFMAaQBsAGUAbgB0AGwAeQBDAG8AbgB0AGkAbgB1AGUAIgAKAAoAPAAjACAATABpAHMAdABlACAAZABlAHMAIABjAG8AbQBtAGEAbgBkAGUAcwAgAHMAaQBsAGUAbgBjAGkAZQB1AHMAZQAgADoAIABoAHQAdABwAHMAOgAvAC8AdwB3AHcALgByAGUAZABkAGkAdAAuAGMAbwBtAC8AcgAvAHIAdQBzAHQAZABlAHMAawAvAGMAbwBtAG0AZQBuAHQAcwAvAHoAcgAyAHcAdABxAC8AYQBsAGwAXwBpAG4AcwB0AGEAbABsAF8AcABhAHIAYQBtAGUAdABlAHIAcwBfAGkAXwBrAG4AbwB3AF8AYQBiAG8AdQB0AF8AcwBpAGwAZQBuAHQAaQBuAHMAdABhAG
The script allows the installation of the "RustDesk" remote maintenance client on our server. The script has been anonymized

WAPT section

Code: Select all

def install():
    run_powershell_from_file('WindowsAgentAIOInstall.ps1')
Complete and anonymized PowerShell script

Code: Select all

$ErrorActionPreference= 'silentlycontinue'
#Run as administrator and stays in the current directory
if (-Not ([Security.Principal.WindowsPrincipal][Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole([Security.Principal.WindowsBuiltInRole]::Administrator)) {
    if ([int](Get-CimInstance -Class Win32_OperatingSystem | Select-Object -ExpandProperty BuildNumber) -ge 6000) {
        Start-Process PowerShell -Verb RunAs -ArgumentList "-NoProfile -ExecutionPolicy Bypass -Command `"cd '$pwd'; & '$PSCommandPath';`"";
        Exit;
    }
}


$rustdesk_url = 'https://github.com/rustdesk/rustdesk/releases/latest'
$request = [System.Net.WebRequest]::Create($rustdesk_url)
$response = $request.GetResponse()
$realTagUrl = $response.ResponseUri.OriginalString
$rustdesk_version = $realTagUrl.split('/')[-1].Trim('v')
Write-Output("Installing Rustdesk version $rustdesk_version")

function OutputIDandPW([String]$rustdesk_id, [String]$rustdesk_pw) {
  Write-Output("######################################################")
  Write-Output("#                                                    #")
  Write-Output("# CONNECTION PARAMETERS:                             #")
  Write-Output("#                                                    #")
  Write-Output("######################################################")
  Write-Output("")
  Write-Output("  RustDesk-ID:       $rustdesk_id")
  Write-Output("  RustDesk-Password: $rustdesk_pw")
  Write-Output("")
}

If (!(Test-Path $env:Temp)) {
  New-Item -ItemType Directory -Force -Path $env:Temp > null
}

If (!(Test-Path "$env:ProgramFiles\Rustdesk\RustDesk.exe")) {

  cd $env:Temp

  If ([Environment]::Is64BitOperatingSystem) {
    $os_arch = "x64"
  } Else {
    $os_arch = "x32"
  }

  Invoke-WebRequest https://github.com/rustdesk/rustdesk/releases/download/$rustdesk_version/rustdesk-$rustdesk_version-windows_$os_arch.zip -Outfile rustdesk.zip

  Expand-Archive rustdesk.zip
  cd rustdesk
  Start-Process "rustdesk-$rustdesk_version-putes.exe" -argumentlist "--silent-install" -wait

  # Set URL Handler
  New-Item -Path "HKLM:\SOFTWARE\Classes\RustDesk" > null
  Set-ItemProperty -Path "HKLM:\SOFTWARE\Classes\RustDesk" -Name "(Default)" -Value "URL:RustDesk Protocol" > null
  New-ItemProperty -Path "HKLM:\SOFTWARE\Classes\RustDesk" -Name "URL Protocol" -Type STRING > null

  New-Item -Path "HKLM:\SOFTWARE\Classes\RustDesk\DefaultIcon" > null
  Set-ItemProperty -Path "HKLM:\SOFTWARE\Classes\RustDesk\DefaultIcon" -Name "(Default)" -Value "RustDesk.exe,0" > null

  New-Item -Path "HKLM:\SOFTWARE\Classes\RustDesk\shell" > null
  New-Item -Path "HKLM:\SOFTWARE\Classes\RustDesk\shell\open" > null
  New-Item -Path "HKLM:\SOFTWARE\Classes\RustDesk\shell\open\command" > null
  $rustdesklauncher = '"' + $env:ProgramFiles + '\RustDesk\RustDeskURLLauncher.exe" %1"'
  Set-ItemProperty -Path "HKLM:\SOFTWARE\Classes\RustDesk\shell\open\command" -Name "(Default)" -Value $rustdesklauncher > null

  Install-PackageProvider -Name NuGet -MinimumVersion 2.8.5.201 -Force > null
  Install-Module ps2exe -Force > null

$urlhandler_ps1 = @"
  `$url_handler = `$args[0]
  `$rustdesk_id = `$url_handler -creplace '(?s)^.*\:',''
  Start-Process -FilePath '$env:ProgramFiles\RustDesk\rustdesk.exe' -ArgumentList "--connect `$rustdesk_id"
"@

  New-Item "$env:ProgramFiles\RustDesk\urlhandler.ps1" > null
  Set-Content "$env:ProgramFiles\RustDesk\urlhandler.ps1" $urlhandler_ps1 > null
  Invoke-Ps2Exe "$env:ProgramFiles\RustDesk\urlhandler.ps1" "$env:ProgramFiles\RustDesk\RustDeskURLLauncher.exe" > null

  # Cleanup Tempfiles
  Remove-Item "$env:ProgramFiles\RustDesk\urlhandler.ps1" > null
  cd $env:Temp
  Remove-Item $env:Temp\rustdesk -Recurse > null
  Remove-Item $env:Temp\rustdesk.zip > null
}

# Write config
$RustDesk2_toml = @"
rendezvous_server = 'rustdesk.mon_entreprise.com'
nat_type = 1
serial = 0

[options]
custom-rendezvous-server = 'rustdesk.mon_entreprise.com'
key =  '****='
relay-server = 'rustdesk.mon_entreprise.com'
api-server = 'https://rustdesk.mon_entreprise.com'
enable-audio = 'N'
"@

# Permettre le partage de session RDP
Set-ItemProperty -path 'HKLM:\Software\Microsoft\Windows\CurrentVersion\Uninstall\RustDesk' -Name 'share_rdp' -value 'true'

If (!(Test-Path $env:AppData\RustDesk\config\RustDesk2.toml)) {
  New-Item $env:AppData\RustDesk\config\RustDesk2.toml > null
}
Set-Content $env:AppData\RustDesk\config\RustDesk2.toml $RustDesk2_toml > null

If (!(Test-Path $env:WinDir\ServiceProfiles\LocalService\AppData\Roaming\RustDesk\config\RustDesk2.toml)) {
  New-Item $env:WinDir\ServiceProfiles\LocalService\AppData\Roaming\RustDesk\config\RustDesk2.toml > null
}
Set-Content $env:WinDir\ServiceProfiles\LocalService\AppData\Roaming\RustDesk\config\RustDesk2.toml $RustDesk2_toml > null

$random_pass = (-join ((65..90) + (97..122) | Get-Random -Count 8 | % {[char]$_}))
Start-Process "$env:ProgramFiles\RustDesk\RustDesk.exe"  -argumentlist "--password $random_pass" -wait

# Get RustDesk ID
If (!("$env:WinDir\ServiceProfiles\LocalService\AppData\Roaming\RustDesk\config\RustDesk.toml")) {
  $rustdesk_id = (Get-Content $env:AppData\RustDesk\config\RustDesk.toml | Where-Object { $_.Contains("id") })
  $rustdesk_id = $rustdesk_id.Split("'")[1]
  $rustdesk_pw = (Get-Content $env:AppData\RustDesk\config\RustDesk.toml | Where-Object { $_.Contains("password") })
  $rustdesk_pw = $rustdesk_pw.Split("'")[1]
  Write-Output("Config file found in user folder")
  OutputIDandPW $rustdesk_id $rustdesk_pw
} Else {
  $rustdesk_id = (Get-Content $env:WinDir\ServiceProfiles\LocalService\AppData\Roaming\RustDesk\config\RustDesk.toml | Where-Object { $_.Contains("id") })
  $rustdesk_id = $rustdesk_id.Split("'")[1]
  $rustdesk_pw = (Get-Content $env:WinDir\ServiceProfiles\LocalService\AppData\Roaming\RustDesk\config\RustDesk.toml | Where-Object { $_.Contains("password") })
  $rustdesk_pw = $rustdesk_pw.Split("'")[1]
  Write-Output "Config file found in windows service folder"
  OutputIDandPW $rustdesk_id $rustdesk_pw
}

Stop-Process -Name RustDesk -Force > null
Start-Service -Name RustDesk > null

Re: PowerShell script: command line is too long

Published: June 6, 2023 - 09:56
by dcardon
Hi Joël,

When PowerShell commands are run, they are base64 encoded to avoid special character issues (there are many cases where this causes problems). The issue is that this shouldn't be done when loading a file. In your case, the file is rather long, and when it's converted to base64 and passed to the command line, it exceeds the maximum command line length in Windows.

That said, there are many lines in the file that could be easily and efficiently replaced by setuphelper calls. So, in the meantime, you can split it in two or replace part of it with Python code.

I'm opening an internal ticket for this problem.

Best regards,

Denis

Re: PowerShell script: command line is too long

Published: June 6, 2023 - 2:55 PM
by jlatieule
Thanks Denis for the feedback

. I'm interested in a RustDesk package generated by Trankil It.

It's a very, very good replacement for TeamViewer and AnyDesk. It can be used on public servers as well as with a home RustDesk server.
I found the result to be far superior to TeamViewer in terms of simplicity, smaller file size, and lower performance.

I've weighed all my arguments and I haven't exaggerated anything. 😁
When will a custom package be available? 😇😇😇