Exit Codes von Systemcalls

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
OTimme
User
Beiträge: 5
Registriert: Montag 17. Juni 2019, 08:33

Hallo zusammen

für eine Automatisierung probiere ich mit Python ein Kommandozeilenprogramm zu benutzen, dass mir die Konfguration eines VPN Clients sichert (Forticlient). Ich habe es mit Hilfe aus dem Forum geschafft, das Programm via Python mit administrativen Rechten zu starten. Die Konfiguration wird jedoch nicht exportiert und ich kann natürlich auch keine Ausgabe des Programmes sehen.

Wie kann ich bei einem Systemcall die Ausgabe umlenken oder Exit-Codes abfragen?

Danke für euren Input!

Das ist das Script dazu:

Code: Alles auswählen

import ctypes, sys

fcconfig_file = 'fcconfig.exe'
fcclient_path = "C:\\Program Files\\Fortinet\\FortiClient\\"
fcclient_output_path = 'c:\\temp\\'
fcclient_output_file = 'settings.xml'
fcclient_arguments = ' -m all -f ' + fcclient_output_path + fcclient_output_file + ' -o export -i 1'

def is_admin():
    try:
        return ctypes.windll.shell32.IsUserAnAdmin()
    except:
        return False

if not is_admin():
    ctypes.windll.shell32.ShellExecuteW(None, "runas", fcconfig_file, fcclient_arguments, fcclient_path, 1)
__deets__
User
Beiträge: 14525
Registriert: Mittwoch 14. Oktober 2015, 14:29

ShellExecuteW hat eine eigenen Rückgabewert. https://docs.microsoft.com/en-us/window ... llexecutew

Kann aber sein, dass der sich nur auf die Ausführung des Kommandos bezieht, also wenn dabei Probleme auftreten.

Und die Situation mit stdout/err/in ist etwas unübersichtlich bei Windows. Das Prinzip von pipes zwischen Prozessen ist da eher nicht so verbreitet.
OTimme
User
Beiträge: 5
Registriert: Montag 17. Juni 2019, 08:33

Den Rückgabewert von ShellExecuteW habe ich inzwischen, der sagt aber nur aus, dass die Ausführung geklappt hat (Wert > 32).
Sirius3
User
Beiträge: 17738
Registriert: Sonntag 21. Oktober 2012, 17:20

die Fehlerbehandlung in `is_admin` ist Quatsch. Welchen Fehler erwartest Du denn beim Aufruf von IsUserAnAdmin? Also, weg damit.

Dass es problematisch ist, einfach irgendeinen String den Du auch noch mit + zusammenstückelst, als Argument zu nehmen, wurde Dir schon gesagt.
Warum verwendest Du nicht subprocess? Das benutzt intern genauso ShellExecuteW.
__deets__
User
Beiträge: 14525
Registriert: Mittwoch 14. Oktober 2015, 14:29

@Sirius3: ich habe nichts gefunden, wie mit supbrocess runas benutzt werden kann.

Allerdings habe ich auch ein anderes Vorgehen vorgeschlagen: ein extra Skript, welches per runas gestartet wird, und DAS startet dann per subprocess das eigentliche Programm. Da kann man dann mal mit Rueckgabewerten und ggf. sogar STDIN/OUT/ERR arbeiten, aber ob das von Erfolg gekroent ist unter Linux ist auch fraglich.
OTimme
User
Beiträge: 5
Registriert: Montag 17. Juni 2019, 08:33

Hallo zusammen

danke nochmals für eure Inputs. Mit Subprocess habe ich es nicht hinbekommen. Es gibt zwar einige Beispiele, aber die elevation der UAC klappt damit irgendwie nicht. Dafür habe ich es mit dem ersten Ansatz hinbekommen. Hier noch der (rohe) Code, vielleicht hilft es ja sonst noch jemandem.

@Sirius3 Du hattest recht mit dem " ... noch mit + zusammenstückelst ..." :geek:

Oliver

Code: Alles auswählen

import ctypes, sys

fcconfig_file = 'fcconfig.exe'
fcclient_path = "C:\\Program Files\\Fortinet\\FortiClient\\"

fcclient_output_path = "c:\\temp\\"
fcclient_output_file = 'settings.xml'

ret = ctypes.windll.shell32.ShellExecuteW(None, "runas", fcconfig_file, "-f {fcclient_output_path}{fcclient_output_file}", fcclient_path, 1)
__deets__
User
Beiträge: 14525
Registriert: Mittwoch 14. Oktober 2015, 14:29

Wie ich schon mehrfach schrieb: du sollst mit ShellExecute einen PYTHON-INTERPRETER starten. Mit einem Skript als Argument. Und DAS startet dann mit subprocess das eigentliche Programm. Dann kannst du zumindest hoffen, dass du sowohl Returncode als auch ggf. Standardausgabe bekommst.
Antworten