![]() |
CreateProcessWithLogonW mit Parameters ?
Hallo Leute
Ich versuche mit folgender API Funktion ein anderes Programm unter einem anderen Kontext zu starten. Wenn ich für lpApplicationName oder lpCommandLine das Programm ohne Parameter angebe, funktioniert alles Prima. Ich kriegs aber nicht hin ein Programm mit Parametern zu starten, wie muss ich vorgehen, oder ists gar nicht möglich?
Delphi-Quellcode:
Folgendes habe ich bereits versucht:
function CreateProcessWithLogonW(lpUsername, lpDomain, lpPassword: PWideChar;
dwLogonFlags: dword; lpApplicationName, lpCommandLine: PWideChar; dwCreationFlags: dword; lpEnvironment: pointer; lpCurrentDirectory: PWideChar; lpStartupInfo: PStartUpInfoW; lpProcessInfo: PProcessInformation): boolean; stdcall; external 'advapi32.dll'; lpApplicationName = exe + params lpCommandLine = exe + params lpApplicationName = exe UND lpCommandLine = params geht alles nicht.... |
Re: CreateProcessWithLogonW mit Parameters ?
Was heißt "geht nicht"? :roll:
|
Re: CreateProcessWithLogonW mit Parameters ?
Wie sieht denn dein Aufruf genau aus?
|
Re: CreateProcessWithLogonW mit Parameters ?
Hallo,
wie ist der Pfad zum Programm, ist es im Suchpfad? Gibt es da irgendwo Leerzeichen drin, so dass Du eventuell " um die Programmangabe machen musst? |
Re: CreateProcessWithLogonW mit Parameters ?
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:
Ich versuchte eine Netzwerkkartentreiber Setup mit dem Parameter /s durchzuführen, das klappte nicht -> Es gab kein fehler aber es passierte auch sonst nichts. Wenn ich den Parameter weglasse startet das Setup, aber eben nicht silent. Wenn ich notepad starte, kann ich einen Dateipfad als Parameter mitgeben und da funktioniert es, es startet notepad mit der angegebenen Datei. Is ja oberkomisch... Hier mal ein Ausschnitt des Programms: (Hab auch noch die ganze Source hochgeladen) Aufruf:
Delphi-Quellcode:
Funktion:
if ExtractFilePath(ParamStr(4)) = '' then
COMMANDLINE:=PWideChar(ExtractFilePath(ParamStr(0))+ParamStr(4)) else COMMANDLINE:=PWideChar(ParamStr(4)); for I := 5 to ParamCount do PARAMS := PWideChar(String(PARAMS) + ' ' + ParamStr(I)); WriteLn('"'+String(COMMANDLINE)+String(PARAMS) +'"'); USER:=PWideChar(ParamStr(1)); DOMAIN:=PWideChar(ParamStr(2)); PW:=PWideChar(ParamStr(3)); if not runas(USER, DOMAIN, PW, COMMANDLINE, PARAMS) then begin WriteLn(PChar(SysErrorMessage(GetLastError))); end;
Delphi-Quellcode:
function Runas(USER,DOMAIN,PW,COMMANDLINE,PARAMS:PWideChar):boolean;
const LOGON_WITH_PROFILE = $00000001; function CreateProcessWithLogonW(lpUsername, lpDomain, lpPassword: PWideChar; dwLogonFlags: dword; lpApplicationName, lpCommandLine: PWideChar; dwCreationFlags: dword; lpEnvironment: pointer; lpCurrentDirectory: PWideChar; lpStartupInfo: PStartUpInfoW; lpProcessInfo: PProcessInformation): boolean; stdcall; external 'advapi32.dll'; implementation function Runas(USER,DOMAIN,PW,COMMANDLINE,PARAMS:PWideChar):boolean; var si : TStartupInfoW; pif : TProcessInformation; begin ZeroMemory(@si,sizeof(si)); si.cb := sizeof(si); si.dwFlags := STARTF_USESHOWWINDOW; si.wShowWindow := 1; if DOMAIN <> 'nil' then begin result := CreateProcessWithLogonW(USER,DOMAIN, PW,LOGON_WITH_PROFILE, COMMANDLINE, PARAMS, CREATE_DEFAULT_ERROR_MODE,nil,nil,@si,@pif); end else begin result := CreateProcessWithLogonW(USER,nil, PW,LOGON_WITH_PROFILE, COMMANDLINE, PARAMS, CREATE_DEFAULT_ERROR_MODE,nil,nil,@si,@pif); end; end; |
Re: CreateProcessWithLogonW mit Parameters ?
Hallo,
mal 'nen blöden Vorschlag: Baue mal eine Batchdatei, die das Setup /s enthält und frage anschließend den Errorlevel ab, eventuell hat die Setup.exe ja irgendein Problem.
Code:
Wenn Du dann in die log.datei schaust, solltest Du deren Errorlevel sehen, wenn der <> 0 ist, liegt die Vermutung nahe, dass sie Dir einen Hinweis auf einen Fehler geben will. 0 ist ellerdings nicht zwingend identisch mit keinem Fehler.
@ECHO OFF
@ECHO Vor Setup > log.datei :REM in der nächsten Zeile mit komplettem Pfad angeben setup /s @ECHO Rueckgabewert der Setup.exe %ERRORLEVEL% >> log.datei Was für eine Ausgabe bekommst Du, wenn Du die Setup.exe mit dem Paramter /s von der Kommandozeile aufrufst? Wenn dort eine Textausgabe kommt, könntest Du die Batchdatei auch mal dahingehend ändern:
Code:
Mit ein bisserl Glück kommst Du so an eine Fehlermeldung, die Dir bei der Problemlösung weiterhelfen könnte.
@ECHO OFF
@ECHO Vor Setup > log.datei :REM in der nächsten Zeile mit komplettem Pfad angeben setup /s >> log.datei @ECHO hinter Setup >> log.datei @ECHO Rueckgabewert der Setup.exe %ERRORLEVEL% >> log.datei [edit]Schreibfehler in der zweiten Batchdatei behoben, statt @ECHO hinter Setup > log.datei muss es @ECHO hinter Setup >> log.datei heißen.[/edit] |
Re: CreateProcessWithLogonW mit Parameters ?
Zitat:
Aber ich hab da eine wage Vermutung: Wenn ich das Setup in einem Batch ausführe, bleibt die Kommandozeile so lange offen, bis das Setup fertig ist und schliesst dann. Wenn ich Programme mit ERunAs starte funktionieren diese IMHO wenns nur darum geht kurz mal was zu starten. Ich hab das gefühl, dass wenn ERunAs das Setup zwar startet, dann aber gleich wieder abschiesst, weil ERunAs nicht wartet bis das Setup beendet ist... Was ich auch noch versucht habe ist: (setup.exe /s) in einen batch, dann den Batch mit ERunAs starten. Geht auch nicht. Ich seh mal kurz dass ein CMD startet, dann aber gleich wieder zu geht... Ideen? |
Re: CreateProcessWithLogonW mit Parameters ?
Per Zufall habe ich den Fehler entdeckt: [Danke Luckie]
![]() Der korrekte Aufruf erfolgt so: (Die entsprechende Stelle ist markiert) result := CreateProcessWithLogonW(PWideChar(USER),PWideChar( DOMAIN), PWideChar(PW),LogonType, nil, PWideChar(APPLICATION +' "'+ PARAMS +'"'), CREATE_DEFAULT_ERROR_MODE,nil,nil,@si,@pif); So, Problem gelöst. |
Re: CreateProcessWithLogonW mit Parameters ?
Zitat:
![]() |
Re: CreateProcessWithLogonW mit Parameters ?
Zitat:
Ich versuchte ein Problem mit CreateProcessWithLogonW zu lösen, aber ich kriegte es nicht hin. Deshalb dieser Thread hier. Als mir nieman Helfen konnte, resp. ich es einfach nicht hinbekommen habe, entschied ich mich einen anderen Lösungsansatz zu wählen. Da hatte ich das Problem hier: ![]() ![]() Wenn ich nun aber das sperren der Tastatur und Maus auf Anhieb hinbekommen hätte, so hätte ich CreateProcessWithLogonW wohl nie hinbekommen... Und wenn man das so betrachtet ist das schon eher witzig. Oder?!! :stupid: |
Alle Zeitangaben in WEZ +1. Es ist jetzt 12:56 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz