Seite 1 von 1

Exit Codes von Systemcalls

Verfasst: Dienstag 18. Juni 2019, 08:42
von OTimme
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)

Re: Exit Codes von Systemcalls

Verfasst: Dienstag 18. Juni 2019, 09:19
von __deets__
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.

Re: Exit Codes von Systemcalls

Verfasst: Dienstag 18. Juni 2019, 09:26
von OTimme
Den Rückgabewert von ShellExecuteW habe ich inzwischen, der sagt aber nur aus, dass die Ausführung geklappt hat (Wert > 32).

Re: Exit Codes von Systemcalls

Verfasst: Dienstag 18. Juni 2019, 09:42
von Sirius3
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.

Re: Exit Codes von Systemcalls

Verfasst: Dienstag 18. Juni 2019, 10:06
von __deets__
@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.

Re: Exit Codes von Systemcalls

Verfasst: Dienstag 18. Juni 2019, 16:36
von OTimme
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)

Re: Exit Codes von Systemcalls

Verfasst: Dienstag 18. Juni 2019, 16:50
von __deets__
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.