Page 1 sur 1

[RESOLU] Probleme avec run_powershell_from_file

Posté : 02 juil. 2021 - 10:59
par Cédric Morin
Bonjour,

Je rencontre un petit souci avec le setup helpers run_powershell_from_file. J'ai écrit mon script en PowerShell et ne semble pas avoir de souci a s'exécuter.

Code : Tout sélectionner

#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
Quand je donne à manger a ma fonction d'audit ceci :

Code : Tout sélectionner

run_powershell_from_file("Get-INSANugetVersion.ps1",output_format='json')
J'ai un grand message d'erreur :

Code : Tout sélectionner

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>:

À noter que si je met ceci dans l'audit, cela fonctionne comme attendu :

Code : Tout sélectionner

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

Code : Tout sélectionner

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
Donc je ne comprends pas pourquoi run_powershell_from_file génère une erreur, puisque que depuis la console PowerShell et avec run je n'ai pas de soucis ?

Merci de votre aide !

--------------------------------------------------------------------------------------------------------------------------
- Version de WAPT installée : 2.0
- OS du serveur : Linux Ubuntu 20.04
- OS de la machine d'administration/création des paquets : Windows 10 (20H2)

Re: Probleme avec run_powershell_from_file

Posté : 07 juil. 2021 - 10:33
par dcardon
Bonjour Cédric,
on passe par un blob en paramètre car windows bloque souvent le chargement de script powershell en ficher .ps1. Par contre je suis étonné que le script ne soit pas passé en base64... Je vais faire un ticket en interne.
Cordialement,
Denis

Re: Probleme avec run_powershell_from_file

Posté : 07 juil. 2021 - 17:02
par dcardon
Le script est bien passé en base64 dans le code. Le powershell peut être assez capricieux. J'ai fait deux trois correctifs. Vous pouvez essayer de remplacer la fonction run_powershell() sur votre machine de test par celle ci pour valider que c'est ok. J'ai fait le test de mon côté c'est bien passé avec votre script. Ca sera dans la prochaine release 2.1.

Cordialement,

Denis

Code : Tout sélectionner

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

Re: [RESOLU] Probleme avec run_powershell_from_file

Posté : 08 juil. 2021 - 11:50
par Cédric Morin
Bonjour,

Je vais tester cela dès que possible. J'espère avant la fin du mois, on est assez occupé là !

Cédric.

Re: [RESOLU] Probleme avec run_powershell_from_file

Posté : 20 juil. 2021 - 10:19
par Cédric Morin
Bonjour,

Je viens de faire quelques essais, cela semble fonctionner correctement avec le correctif !

Merci !