Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Prüfen ob Programm mit "runas" gestartet worden ist. (https://www.delphipraxis.net/206114-pruefen-ob-programm-mit-runas-gestartet-worden-ist.html)

freimatz 20. Nov 2020 07:56


Prüfen ob Programm mit "runas" gestartet worden ist.
 
Hallo,

hier habe ich gefragt wie man ein Programm als Administrator startet. Die Lösung war dann der Start mit dem Verb "runas".

Nun möchte ich in einem Programm umgekehrt feststellen ob es so gestartet wurde. Dazu habe ich schon einiges gegoogelt und auch einges gefunden (1, 2, 3, 4, 5).
Gerade im letzteren hat himitsu darauf hingewiesen, dass man in der Regel eher wissen will ob man Rechte hat die man haben will.
In meinem Fall habe ich den Eindruck, dass es nicht das ist was ich will. Ich möchte "nur" feststellen ob das Programm mit "runas" gestartet wurde. Das soll nur für ein Logging sein um festzustellen ob der von mir geplante Ablauf so klappt. (Was er nach einem ersten Test bei mir tut, jedoch bei einem Tester nicht.)

Ich könnte nun schon einige Lösungen ausprobieren und schauen ob die das tun was ich will. Allerdings bin ich mir dann nicht sicher ob das auch zuverlässig ist. Vielleicht hat hier schon eine definitive Meinung dazu.

venice2 20. Nov 2020 08:09

AW: Prüfen ob Programm mit "runas" gestartet worden ist.
 
Zitat:

Die Lösung war dann der Start mit dem Verb "runas".
Gar nicht. Wie denn auch? runas ist ein Parameter wie willst du also feststellen ob dieser in einem anderen Programm Verwendung findet?
Du meinst sicherlich ob ein Programm mit Adminrechten gestartet wurde.

freimatz 20. Nov 2020 08:17

AW: Prüfen ob Programm mit "runas" gestartet worden ist.
 
Ich habe Programm A, das ist von mir geschrieben.
Das soll Programm B, auch von mir geschrieben, mit "runas" aufrufen.
In beide Programm möchte ich ein Logging einbauen, wo ich später nachschauen kann ob das auch so war.

Ich gehe schon davon aus, dass eine Prüfung explizit auf "runas" nicht möglich ist. Aber auf das was bei "runas" passiert schon. Wenn das mit einer Prüfung "ob ein Programm mit Adminrechten gestartet wurde" geht soll das mir recht sein.

venice2 20. Nov 2020 08:21

AW: Prüfen ob Programm mit "runas" gestartet worden ist.
 
Du könntest eine SendMessage an das zweite Programm schicken.
Dieses liefert dir dann den status zurück ob es mit "runas" gestartet wurde oder nicht.

Das geht dann aber nur zwischen diesen beiden Programmen.

Delphi-Quellcode:
const
  WM_MYRUNASCHECK = WM_User + 10;

SendMessage(Programm2.Handle, WM_MYRUNASCHECK, WPARAM(True), 0);
In WM_MYRUNASCHECK (wParam) kannst du dann prüfen ob WPARAM(True) oder WPARAM(False) geschickt wurde.

WM_MYRUNASCHECK muss dann aber in beiden Programmen definiert sein.
Das eine schickt den Status das andere wertet ihn über wParam aus.

freimatz 20. Nov 2020 09:14

AW: Prüfen ob Programm mit "runas" gestartet worden ist.
 
Ich habe wohl Schwierigkeiten mich verständlich auszudrücken. :(
Zitat:

Zitat von venice2 (Beitrag 1477596)
... den status zurück ob es mit "runas" gestartet wurde oder nicht.

Das ist mein Problem. Die Programme können jeweils selbst in ein Log schreiben.

Ich hätte gerne
Delphi-Quellcode:
function IsStartedWithRunas():Boolean;
begin
  ...
end;
und diese soll False liefern wenn das Programm normal gestartet wurde und True wenn mit "runas".

jaenicke 20. Nov 2020 09:22

AW: Prüfen ob Programm mit "runas" gestartet worden ist.
 
Zitat:

Zitat von freimatz (Beitrag 1477605)
Ich habe wohl Schwierigkeiten mich verständlich auszudrücken. :(

Nein, du glaubst nur den Antworten nicht.

Es ist aber so: Diese Information gibt es nicht. Es gibt nur die Information, ob das Programm bestimmte Rechte und Parameter besitzt. Wie die Funktion zum Starten aufgerufen wurde, wird nirgends gespeichert.

Du kannst natürlich einen speziellen Parameter übergeben und auf den prüfen (ParamStr). Aber das heißt noch lange nicht, dass die Rechte, die du brauchst, vorhanden sind. Auch runas ist dafür keine Garantie!

Klaus01 20. Nov 2020 09:26

AW: Prüfen ob Programm mit "runas" gestartet worden ist.
 
Prgramm A legt wenn es Programm B mit runas startet im temp Verzeichnis eine Datei an.
Porgamm B schaut nach ob die Datei vorhanden ist - ist sie da
a) wird die Datei gelöscht und
b) weiß Programm B das es mit runas gestartet wurde.

Grüße
Klaus

venice2 20. Nov 2020 09:31

AW: Prüfen ob Programm mit "runas" gestartet worden ist.
 
Zitat:

Zitat von freimatz (Beitrag 1477605)
Ich habe wohl Schwierigkeiten mich verständlich auszudrücken. :(
Zitat:

Zitat von venice2 (Beitrag 1477596)
... den status zurück ob es mit "runas" gestartet wurde oder nicht.

Das ist mein Problem. Die Programme können jeweils selbst in ein Log schreiben.

Ich hätte gerne
Delphi-Quellcode:
...
function IsStartedWithRunas():Boolean;
begin
  ...
end;
und diese soll False liefern wenn das Programm normal gestartet wurde und True wenn mit "runas".

Nochmal!
Das geht nur wenn du den Status aus Anwendung A selbst nach Anwendung B schickst auf welche art auch immer.
Beispiel habe ich genannt.

Verwende die WinProc und oder einen MessageHandler um die Message in Anwendung B zu empfangen.
Und schicke sie aus Anwendung A abhängig davon ob runAs verwendet wird oder nicht.

Delphi-Quellcode:
type
 TForm1 = class(TForm)
  private
    ...
  protected
    procedure ProcMessage(var Msg: TMessage);
  public
   ...
  end;

const
  WM_MYRUNASCHECK = WM_User + 10;

//create..
  FMessageHandle := Classes.AllocateHWnd(ProcMessage)
//destroy..
  if FMessageHandle <> 0 then
    Classes.DeallocateHWnd(FMessageHandle);

procedure TForm1.ProcMessage(var Msg: TMessage);
begin

  if Msg.Msg = WM_MYRUNASCHECK then
  begin
    // schreibe dein Log (Msg.WParam = True oder False)
  end
  else
    Msg.result := DefWindowProc(FMessageHandle, Msg.Msg, Msg.wParam, Msg.LParam);
end;

Jasocul 20. Nov 2020 09:32

AW: Prüfen ob Programm mit "runas" gestartet worden ist.
 
Beide Programme sind von dir, also kannst du die selbst anpassen.

Übergib beim runas doch einfach einen Parameter an das aufzurufende Programm. Diesen Parameter kannst du prüfen und weißt dann, ob es mit runas gestartet wurde.

venice2 20. Nov 2020 09:35

AW: Prüfen ob Programm mit "runas" gestartet worden ist.
 
Zitat:

Zitat von Jasocul (Beitrag 1477609)
Beide Programme sind von dir, also kannst du die selbst anpassen.

Übergib beim runas doch einfach einen Parameter an das aufzurufende Programm. Diesen Parameter kannst du prüfen und weißt dann, ob es mit runas gestartet wurde.

Danke ;)
Sagte ich ihm schon.

Jasocul 20. Nov 2020 09:39

AW: Prüfen ob Programm mit "runas" gestartet worden ist.
 
Zitat:

Zitat von venice2 (Beitrag 1477610)
Zitat:

Zitat von Jasocul (Beitrag 1477609)
Beide Programme sind von dir, also kannst du die selbst anpassen.

Übergib beim runas doch einfach einen Parameter an das aufzurufende Programm. Diesen Parameter kannst du prüfen und weißt dann, ob es mit runas gestartet wurde.

Danke ;)
Sagte ich ihm schon.

Ich finde das nicht. In deinen Beispielen schickst du Messages. Bei meinem Vorschlag wird beim Aufruf schon ein Parameter übergeben, der im Programm geprüft werden kann.
Falls du das doch irgendwo so vorgeschlagen hast, dann Asche auf mein Haupt und ich gehe meine Brille putzen. 8-)

venice2 20. Nov 2020 09:45

AW: Prüfen ob Programm mit "runas" gestartet worden ist.
 
Zitat:

Bei meinem Vorschlag wird beim Aufruf schon ein Parameter übergeben
Da muss ich mich jetzt nicht drum streiten habe ihm eine Lösung aufgezeigt was oder wie er es nun umsetzt kann mir egal sein.
Asche auf mein Haupt ;)

himitsu 20. Nov 2020 11:08

AW: Prüfen ob Programm mit "runas" gestartet worden ist.
 
Man kann sich auch bei den tausenden "IsAdmin"-Funktionen was raussuchen, die man überall findet.

Aber wichtig: Nicht auf den Namen/Konto "Administrator" prüfen, sondern auf die Rechte.

"Ist Administrator" kann ja Vieles bedeuten:
* Benutzer ist der, mit dem Namen "Administrator", bzw. er hat die SID des StandardAdmins vom Windows.
* Benutzer ist in der Gruppe der Administratoren
* Benutzer hat eines der Rechte, welches Administratoren so im Allgemeinen haben

Bzw. du kannst/solltest auch gezielt die Berechtigung/Funktion prüfen, für Welche du unbedingt "Admin" brauchst.
Nicht jeder "Admin" darf alles. Wir haben hier z.B. einen ServiceAdmin, der darf nur Dienste starten und beenden. Und wenn man einen Dienst beenden will, dann reicht es auch zu, wenn man "nur" genau dieses Recht besitzt.

jaenicke 20. Nov 2020 11:09

AW: Prüfen ob Programm mit "runas" gestartet worden ist.
 
Trotzdem ist wichtig auch zu beachten, was ich oben zur Lösung mit einem Parameter geschrieben habe:
Zitat:

Zitat von jaenicke (Beitrag 1477606)
Du kannst natürlich einen speziellen Parameter übergeben und auf den prüfen (ParamStr). Aber das heißt noch lange nicht, dass die Rechte, die du brauchst, vorhanden sind. Auch runas ist dafür keine Garantie!

Das gilt natürlich für die anderen genannten Lösungen genauso (nur dass Messages oder temporäre Dateien unnötiger Mehraufwand sind, weil sie keinen Vorteil gegenüber einem Parameter haben).

venice2 20. Nov 2020 11:16

AW: Prüfen ob Programm mit "runas" gestartet worden ist.
 
Zitat:

Du kannst natürlich einen speziellen Parameter übergeben
Wann?
Mit shellexecute?

Zeig ihm doch ein Beispiel.

Und ich behaupte! Ob ich nun einen Parameter oder einen Message schicke ist gehüpft wie gesprungen.
Es muss nur in der 2 Anwendung ankommen.

Zitat:

weil sie keinen Vorteil gegenüber einem Parameter haben
Und ein Parameter keinen vorteil gegenüber SendMessage

Delphi.Narium 20. Nov 2020 11:22

AW: Prüfen ob Programm mit "runas" gestartet worden ist.
 
Zitat:

Zitat von jaenicke (Beitrag 1477622)
Trotzdem ist wichtig auch zu beachten, was ich oben zur Lösung mit einem Parameter geschrieben habe:
Zitat:

Zitat von jaenicke (Beitrag 1477606)
Du kannst natürlich einen speziellen Parameter übergeben und auf den prüfen (ParamStr). Aber das heißt noch lange nicht, dass die Rechte, die du brauchst, vorhanden sind. Auch runas ist dafür keine Garantie!

Das gilt natürlich für die anderen genannten Lösungen genauso (nur dass Messages oder temporäre Dateien unnötiger Mehraufwand sind, weil sie keinen Vorteil gegenüber einem Parameter haben).

Die Methode hat aber den Charme, dass man über den Parameter gesagt bekommt: Ich habe Dich mit RunAs aufgerüfen, Du müsstest jetzt Adminrechte haben.
Und das aufgerufene Programm kann dann prüfen, ob es mit RunAs aufgerufen wurde und die entsprechenden Rechte hat.
Delphi-Quellcode:
function IsStartedWithRunas():Boolean;
begin
  Result := ParamStr(1) = 'runas';
end;
Liefert diese Funktion true und man hat trotzdem keine Adminrechte, scheint was mit dem Aufruf nicht zu funktionieren. Für eine Protokollierung sollte das ausreichen und darum scheint es hier ja zu gehen.

'nen Parameter bekommt man auf der Kommandozeile mit und hat ihn garantiert in ParamStr. Bei 'ner Message kann man sich dusselg anstellen und sie nicht mitbekommen ;-)

jaenicke 20. Nov 2020 12:31

AW: Prüfen ob Programm mit "runas" gestartet worden ist.
 
Zitat:

Zitat von venice2 (Beitrag 1477626)
Zitat:

weil sie keinen Vorteil gegenüber einem Parameter haben
Und ein Parameter keinen vorteil gegenüber SendMessage

Haben Parameter z.B. auch bei einer Kommandozeilenanwendung keinen Vorteil? :wink:

Um eine Nachricht zu senden musst du ein passendes Handle ermitteln und diese Nachricht dort dann auch empfangen und verarbeiten. Und die Nachricht darf nicht geschickt werden bevor das zweite Programm sie empfangen kann usw.
Einen Parameter kannst du mit einer Zeile abfragen und kannst ihn einfach mitgeben, das sind nur eine geänderte und eine neue Zeile Code und es funktioniert unabhängig von den sonstigen Gegebenheiten...


Alle Zeitangaben in WEZ +1. Es ist jetzt 13:34 Uhr.

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