![]() |
Prüfen ob Programm mit "runas" gestartet worden ist.
Hallo,
![]() Nun möchte ich in einem Programm umgekehrt feststellen ob es so gestartet wurde. Dazu habe ich schon einiges gegoogelt und auch einges gefunden ( ![]() ![]() ![]() ![]() ![]() 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. |
AW: Prüfen ob Programm mit "runas" gestartet worden ist.
Zitat:
Du meinst sicherlich ob ein Programm mit Adminrechten gestartet wurde. |
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. |
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:
In WM_MYRUNASCHECK (wParam) kannst du dann prüfen ob WPARAM(True) oder WPARAM(False) geschickt wurde.
const
WM_MYRUNASCHECK = WM_User + 10; SendMessage(Programm2.Handle, WM_MYRUNASCHECK, WPARAM(True), 0); WM_MYRUNASCHECK muss dann aber in beiden Programmen definiert sein. Das eine schickt den Status das andere wertet ihn über wParam aus. |
AW: Prüfen ob Programm mit "runas" gestartet worden ist.
Ich habe wohl Schwierigkeiten mich verständlich auszudrücken. :(
Zitat:
Ich hätte gerne
Delphi-Quellcode:
und diese soll False liefern wenn das Programm normal gestartet wurde und True wenn mit "runas".
function IsStartedWithRunas():Boolean;
begin ... end; |
AW: Prüfen ob Programm mit "runas" gestartet worden ist.
Zitat:
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! |
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 |
AW: Prüfen ob Programm mit "runas" gestartet worden ist.
Zitat:
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; |
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. |
AW: Prüfen ob Programm mit "runas" gestartet worden ist.
Zitat:
Sagte ich ihm schon. |
AW: Prüfen ob Programm mit "runas" gestartet worden ist.
Zitat:
Falls du das doch irgendwo so vorgeschlagen hast, dann Asche auf mein Haupt und ich gehe meine Brille putzen. 8-) |
AW: Prüfen ob Programm mit "runas" gestartet worden ist.
Zitat:
Asche auf mein Haupt ;) |
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. |
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:
|
AW: Prüfen ob Programm mit "runas" gestartet worden ist.
Zitat:
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:
|
AW: Prüfen ob Programm mit "runas" gestartet worden ist.
Zitat:
Und das aufgerufene Programm kann dann prüfen, ob es mit RunAs aufgerufen wurde und die entsprechenden Rechte hat.
Delphi-Quellcode:
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.
function IsStartedWithRunas():Boolean;
begin Result := ParamStr(1) = 'runas'; end; '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 ;-) |
AW: Prüfen ob Programm mit "runas" gestartet worden ist.
Zitat:
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