Einzelnen Beitrag anzeigen

xweghau

Registriert seit: 29. Dez 2008
Ort: Soest
11 Beiträge
 
Delphi 7 Professional
 
#5

Re: ?Shellexecute? aus Windows Dienst

  Alt 6. Jan 2009, 13:57
Hallo zusammen!

An Martin:
Ich denke, da hast Du Recht! Ich habe mir mal was zu dem Thema angesehen, aber dazu unten.

An Messie:
Dass ich hwnd = 0 angebe, ist kein Problem. Ich habe das mit notepad aus einer "normalen" Exe getestet, es funktioniert.

An Luckie:
Der Dienst wird auf dem gleichen Server eingesetzt, auf dem auch der Benutzer aktiv ist, in dessen Namen ich die EXE ausführen will.

Danke Euch dreien für die Tipps.

Wie schon an Martin geschrieben habe ich mir etwas zum Thema "CreateProcessAsUser" angesehen. Folgenden Quälcode verwende ich:
Delphi-Quellcode:
function TsvcArchivprgUeberwachung.StartPrg : Boolean;
var lpUsername: LPCWSTR;
    lpDomain: LPCWSTR;
    lpPassword: LPCWSTR;
    lpApplicationName: LPCWSTR;
    lpCommandLine: LPWSTR;
    lpEnvironment: LPVOID;
    sui: STARTUPINFOW;
    pi: PROCESS_INFORMATION;
    iRet: Integer;
begin
    Result := True;
    lpUsername := 'xweghau';
    lpPassword := 'triplex';//Keine Sorge, es ist nicht das echte Passwort
    lpApplicationName := 'notepad.exe';//'c:\programme\archiv\archiv.exe';
    lpCommandLine := nil;
    lpEnvironment := nil;
    lpDomain := nil;
    ZeroMemory(@sui, sizeof(sui));
    // Fill size member
    sui.cb := sizeof(sui);
    // Create process
    if (CreateProcessWithLogonW(
     lpUsername,
     lpDomain, // Domain
     lpPassword,
     LOGON_WITH_PROFILE, // No special options
     lpApplicationName, // Module to execute
     lpCommandLine, // Activates extensions
     CREATE_NEW_CONSOLE, // Only these options for now
     lpEnvironment,
     nil, // Use current directory
     sui, // STARTUPINFO
     pi // PROCESS_INFORMATION
     )) = False then begin
//Mailbenachrichtigung erzeugen (derzeit mit externem Programm)
      iRet := ShellExecute(0, 'open', PChar(ExtractFilePath(ParamStr(0)) + '\MailFromArchive.exe'), PChar('Das Programm konnte
nicht gestartet werden.
'), nil, SW_HIDE );
//Wenn die Mail nicht erzeugt wird ... Pech, was soll ich auch machen ...
      Result := False;
    end;
end;
Verwende ich meinen Code in einer normalen EXE, dann wird notepad aufgerufen, allerdings läuft die EXE Datei ja auch im gleichen Benutzerkontext.

Ich habe den Code zusammengestrichen, alles was nicht zum Thema gehört, habe ich entfernt (hoffentlich nicht zuviel). GetLastError() liefert mir den Wert 5 zurück. Leider weiß ich nicht, wo ich die Bedeutung erklärt finde. Könnt Ihr mir da helfen?

Gruß
Franz
  Mit Zitat antworten Zitat