Registriert seit: 22. Mär 2017
Ort: bei Flensburg
525 Beiträge
FreePascal / Lazarus
|
AW: Programm als bestimmter Nutzer starten
7. Dez 2018, 14:36
Eine kleine Ergänzung:
Bekomme ich aus der Funktion irgendwie folgende Informationen:
TStartupInfo
TProcessInformation
Delphi-Quellcode:
//Prozess als bestimmten Benutzer starten (Hilfsaufruf)
procedure TTools.startasSU(exe, param : string);
var
User : WideString;
PW : WideString;
err : DWORD;
begin
User := 'yyy';
PW := 'xxx';
err := CreateProcessAsLogon(User, PW, exe, param, '');
if err <> 0 then
ShowMessage(SysErrorMessage(err));
CreateProcess(
end;
Ich möchte das gestartete Programm an anderer Stelle ggf. beenden, daher bräuchte ich die Informationen, außer ihr habt eine bessere Idee.
Aktuell würde ich dies über folgende Lösung machen:
Starten:
Delphi-Quellcode:
var
SI: TStartupInfo;
PI: TProcessInformation;
begin
FillChar(SI, SizeOf(TStartupInfo), 0);
SI.cb := SizeOf(TStartupInfo);
if CreateProcess(nil, 'NOTEPAD.EXE', nil, nil, False, 0, nil, nil, SI, PI) then
begin
AppPID := PI.dwProcessId;
CloseHandle(PI.hProcess);
CloseHandle(PI.hThread);
end;
Beenden:
Delphi-Quellcode:
function EnumWindowsProc(hWnd: HWND; lParam: LPARAM): BOOL; stdcall;
begin
TList(lParam).Add(Pointer(hWnd));
Result := True;
end;
procedure Wait(MilliSeconds: DWORD);
var
Stop: DWORD;
begin
Stop := GetTickCount + MilliSeconds;
while Stop > GetTickCount do
begin
Sleep(100);
Application.ProcessMessages;
end;
end;
var
List: TList;
I: Integer;
ProcessId: DWORD;
ThreadId: DWORD;
ProcessHandle: THandle;
ExitCode: DWORD;
begin
if AppPID <> 0 then
begin
List := TList.Create;
try
EnumWindows(@EnumWindowsProc, LPARAM(List));
for I := 0 to List.Count - 1 do
begin
ThreadId := GetWindowThreadProcessId(HWND(List.Items[I]), ProcessId);
if ProcessId = AppPID then
begin
SendMessageTimeout(HWND(List.Items[I]), WM_SYSCOMMAND, SC_CLOSE, 0, SMTO_ABORTIFHUNG, 500, DWORD(nil^));
Wait(3000);
if IsWindow(HWND(List.Items[I])) then
begin
PostThreadMessage(ThreadId, WM_QUIT, 0, 0);
Wait(3000);
ProcessHandle := OpenProcess(PROCESS_ALL_ACCESS, False, ProcessId);
if ProcessHandle <> 0 then
begin
GetExitCodeProcess(ProcessHandle, ExitCode);
TerminateProcess(ProcessHandle, ExitCode);
CloseHandle(ProcessHandle);
end;
end;
Break;
end;
end;
finally
List.Free;
end;
end;
Code von Sprint
Der Weg ist das Ziel aber man sollte auf dem Weg niemals das Ziel aus den Augen verlieren.
Geändert von Moombas ( 7. Dez 2018 um 14:38 Uhr)
|
|
Zitat
|