AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Programm als bestimmter Nutzer starten

Ein Thema von Moombas · begonnen am 2. Okt 2018 · letzter Beitrag vom 10. Dez 2018
Antwort Antwort
Seite 2 von 3     12 3      
Schokohase
(Gast)

n/a Beiträge
 
#11

AW: Programm als bestimmter Nutzer starten

  Alt 3. Okt 2018, 02:08
Warum sollte da etwas kaputt gehen?

Unicode-Delphi (alles ab Delphi 2009):

string ist ein Alias für UnicodeString .
PChar ist ein Alias für PWideChar .

ANSI-Delphi (alles vor Delphi 2009):

string ist ein Alias für AnsiString .
PChar ist ein Alias für PAnsiChar .
  Mit Zitat antworten Zitat
Benutzerbild von KodeZwerg
KodeZwerg

Registriert seit: 1. Feb 2018
3.691 Beiträge
 
Delphi 11 Alexandria
 
#12

AW: Programm als bestimmter Nutzer starten

  Alt 3. Okt 2018, 02:37
Danke Euch Drei, nun ists angekommen. Super Erklärung, das hilft sehr!
Gruß vom KodeZwerg
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#13

AW: Programm als bestimmter Nutzer starten

  Alt 3. Okt 2018, 03:50
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.
$2B or not $2B
  Mit Zitat antworten Zitat
Benutzerbild von Moombas
Moombas

Registriert seit: 22. Mär 2017
Ort: bei Flensburg
525 Beiträge
 
FreePascal / Lazarus
 
#14

AW: Programm als bestimmter Nutzer starten

  Alt 4. Okt 2018, 13:51
Ich war blind = Ich habe die Übergabe des Arbeitsverzeichnisses an die falsche Stelle übergeben -.-
Der Weg ist das Ziel aber man sollte auf dem Weg niemals das Ziel aus den Augen verlieren.
  Mit Zitat antworten Zitat
Benutzerbild von Moombas
Moombas

Registriert seit: 22. Mär 2017
Ort: bei Flensburg
525 Beiträge
 
FreePascal / Lazarus
 
#15

AW: Programm als bestimmter Nutzer starten

  Alt 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)
  Mit Zitat antworten Zitat
DieDolly

Registriert seit: 22. Jun 2018
2.175 Beiträge
 
#16

AW: Programm als bestimmter Nutzer starten

  Alt 7. Dez 2018, 15:06
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 TTools.startasSU() .
  Mit Zitat antworten Zitat
Schokohase
(Gast)

n/a Beiträge
 
#17

AW: Programm als bestimmter Nutzer starten

  Alt 7. Dez 2018, 15:11
@DieDolly

Warum zwanghaft ein Record?

Eine Klasse kann auch eine 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.
  Mit Zitat antworten Zitat
HolgerX

Registriert seit: 10. Apr 2006
Ort: Leverkusen
972 Beiträge
 
Delphi 6 Professional
 
#18

AW: Programm als bestimmter Nutzer starten

  Alt 7. Dez 2018, 15:11
Hmm..

[OT]


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.... )
  Mit Zitat antworten Zitat
Benutzerbild von Moombas
Moombas

Registriert seit: 22. Mär 2017
Ort: bei Flensburg
525 Beiträge
 
FreePascal / Lazarus
 
#19

AW: Programm als bestimmter Nutzer starten

  Alt 7. Dez 2018, 16:23
Delphi-Quellcode:
type
  TTools = class(TForm)
Ggf. hätte ich es einfach wie HolgerX/Schokohase aufrufen können. Nun aber bitte BTT
Der Weg ist das Ziel aber man sollte auf dem Weg niemals das Ziel aus den Augen verlieren.
  Mit Zitat antworten Zitat
DieDolly

Registriert seit: 22. Jun 2018
2.175 Beiträge
 
#20

AW: Programm als bestimmter Nutzer starten

  Alt 7. Dez 2018, 17:08
Zitat:
Ne class geht doch auch
Muss man dann nicht eine Instanz davon erstellen? Mit einem Record fällt das jedenfalls weg.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 3     12 3      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 19:47 Uhr.
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