Seite 1 von 1

[GELÖST] Problem mit run_powershell_from_file

Veröffentlicht: 2. Juli 2021 - 10:59 Uhr
von Cédric Morin
Guten Morgen,

Ich habe ein kleines Problem mit den Setup-Helfern run_powershell_from_fileIch habe mein Skript in PowerShell geschrieben und es scheint keine Probleme beim Ausführen zu geben.

Code: Alle auswählen

#Script pour determiner si Nuget est installé et dans quelle version

Try{
    $Version = (Get-PackageProvider -Name "Nuget" -ErrorAction SilentlyContinue).Version
    $Result = "NuGet found. Version : $($Version.ToString())"
}
Catch{
    $Result = "NuGet not found."
}

$Result
Wenn ich meiner Audit-Funktion Folgendes übergebe:

Code: Alle auswählen

run_powershell_from_file("Get-INSANugetVersion.ps1",output_format='json')
Ich erhalte eine große Fehlermeldung:

Code: Alle auswählen

Auditing c:\waptdev\insat-nuget_x64_PROD-wapt\WAPT\.. ...
2021-07-02 10:41:13,071 CRITICAL Fatal error in audit function: CalledProcessErrorOutput: Command '$ProgressPreference = "SilentlyContinue"\n(#Script pour determiner si Nuget est installé et dans quelle version\n\nTry{\n    $Version = (Get-PackageProvider -Name "Nuget" -ErrorAction SilentlyContinue).Version\n    $Result = "NuGet found. Version : $($Version.ToString())"\n}\nCatch{\n    $Result = "NuGet not found."\n}\n\n\n$Result) | ConvertTo-Json' returned non-zero exit status 1.
Output:#< CLIXML
<Objs Version="1.1.0.1" xmlns="http://schemas.microsoft.com/powershell/2004/04"><S S="Error">Au caractère Ligne:7 : 2_x000D__x000A_</S><S S="Error">+ }_x000D__x000A_</S><S S="Error">+  ~_x000D__x000A_</S><S S="Error">Parenthèse fermante « ) » manquante dans l'expression._x000D__x000A_</S><S S="Error">Au caractère Ligne:8 : 1_x000D__x000A_</S><S S="Error">+ Catch{_x000D__x000A_</S><S S="Error">+ ~~~~~_x000D__x000A_</S><S S="Error">Jeton inattendu « Catch » dans l'expression ou l'instruction._x000D__x000A_</S><S S="Error">Au caractère Ligne:13 : 8_x000D__x000A_</S><S S="Error">+ $Result) | ConvertTo-Json_x000D__x000A_</S><S S="Error">+        ~_x000D__x000A_</S><S S="Error">Jeton inattendu « ) » dans l'expression ou l'instruction._x000D__x000A_</S><S S="Error">Au caractère Ligne:13 : 10_x000D__x000A_</S><S S="Error">+ $Result) | ConvertTo-Json_x000D__x000A_</S><S S="Error">+          ~_x000D__x000A_</S><S S="Error">Un élément de canal vide n'est pas autorisé._x000D__x000A_</S><S S="Error">    + CategoryInfo          : ParserError: (:) [], ParentContainsErrorRecordException_x000D__x000A_</S><S S="Error">    + FullyQualifiedErrorId : MissingEndParenthesisInExpression_x000D__x000A_</S><S S="Error"> _x000D__x000A_</S></Objs>:

Beachten Sie, dass es wie erwartet funktioniert, wenn ich dies in das Audit einfüge:

Code: Alle auswählen

    result = run('C:\\Windows\\System32\WindowsPowerShell\\v1.0\\powershell.exe -NoProfile -File .\\Get-INSANugetVersion.ps1')
    print(result)

Code: Alle auswählen

Ligne de Commande : audit -f "c:\waptdev\insat-nuget_x64_PROD-wapt\WAPT\.."
Using config file: C:\Program Files (x86)\wapt\wapt-get.ini
Auditing c:\waptdev\insat-nuget_x64_PROD-wapt\WAPT\.. ...
NuGet found. Version : 2.8.5.208

c:\waptdev\insat-nuget_x64_PROD-wapt\WAPT\.. -> UNKNOWN
Ich verstehe also nicht, warum run_powershell_from_file erzeugt einen Fehler, da von der PowerShell-Konsole und mit laufen Ich habe keine Probleme?

Ich danke Ihnen für Ihre Hilfe!

--------------------------------------------------------------------------------------------------------------------------
- Installierte WAPT-Version: 2.0
- Server-Betriebssystem: Linux Ubuntu 20.04
- Betriebssystem des Administrations-/Paketerstellungsrechners: Windows 10 (20H2)

Betreff: Problem mit run_powershell_from_file

Veröffentlicht: 7. Juli 2021 - 10:33 Uhr
von dcardon
Hallo Cédric,
wir verwenden einen Blob als Parameter, da Windows das Laden von PowerShell-Skripten in .ps1-Dateien häufig blockiert. Ich bin allerdings überrascht, dass das Skript nicht in Base64 konvertiert wurde. Ich werde intern ein Ticket erstellen.
Viele Grüße,
Denis

Betreff: Problem mit run_powershell_from_file

Veröffentlicht: 7. Juli 2021 - 17:02 Uhr
von dcardon
Das Skript wurde im Code korrekt in Base64 konvertiert. PowerShell kann mitunter etwas unzuverlässig sein. Ich habe einige Korrekturen vorgenommen. Sie können die Funktion `run_powershell()` auf Ihrem Testrechner durch diese ersetzen, um die Funktion zu überprüfen. Ich habe es selbst getestet und es funktionierte einwandfrei mit Ihrem Skript. Diese Korrektur wird in der nächsten Version 2.1 enthalten sein.

Aufrichtig,

Denis

Code: Alle auswählen

def run_powershell(cmd, output_format='json', **kwargs):
    """Run a command/script (possibly multiline) using powershell, return output in text format
    If format is 'json', the result is piped to ConvertTo-Json and converted back to a python dict for convenient use

    WARNING: This works only with powershell >= 3

    Args:
        output_format (str): set output format as json (default) or xml (ElementTree object) or text

    Returns:
        str or dict or list

    .. versionadded:: 1.3.9
    """
    if output_format not in ('json','text','xml'):
        raise ValueError("Input parameter output_format not correct (json/text/xml expected: %s" % output_format)


    output_version = run('powershell -NoLogo -NoProfile -NonInteractive -ExecutionPolicy Unrestricted -Command "$PSVersionTable.PSVersion.Major"').strip()

    try:
        if int(output_version)<3 :
            raise Exception('run_powershell need powershell version >=3, please install tis-powershell package first')
    except:
        pass

    cmd = ensure_unicode(cmd)

    if output_format == 'json':
        output_format_ps = 'text'
        cmd = '$ProgressPreference = "SilentlyContinue"\n%s  | ConvertTo-Json ' % cmd
    else:
        output_format_ps = output_format
    # command is a utf16 without bom encoded with base64 without \n
    # we should not get stderr so that ouput can be decoded as json. stderr get progress report...
    if not 'return_stderr' in kwargs or not isinstance(kwargs['return_stderr'], list):
        return_stderr = []
    else:
        kwargs.pop('return_stderr')
    try:
        with disable_file_system_redirection():
            cmd = 'powershell -NoLogo -NoProfile -NonInteractive -ExecutionPolicy Unrestricted -OutputFormat %s -EncodedCommand "%s" ' %  (output_format_ps,  base64.b64encode(cmd.encode('utf-16le')).decode('utf-8'))
            logger.debug("running powershell command : \n%s" % cmd)
            result = run(cmd,
                         return_stderr=return_stderr,
                         **kwargs)
    except CalledProcessErrorOutput as e:
        raise CalledProcessErrorOutput(e.returncode, cmd, e.output)

    # remove comments...
    if output_format.lower() == 'xml':
        lines = [l for l in result.splitlines() if not l.strip().startswith('#') and l.strip()]
        import xml.etree.ElementTree as ET
        return ET.fromstringlist(lines)
    elif output_format.lower() == 'json':
        lines = [l for l in ensure_unicode(result).splitlines() if not l.strip().startswith('#')]
        if not lines:
            return None
        else:
            try:
                json_output = json.loads('\n'.join(lines))
                return json.dumps(json_output)
            except ValueError as e:
                raise ValueError('%s returned non json data:\n%s' % (cmd, result))
    else:
        return result

Betreff: [GELÖST] Problem mit run_powershell_from_file

Veröffentlicht: 8. Juli 2021 - 11:50 Uhr
von Cédric Morin
Hallo,

ich werde das so schnell wie möglich testen. Hoffentlich noch vor Monatsende, wir sind momentan ziemlich ausgelastet!

Cedric.

Betreff: [GELÖST] Problem mit run_powershell_from_file

Veröffentlicht: 20. Juli 2021 - 10:19 Uhr
von Cédric Morin
Hallo,

ich habe gerade ein paar Tests durchgeführt, und es scheint mit dem Fix einwandfrei zu funktionieren!

Vielen Dank!