Delphi-PRAXiS
Seite 2 von 3     12 3      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Programm als bestimmter Nutzer starten (https://www.delphipraxis.net/198079-programm-als-bestimmter-nutzer-starten.html)

Schokohase 3. Okt 2018 01:08

AW: Programm als bestimmter Nutzer starten
 
Warum sollte da etwas kaputt gehen?

Unicode-Delphi (alles ab Delphi 2009):

Delphi-Quellcode:
string
ist ein Alias für
Delphi-Quellcode:
UnicodeString
.
Delphi-Quellcode:
PChar
ist ein Alias für
Delphi-Quellcode:
PWideChar
.

ANSI-Delphi (alles vor Delphi 2009):

Delphi-Quellcode:
string
ist ein Alias für
Delphi-Quellcode:
AnsiString
.
Delphi-Quellcode:
PChar
ist ein Alias für
Delphi-Quellcode:
PAnsiChar
.

KodeZwerg 3. Okt 2018 01:37

AW: Programm als bestimmter Nutzer starten
 
Danke Euch Drei, nun ists angekommen. Super Erklärung, das hilft sehr!:thumb:

himitsu 3. Okt 2018 02:50

AW: Programm als bestimmter Nutzer starten
 
Zitat:

Zitat von himitsu (Beitrag 1414741)
String -> PChar -> WinApi
AnsiString -> PAnsiChar -> WinApiA
WideString/UnicodeString -> PWideChar -> WinApiW

Darum auch immer nur das Passende zusammen verwenden.
Ansonsten muß der String ANSI-Unicode entsprechend gecastet werden.

Beispiel:
String (AnsiString) mit PAnsiChar ging in Delphi vor 2009,
aber aber 2009 passt String (UnicodeString) und PAnsiChar nicht mehr.

Hätte man früher aber die "richtigen" Typen zusammen verwendet, dann würde es mit Umstellung auf Unicode keine Probleme geben.

Moombas 4. Okt 2018 12:51

AW: Programm als bestimmter Nutzer starten
 
Ich war blind = Ich habe die Übergabe des Arbeitsverzeichnisses an die falsche Stelle übergeben -.-

Moombas 7. Dez 2018 13:36

AW: Programm als bestimmter Nutzer starten
 
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

DieDolly 7. Dez 2018 14:06

AW: Programm als bestimmter Nutzer starten
 
Ich antworte nicht auf dein Problem aber auf etwas anderes.

Zitat:

procedure TTools.startasSU(exe, param : string);
Mich würde zu sehr interessieren, wie du TTools implementiert hast. Ich sehe, dass du die Starter verwendest. Du arbeitest also vermutlich nicht in einer großen Firma oder so.
Wenn TTools bei dir eine Klasse ist von der du eine Instanz erstellen musst empfehle ich dir, das zu einem Record umzuschreiben. Etwa so

Delphi-Quellcode:
type
 TTools = record
 public
  class procedure startasSU(exe, param : string); static;
 end;

implementation

class procedure TTools.startasSU(exe, param : string);
begin

end;
Aufruf dann überall über
Delphi-Quellcode:
TTools.startasSU()
.

Schokohase 7. Dez 2018 14:11

AW: Programm als bestimmter Nutzer starten
 
@DieDolly

Warum zwanghaft ein Record?

Eine Klasse kann auch eine
Delphi-Quellcode:
class procedure
haben und der Aufruf ist gleich.

Es gibt allerdings einen Vorteil: Man kann eine Klasse vererben und dadurch eben erweitern. Bei einem Record geht das nicht.

HolgerX 7. Dez 2018 14:11

AW: Programm als bestimmter Nutzer starten
 
Hmm..

[OT]

Zitat:

Zitat von DieDolly (Beitrag 1420311)

Delphi-Quellcode:
type
 TTools = record
 public
  class procedure startasSU(exe, param : string); static;
 end;

implementation

class procedure TTools.startasSU(exe, param : string);
begin

end;

Wieso nen Record ?

Delphi-Quellcode:
//oder
 TTools = class
 public
  class procedure startasSU(exe, param : string); static;
 end;
Ne class geht doch auch ;)

[OT]

(Mist zu langsam.... ;) )

Moombas 7. Dez 2018 15:23

AW: Programm als bestimmter Nutzer starten
 
Delphi-Quellcode:
type
  TTools = class(TForm)
Ggf. hätte ich es einfach wie HolgerX/Schokohase aufrufen können. Nun aber bitte BTT ;)

DieDolly 7. Dez 2018 16:08

AW: Programm als bestimmter Nutzer starten
 
Zitat:

Ne class geht doch auch
Muss man dann nicht eine Instanz davon erstellen? Mit einem Record fällt das jedenfalls weg.


Alle Zeitangaben in WEZ +1. Es ist jetzt 21:45 Uhr.
Seite 2 von 3     12 3      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz