IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Scripts/Batch Discussion :

string tronquée indûment lors d'un décodage Base64 [Batch]


Sujet :

Scripts/Batch

  1. #1
    Membre habitué
    Inscrit en
    Novembre 2004
    Messages
    415
    Détails du profil
    Informations forums :
    Inscription : Novembre 2004
    Messages : 415
    Points : 138
    Points
    138
    Par défaut string tronquée indûment lors d'un décodage Base64
    Bonjour,
    Je cherche à lancer une tâche sur une machine distante et j'ai le nom du user encodé en Base64, j'ai donc fait le script suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    REM echo off
    setlocal
    set "u64=aDI0NDcxOQ=="
    call :atob usr %u64%
    schtasks /Run /S aaa.bbb.ccc.ddd /U %usr% /P toto /TN "My Scheduler Task Name"
    goto :EOF
    :atob <var_to_set> <str>
    for /f "delims=" %%I in (
    	'powershell "[Text.Encoding]::UTF8.GetString([convert]::FromBase64String(\"%~2\"))"'
    ) do set "%~1=%%I"
    goto :EOF
    Le problème vient des 2 derniers caractères de u64. En effet les 2 signes '=' sont supprimés lorsque la commande powershell FromBase64String est appelée... J'ai compris que pour décoder du base64, il faut que la longueur de la string soit un multiple de 4, ce qui est pourtant bien le cas avec aDI0NDcxOQ==
    Voici l'output que je reçois :
    C:\Users\lambda>REM echo off
    C:\Users\lambda>setlocal
    C:\Users\lambda>set "u64=aDI0NDcxOQ=="
    C:\Users\lambda>call :atob usr aDI0NDcxOQ==
    C:\Users\lambda>for /F "delims=" %I in ('powershell"[Text.Encoding]::UTF8.GetString([convert]::FromBase64String(\"aDI0NDcxOQ\"))"') do set "usr=%I"
    C:\Users\lambda>set "usr=Exception calling "FromBase64String" with "1" argument(s): "Longueur non "
    C:\Users\lambda>set "usr=valide pour un tableau de caractères Base 64 ou une chaîne.""
    C:\Users\lambda>set "usr=At line:1 char:1"
    C:\Users\lambda>set "usr=+ [Text.Encoding]::UTF8.GetString([convert]::FromBase64String("aDI0NDcxOQ"))"
    C:\Users\lambda>set "usr=+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"
    C:\Users\lambda>set "usr= + CategoryInfo : NotSpecified: ( [], Me
    thodInvocationException"
    C:\Users\lambda>set "usr= + FullyQualifiedErrorId : FormatException"
    C:\Users\lambda>set "usr= "
    C:\Users\lambda>goto :EOF
    C:\Users\lambda>schtasks /Run /S aaa.bbb.ccc.ddd /U /P toto /TN "My Scheduler Task Name"
    Erreur*: Syntaxe incorrecte. Valeur attendue pour '/U'.
    Entrez "SCHTASKS /RUN /?" pour afficher la syntaxe.
    C:\Users\lambda>goto :EOF
    Tiens c'est bizarre, je vois d'ailleurs que ma balise ne met pas en gras les 2 caractères '=', ils sont exclus également, je ne sais pas s'il y a un rapport...

  2. #2
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 518
    Points
    41 518
    Par défaut
    Citation Envoyé par jmclej Voir le message
    Tiens c'est bizarre, je vois d'ailleurs que ma balise ne met pas en gras les 2 caractères '=', ils sont exclus également, je ne sais pas s'il y a un rapport...
    Si ils sont bien en gras, mais ça ne se voir pas bcp parce que le "gras" est purement horizontal (les traits sont plus longs, mais pas plus épais).
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  3. #3
    Membre habitué
    Inscrit en
    Novembre 2004
    Messages
    415
    Détails du profil
    Informations forums :
    Inscription : Novembre 2004
    Messages : 415
    Points : 138
    Points
    138
    Par défaut
    Merci pour la précision en effet.
    Sinon une idée sur le pb initial par hasard ?
    Pour tester il suffit de copier le contenu du script dans un fichier .bat et on peut même commenter la ligne 5 étant donné que mon problème se situe avant, au niveau de l'appel au powershell.
    Merci d'avance

  4. #4
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 518
    Points
    41 518
    Par défaut
    En fait, le problème a l'air d'être dans le call:
    Code Batch : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    rem echo off
    setlocal
    set "u64=aDI0NDcxOQ=="
    call :atob usr %u64%
    pause
    goto :EOF
    :atob <var_to_set> <str>
    echo %~1 %~2
    goto :EOF
    La sortie:
    Code X : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    D:\TempProg>rem echo off
    
    D:\TempProg>setlocal
    
    D:\TempProg>set "u64=aDI0NDcxOQ=="
    
    D:\TempProg>call :atob usr aDI0NDcxOQ==
    
    D:\TempProg>echo usr aDI0NDcxOQ
    usr aDI0NDcxOQ
    
    D:\TempProg>goto :EOF
    
    D:\TempProg>pause
    Press any key to continue . . .
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  5. #5
    Membre expert
    Avatar de sachadee
    Homme Profil pro
    AMI DU BAT
    Inscrit en
    Janvier 2013
    Messages
    1 478
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Brésil

    Informations professionnelles :
    Activité : AMI DU BAT
    Secteur : Distribution

    Informations forums :
    Inscription : Janvier 2013
    Messages : 1 478
    Points : 3 768
    Points
    3 768
    Par défaut
    Salut,

    apparement c'est powershell qui n'aime pas les 2 == envoyé dans %2.

    Je te donne une autre méthode :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    @echo off
    
    set "u64=aDI0NDcxOQ=="
    
    echo %u64%>tmp.txt
    certutil -decode tmp.txt tmp1.txt >nul
    for /f "delims=" %%a in (tmp1.txt) do set $decoded=%%a
    
    del tmp.txt&del tmp1.txt
    
    echo fait ce que tu veux avec =^> %$decoded%
    ________________________________
    Un p'tit coup de pouce ça fait toujours plaisir, pensez-y !
    ________________________________

  6. #6
    Membre habitué
    Inscrit en
    Novembre 2004
    Messages
    415
    Détails du profil
    Informations forums :
    Inscription : Novembre 2004
    Messages : 415
    Points : 138
    Points
    138
    Par défaut
    Merci mais j'ai trouvé une solution un peu plus élégante que de passer par un fichier temporaire (même si, si je n'avais pas eu cette autre réponse, j'aurais pris ta solution, donc merci vraiment).
    C'est ici : http://stackoverflow.com/questions/4...racters-from-a

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 2
    Dernier message: 12/03/2013, 11h56
  2. Bug sur uudecode (décodage base64) sur Aix ?
    Par jllc29 dans le forum AIX
    Réponses: 0
    Dernier message: 28/03/2012, 12h27
  3. comment utiliser un string tronqué
    Par boubounne dans le forum VB.NET
    Réponses: 6
    Dernier message: 02/05/2007, 16h10
  4. Réponses: 11
    Dernier message: 27/04/2006, 08h56
  5. Réponses: 2
    Dernier message: 21/06/2004, 15h55

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo