![]() |
CreateProcess aus Dienst heraus
Hallo zusammen,
ich hab gerade das Problem, das mein CreateProcess aus meinem Dienst heraus nicht funzt. Was für Flags muss ich setzen damit das funktioniert? MfG :angel: |
Re: CreateProcess aus Dienst heraus
Wenn du uns jetzt noch sagst, was du unter "nicht funzen" verstehst...
|
Re: CreateProcess aus Dienst heraus
"nicht funtzen" = Cursor für ca. 1 Sek = crHourGlass und dann nichtsmehr => programm wird nicht ausgeführt.
Ich hab keine Ahnung wie ich die ganzen Flags in nem Dienst anders setzen muss als normalerweise. Also im Moment sieht das so aus:
Delphi-Quellcode:
ZeroMemory( @si, sizeof(si) );
si.lpDesktop:=PChar(deskName); si.cb := sizeof(si); ZeroMemory( @pi, sizeof(pi) ); cf:=CREATE_NEW; command:='E:\Programme\Asbion\Syncronaut\System\Syncronaut4.exe'; CreateProcess(Nil,PChar(command),nil,nil,False,cf,nil,nil,si,pi ); |
Re: CreateProcess aus Dienst heraus
Hi,
ich benutze erfolgreich diesen Code:
Delphi-Quellcode:
Bei einem Dienst ist außerdem wichtig, unter welchem Benutzernamen er läuft. Probier mal, das Häkchen bei Anmelden -> Lokales Systemkonto -> "Datenaustausch zwischen Dienst und Desktop zulassen" zu aktivieren oder stell dein aktives Konto ein bei Anmelden -> "Dieses Konto".
procedure StartApplicationAndWait(const FileName:string);
var sei:TShellExecuteInfoA; retval:integer; begin ZeroMemory(@sei, sizeof(sei)); with sei do begin cbSize:=sizeof(sei); fMask:=SEE_MASK_NOCLOSEPROCESS or SEE_MASK_FLAG_NO_UI; Wnd:=0; lpVerb:='open'; lpFile:=PAnsiChar(FileName); lpParameters:=nil; lpDirectory:=PAnsiChar(ExtractFileDir(FileName)); nShow:=SW_SHOW; // evtl anpassen... end; if ShellExecuteExA(@sei) then begin // Programm ist erfolgreich gestartet try retval:=WAIT_TIMEOUT; while (retval = WAIT_TIMEOUT) do begin retval:=WaitForSingleObject(sei.hProcess, 500); Application.ProcessMessages; end; finally CloseHandle(sei.hProcess); end; // Programm wurde beendet end else begin // Programm konnte nicht gestartet werden; anpassen an eigene Logmechanismen SysErrorMessage(GetLastError); end; cu |
Re: CreateProcess aus Dienst heraus
Ähm.. sorry hab vergessen zu erwähnen, da das programm nicht auf dem Standard desktop sondern auf nem eigenen Desktop angezeigt werden soll, da funzt ShellExecute glaub ich leider nicht...
Der Desktop hat den Namen "MyOwnDesktop". Bei CreateProcess kann ich den in STARTUPINFO angeben. |
Re: CreateProcess aus Dienst heraus
Also ich hab jetzt folgenden Code:
Delphi-Quellcode:
Aus einem "normalen" Programm heraus funktioniert das ohne Probleme, aus einem Dienst heraus passiert das was ich oben beschrieben habe. Völlig egal ob ich den Dienst als "LocalSystem" oder einem Benutzer ausführe.
if not LogonUser(
PChar('Username'), PChar('Workgroup'), PChar('password'), LOGON32_LOGON_INTERACTIVE, LOGON32_PROVIDER_DEFAULT, token) then Beep; ZeroMemory( @si, sizeof(si) ); si.lpDesktop:=PChar('MyOwnDesktop'); si.cb := sizeof(si); ZeroMemory( @pi, sizeof(pi) ); cf:=CREATE_NEW or CREATE_NEW_CONSOLE; command:='E:\Programme\Programm.exe'; try if not CreateProcessAsUser( token, nil, PChar(command), nil, nil, False, cf, nil, PChar(ExtractFilePath(command)), si, pi )then Beep; except Beep; end; Weis keiner was ich machen kann? |
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:49 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