Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi CreateProcessWithLogonW mit Parameters ? (https://www.delphipraxis.net/140391-createprocesswithlogonw-mit-parameters.html)

cherry 17. Sep 2009 11:20


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:
  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';
Folgendes habe ich bereits versucht:

lpApplicationName = exe + params
lpCommandLine = exe + params
lpApplicationName = exe UND lpCommandLine = params

geht alles nicht....

Luckie 17. Sep 2009 11:23

Re: CreateProcessWithLogonW mit Parameters ?
 
Was heißt "geht nicht"? :roll:

ringli 17. Sep 2009 11:24

Re: CreateProcessWithLogonW mit Parameters ?
 
Wie sieht denn dein Aufruf genau aus?

nahpets 17. Sep 2009 11:26

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?

cherry 17. Sep 2009 12:35

Re: CreateProcessWithLogonW mit Parameters ?
 
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:

Zitat von Luckie
Was heißt "geht nicht"? :roll:

Hab grad was seltsames Festgestellt: Wenn ich für lpApplicationName den Pfad und Name der exe Datei angebe und für lpCommandLine die Parameter, dann scheints doch zu klappen... Jedoch nicht bei der Datei die ich testen wollte!

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:
    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;
Funktion:
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;

nahpets 17. Sep 2009 13:00

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:
@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
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.

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:
@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
Mit ein bisserl Glück kommst Du so an eine Fehlermeldung, die Dir bei der Problemlösung weiterhelfen könnte.

[edit]Schreibfehler in der zweiten Batchdatei behoben, statt @ECHO hinter Setup > log.datei muss es @ECHO hinter Setup >> log.datei heißen.[/edit]

cherry 17. Sep 2009 13:12

Re: CreateProcessWithLogonW mit Parameters ?
 
Zitat:

Zitat von nahpets
Was für eine Ausgabe bekommst Du, wenn Du die Setup.exe mit dem Paramter /s von der Kommandozeile aufrufst?

in der textdatei "%ERRORLEVEL% >> error.log" steht nichts drinn. Ist ja auch logisch, das Setup wird, wenn ichs in der Kommandozeile eingebe so installiert wies sein soll...

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?

cherry 30. Sep 2009 08:49

Re: CreateProcessWithLogonW mit Parameters ?
 
Per Zufall habe ich den Fehler entdeckt: [Danke Luckie]

http://www.michael-puff.de/Developer...thLogonW.shtml

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.

Luckie 30. Sep 2009 09:02

Re: CreateProcessWithLogonW mit Parameters ?
 
Zitat:

Zitat von cherry
Per Zufall habe ich den Fehler entdeckt: [Danke Luckie]

Dafür dass ich direkt mit der Nase draufgestoßen habe: http://www.delphipraxis.net/internal...084732#1084732 war der Zufall nicht besonders groß. :roll:

cherry 30. Sep 2009 09:39

Re: CreateProcessWithLogonW mit Parameters ?
 
Zitat:

Zitat von Luckie
Zitat:

Zitat von cherry
Per Zufall habe ich den Fehler entdeckt: [Danke Luckie]

Dafür dass ich direkt mit der Nase draufgestoßen habe: http://www.delphipraxis.net/internal...084732#1084732 war der Zufall nicht besonders groß. :roll:

Na ja, je nach dem wie man es Betrachtet:
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: http://www.delphipraxis.net/internal....php?p=1084732 und in diesem Thread präsentiertest du mir dann die Lösung für diesen Thread hier. Somit wäre der Thread http://www.delphipraxis.net/internal....php?p=1084732 überflüssig gewesen.

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 15:43 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz