CMD Aurfuf haut nicht hin

  • Hallo liebe Autoit Experten, ich habe eine kurzes CMD, was in der Konsole so auch funktioniert und ein Zertifikat importiert.

    certutil -f -p pass -user -importpfx "C:\Users\user1\Desktop\59116_zert_asa-ssl_b.pfx"

    In Autoit habe ich versucht dies so aufzurufen:

    AutoIt
    $file = "C:\Users\user1\Desktop\59116_zert_asa-ssl_b.pfx"
    $pass = 'pass'
    $cmd = Run(@ComSpec & " /c " & "certutil -f -p " & $pass & " -user -importpfx "" & $file" & " & Pause", """, "", @SW_SHOW)


    Er meckert zwar nichts, aber er tut leider auch nichts, Hat einer ne Idee woran es liegen könnte


    lg und schöne Restwoche noch

  • Da passt einiges nicht.

    Ich habe das mal korrigiert und das so gebaut, das wenn du es per F5 startest es dir den CMD Befehl in der Console ausgibt.

    Annahme: Der Pfad soll in " eingefasst werden.

    AutoIt
    $file = "C:\Users\user1\Desktop\59116_zert_asa-ssl_b.pfx"
    $pass = 'pass'
    $cmd  = "certutil -f -p " & $pass & ' -user -importpfx "' & $file & '"' ;Ich empfehle immer die Verwendung von ' denn dann machen eingefasste " kein Problem mehr
    ConsoleWrite($cmd & @CRLF)
    $Return = Run(@ComSpec & " /c " & $cmd, "", @SW_SHOW) ;Ich empfehle /k ansatt /c zu nutzen wenn man das Ergebnis sehen will, dann braucht man auch kein & Pause
  • Hinter $file ist dann ein Anführungszeichen zu viel.

    Ausgeben kannst du es so:

    AutoIt
    $file = "C:\Users\user1\Desktop\59116_zert_asa-ssl_b.pfx"
    $pass = 'pass'
    
    $sCommand = "certutil -f -p " & $pass & " -user -importpfx " & $file & " & Pause"
    
    ConsoleWrite($sCommand & @CRLF)
    
    Run($sCommand, "", "", @SW_SHOW)

    Certutil ist auch kein Befehl der cmd.exe sondern ein ausführbares Programm.
    Daher brauchst du dafür auch kein @comspec

  • Jo danke Euch beiden, also er tut jetzt was und die Zeile sieht auch so aus, wie sie in der Konsole funzzt, aber er hau es nicht nach Eigene Zertifikate rein, schon komisch, trotzdem Danke noch mal, habt mir sehr geholfen. Dat muss man halt wissen, dass man nur ' bei Passwörten nutzen darf.


    lg

  • Dat muss man halt wissen, dass man nur ' bei Passwörten nutzen darf.

    Das habe ich so nicht gesagt.

    Ich sage nur, wenn " im String vorkommen, dann sollte man ' nutzen. Es gibt noch einen Weg über mehrere " hintereinander aber ich finde es wird dan unleserlich.

    Zudem kommt es eher vor das " im String vorkommen, als ' und somit ist man mit ' zum Einfassen auf der besseren Seite. (Meine Meinung!)

    Außerdem waren da auch noch für den Run Aufruf deine Parameter Anordnung falsch (@SW_SHOW muss in den vorletzten Parameter, der letzte Parameter ist ein opt_Flag). Siehe dazu: https://www.autoitscript.com/autoit3/docs/functions/Run.htm

  • okidoki dann weiss ich Bescheid, nur eine keine Frage möchte ich noch anschliessen, denke passt noch gut hier rein, ich habe jetzt folgende kleine GUI gescripted, mit passwort Eingabe, soweit kein Ding. Leider bekomem ich es nicht gelösst den Errolevel der CMD auszulesen, dh, wenn dieser 0 ist alels ok, wenn ungleich 0 zurück zur Passwortabfrage, gibt es dafür in AutoIT auch eine Lösung? habe es mit error versucht, aber das ist immer 0. Das Teil sieht jetzt so aus:

    Danke schon mal und einen angenehmen Abend noch

  • Ganz ehrlich: Bitte nutze #AutoIt3Wrapper_Au3Check_Parameters=-q -d -w 1 -w 2 -w 3 -w 4 -w 5 -w 6 -w 7 damit kannst du shcon viele Fehler/Probleme vermeiden.

    Es gibt keine Lokal Variablen im globalen Kontext und man deklariert keine Global Variablen in einer (lokalen) Funktion. Ich selber empfehle auch nicht mitten im Code eine Variable zu deklarieren (bei dir: Zeile 34), sondern diese immer an einem Ort (Global z.B. start im Script, bei Funktionen in den ersten Zeilen der Funktion), dann muss man diese später nicht suchen und hat es auf einen Blick und eine klare Strucktur.

    3 Mal editiert, zuletzt von Moombas (3. Februar 2023 um 09:12)

  • Was haltet Ihr von folgender Idee:

    Verlagere den cmd Aufruf erstmal in eine *.bat datei. Probiere aus ob der Aufruf aus der *.bat funktioniert. Erst wenn das gegeben ist, transportiere den Aufruf nach Autoit. Oder erspare die den Transport, indem du von Autoit aus die *.bat aufrufst.


    So long

    Peter

    Hinweise auf Suchmaschinen finde ich überflüssig - wer fragt hat es nicht gefunden oder nicht verstanden. Die Antwort gibt sich oftmals schneller als der Hinweis auf Dr. Goggle & Co.

    Ab 19-10-22 ergänzt um:

    Die Welt wird nicht bedroht von den Menschen, die böse sind, sondern von denen, die das Böse zulassen. (Albert Einstein)

  • Warum sollte man das machen?

    Das Einzige was aus meiner Sicht Sinniger wäre, wäre ein Runwait anstatt des Run.

    Das Runwait liefert den Exitcode des Aufrufs zurück und sollte damit verarbeitbar sein.

  • Weil für alle Beteiligten, oftmals die verschachtelten Anführungszeichen in AutoIt ein Problem sind. Das sieht man hier im Forum an verschiedensten Beiträgen. Fehler immer an den Anführungszeichen. CMD Befehl in die Batch kopieren, und mal sehen ob er da läuft? Dauert ein paar Sekunden, und die Überraschung ist oftmals groß.

    Hinweise auf Suchmaschinen finde ich überflüssig - wer fragt hat es nicht gefunden oder nicht verstanden. Die Antwort gibt sich oftmals schneller als der Hinweis auf Dr. Goggle & Co.

    Ab 19-10-22 ergänzt um:

    Die Welt wird nicht bedroht von den Menschen, die böse sind, sondern von denen, die das Böse zulassen. (Albert Einstein)

  • Also ich hab mal noch ein bisl rum experimentiert, mein Script ist jetzut in der Lage einen Errorwert auszulesen. Leider gint es noch ein kleines Problem. Wenn ich einmal das Passwort falsch eingebe fragt er noch mal, beim zweiten mal Faslscheingabe geht es nicht mehr, vielleicht sollt ich mal nen Tag Gras drüber wachsen lassen, vielleicht sieht ja einer den Fehler. Danke noch mal allen die geholfen haben. Mein Kurzscript schaut jetzt so aus:

    lg und schönen Abend noch

  • Code
    Func Password()
     global $pass....
     Return

    Geht ja gar nicht....In den Funktionen immer lokale Variablen definieren!

    Zu Deinen Errorlevel: Es gibt laut Doku STDERR-Stream den man abfragen kann...das habe ich selbst zwar noch nie benutzt aber ich bin sicher das es funktioniert.

    Oder Du leitest den Output vom CMD in eine Datei um: Beispiel "dir /s >%temp% 2&1" (die Anführungszeichen dürfen nicht sein, ist nur für die besser zu erkennen.

    Ich bin mir auch nicht sicher ob der Returnwert vom RUN dem Errorlevel des externen Programme entspricht. Meiner Meinung nach ist das RUN hier nicht die beste Wahl, eher ein Runwait, das Script soll ja warten bis das Zertifikat installiert ist, danach den Errorlevel certutil auswerten und dann weitere Aktionen setzten....

    lg

    Harald

  • Danke für die Antwort, der Errorlevel entpricht dem aus der CMD, ich werde die GLoals aus den Funktionen entfernen, vielleicht lösst das ja mein Problem, dass das Errorhandlicg bei Fehleingabe nur einmal funktioniert.

    lg und schönen Abend

  • Also an den Globals in den Funktionen hats nicht gelegen, die habe ich nun alle erntfernt. Jemand noch ne Idee, wie gesagt den %Errorlevel% zieht er sich jetzt korrekt.

  • Also noch mal konkret meien Frage, an welche Stelle packe ich denn am besten die checks, direkt in Schie While Scheife, oder alles einzenl in Funktionen, welches Vorgehen würdet Ih empfehlen, damit das ganze mehrn als einmal funktioniert?

    lg und schönes Wochenende

  • Ich hab den Code mal genommen und ihn umgeschrieben.

    Das wichtigste, was dir fehlt, ist Errorhandling. Wenn ein Fehler auftritt, sollte dieser als Fehler in der jeweiligen Funktion behandelt werden und Funktionsaufrufe sollten auf Fehler geprüft werden.

    Außerdem sollte man Globale Variablen so gut wie möglich vermeiden. Das bedeutet mehr als nur alle Global to Local zu wechseln. Es betrifft die Struktur, wie der Code aufgebaut ist. Ich hoffe, der Code von mir zeigt dir, wie das am besten geht.

    Ich hab die Fenstergröße,... wie immer als Variablen definiert. Das sorgt dafür, dass du die Größe nur an einer Stelle geändert werden muss, und alles andere wird automatisch angepasst.

    Variablen sollte mit dem Typ beginnen, der in ihnen gespeichert wird (wenn möglich). Stichwort "ungarische Notation": unter Names of Variables

    Dadurch, dass alles in einer Funktion ist, kann ich den Funktionsaufruf auch einfach in einer While-Schleife wrappen, sodass es mehrmals probiert wird.

    Ich hoffe, das hilft dir weiter :)