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