Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi TExec.exec mit Parameter? (https://www.delphipraxis.net/104099-texec-exec-mit-parameter.html)

Stephan 27. Nov 2007 12:37


TExec.exec mit Parameter?
 
Hallo,

ich starte aus meiner Anwendung eine fremde .exe (unter einem anderen Benutzer) über:

Delphi-Quellcode:
var
 exec: TExec
begin
 exec := TExec.Create;
 exec.RunAs(AppFile,Account,Domain,Password);
end;
auf. Das klappt soweit auch ganz gut, allerdings sollte ich nun noch einen Parameter "/xyz" beim Start der .exe mit übergeben. Allerdings scheint es bei dem Funktionsaufruf "RunAs" keinen Parameter hierfür zu geben. Hat jemand eine Idee, wie ich das Problem lösen kann?

ringli 27. Nov 2007 12:42

Re: TExec.exec mit Parameter?
 
Wie ist TExec denn definiert? Wie sieht TExec.RunAs aus?

Stephan 27. Nov 2007 12:49

Re: TExec.exec mit Parameter?
 
Argh, ja natürlich. Hatte vergessen, dass das garkeine Standardklasse ist. Ich hab hier mal was rauskopiert:

Delphi-Quellcode:
function TExec.RunAs(FileName:String;User,Domain,Password:String):Boolean;
begin
  if StartType<>0 then Result:=False else
  Result:=StartClientProcess(PChar(User),PChar(Domain),PChar(Password),PChar(FileName),fErr);
end;

function TExec.StartClientProcess(lpszUsername, lpszDomain, lpszPassword, lpCommandLine: PChar;var ERR_CODE:integer): Boolean;
var
  si: STARTUPINFO;
  ProfileInfo: TProfileInfo;
begin
  StartType:=1;
  ERR_CODE:=ERR_NONE;
  Result:=False;
  hdesktop:=0;
  hwinst:=0;
  hwinstSave:=0;
  pS:=nil;
  try
  if not LogonUser(lpszUsername,lpszDomain,lpszPassword,LOGON32_LOGON_INTERACTIVE,LOGON32_PROVIDER_DEFAULT,hToken) then
  begin
    ERR_CODE:=ERR_LOGON;
    Exit;
  end;
  hwinstSave:=GetProcessWindowStation;
  ERR_CODE:=ERR_WINST;
  if hwinstSave = 0 then Exit;
  hwinst := OpenWindowStation('winsta0',False, READ_CONTROL or WRITE_DAC);
  if hwinst = 0 then Exit;
  if not SetProcessWindowStation(hwinst) then Exit;
  ERR_CODE:=ERR_DESKTOP;
  hdesktop := OpenDesktop('default', 0, False, READ_CONTROL or WRITE_DAC or DESKTOP_WRITEOBJECTS or DESKTOP_READOBJECTS);
  if not SetProcessWindowStation(hwinstSave) then Exit;
  if hdesktop = 0 then Exit;
  if not GetLogonSID(hToken, pS) then Exit;
  if not AddAceToWindowStation(hwinst, pS) then Exit;
  if not AddAceToDesktop(hdesktop, pS) then Exit;

  FillChar(ProfileInfo, SizeOf(TProfileInfo),#0);
  ProfileInfo.dwSize := SizeOf(TProfileInfo);
  ProfileInfo.dwFlags := PI_NOUI;
  ProfileInfo.lpUserName :=lpszUsername;
  ERR_CODE:=ERR_LOADPROFILE;
  if not LoadUserProfile(hToken, ProfileInfo) then Exit;
  ERR_CODE:=ERR_IMPERSONATE;
  if not ImpersonateLoggedOnUser(hToken) then Exit;

  ZeroMemory(@si, SizeOf(STARTUPINFO));
  si.cb := SizeOf(STARTUPINFO);
  si.lpDesktop := PChar('winsta0\default');
  ERR_CODE:=ERR_CREATEPROCESS;
  Result := CreateProcessAsUser(hToken,lpCommandLine,nil, nil, nil, False,
      NORMAL_PRIORITY_CLASS or CREATE_NEW_CONSOLE, nil, PAnsiChar(ExtractFileDir(lpCommandLine)), si, pi);
  if not Result then ERR_CODE:=ERR_CREATEPROCESS else ERR_CODE:=ERR_NONE;
  RevertToSelf();

  finally

  end;
end;
interessant dürfte die Zeile sein:

Delphi-Quellcode:
  Result := CreateProcessAsUser(hToken,lpCommandLine,nil, nil, nil, False,
      NORMAL_PRIORITY_CLASS or CREATE_NEW_CONSOLE, nil, PAnsiChar(ExtractFileDir(lpCommandLine)), si, pi);
http://msdn2.microsoft.com/en-us/library/ms682429.aspx
Der Dritte Parameter sollte es sein. Ich probiers und melde mich dann wieder.

Progman 27. Nov 2007 12:52

Re: TExec.exec mit Parameter?
 
Vielleicht klappt es ja, den Parameter getrennt durch ein Leerzeichen direkt an FileName (bzw. den Exe-Namen) anzuhängen?

Stephan 27. Nov 2007 12:53

Re: TExec.exec mit Parameter?
 
Zitat:

Vielleicht klappt es ja, den Parameter getrennt durch ein Leerzeichen direkt an FileName (bzw. den Exe-Namen) anzuhängen?
leider nicht, schon getestet :)

Irgendwie scheint das auch nicht mit dem dritten Parameter zu funktionieren. Der Aufruf sieht nun wie folgt aus:

Delphi-Quellcode:
  Result := CreateProcessAsUser(hToken,lpCommandLine,'/winstart', nil, nil, False, .....)

Stephan 27. Nov 2007 13:15

Re: TExec.exec mit Parameter?
 
Hallo,

hat sich erledigt :) Einfach den vollständigen Pfad der .exe Datei + Parameter im dritten commandline Parameter verwenden. Das klappt dann :)


Alle Zeitangaben in WEZ +1. Es ist jetzt 05:32 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