![]() |
RunAs Dialog vor dem Programmstart???
Moin,
Ich habe ein Programm, welches die Systemprogramme von Windiws als Sammlung enthält. In unserer Firma sollen nun der Helpdesk dieses Programm mit Adminrechten auf dem jeweiligen UserPC benutzen Dazu würde ich gerne den RUNAS Dialog verwenden. Frage: Ist es möglich ein Programm zu entwickeln, dass: 1. RUNAS DIALOG aufruft, 2. das gleiche Programm mit dem RUNAS Benutzer startet? --> Es soll nur ein Programm sein Vielen Dank im Voraus. |
Re: RunAs Dialog vor dem Programmstart???
Moin Daywalker,
das sollte grundsätzlich gehen. Du müsstest halt prüfen, ob schon eine Instanz des Programms läuft, ist nicht der Fall startet es das Programm noch einmal (der Pfad ist in paramstr(0)), und beendet sich selber. Läuft schon eine Instanz, ist beim Start nichts mehr zu tun. Diese Prüfung sollte dann in der DPR stattfinden. Einige grundsätzliche Beispiele für das Auffinden laufender Instanzen eines Programmes solltest Du hier mit ![]() ![]() |
Re: RunAs Dialog vor dem Programmstart???
Ich ahbe jetzt das Forum durchwühlt und bin völlig verwirrt.
Kannst du mir mal kurz theoretisch den Aufruf erklären? Mein Verständnis. 1. Programm startet und checkt ob es schon existiert - Frage: wie kann ich ein Programm ein 2.Mal starten ohne etwas zu tun? 2. Wenn es existiert - Aufruf des RUNAS Dialoges mit anschließendem erneuten Aufruf des Programmes mit Schließung des 1.Programmes Richtig? Wenn das so ist, habe ich ein Problem, da ich mich noch nicht damit auseinander gesetzt habe. Kennt da einer gute Tutorials? |
Re: RunAs Dialog vor dem Programmstart???
falls du auf den runas dialog verzichten kannst und einen eigenen dialog erstellen kannst, dann mach folgendes:
1. beim programmstart die rechte prüfen. falls rechte nicht ausreichend, wird der eigene dialog geöffnet. 2. benutzername und passwort vom dialog verwendest du um ![]() 3. wenn 0 zurückgeliefert wird, hats geklappt und du beendest die aktuelle instanz, da das programm dann ein zweites mal mit den erweiterten rechten gestartet wurde. |
Re: RunAs Dialog vor dem Programmstart???
Hi,
vielleicht verstehe ich etwas nicht aber... ...normalerweise rechte Maustaste auf das Programm und RunAs auswählen(Englische Version) ...versucht man ein Programm zu installieren und man besitzt keine Rechte öffnet sich der RunAs Dialog automatisch. Zumindest in unserer Fa. Server 2003 Workstations WinXP Prof. Uwe |
Re: RunAs Dialog vor dem Programmstart???
Oder Dein Prog macht selbst eine Abfrage á la
Benutzername: Passwort: und versucht sich dann die Berechtigungen zu holen:
Delphi-Quellcode:
var
AdminToken : Cardinal; if LogonUser(PAnsiChar(USERNAME), // UserName PAnsiChar(DOMAIN), // Domäne oder lokaler Rechner PAnsiChar(PASSWORD), // Password LOGON32_LOGON_BATCH or LOGON32_LOGON_NETWORK or LOGON32_LOGON_INTERACTIVE, LOGON32_PROVIDER_DEFAULT, AdminToken) then begin if ImpersonateLoggedOnUser(AdminToken) then begin // hier kommt Dein Prog.-Code hin RevertToSelf; // zurückschalten zum angemeldeten Benutzer end; end; |
Re: RunAs Dialog vor dem Programmstart???
Zitat:
Es reicht nämlich, unter HKLM\Software\Microsoft\Windows\CurrentVersion\App Paths das eigene Programm mit zwei Werten zu registrieren. Ich habe dort die beiden o.g. Dateinamen gefunden, es mit einem eigenen Programm getestet, und es funktioniert wunderbar. Kleine REG-Datei zum Testen:
Code:
"Dateiname.exe" ist natürlich durch den gewünschten Dateinamen des eigenen Programmes zu ersetzen. :stupid:
Windows Registry Editor Version 5.00
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\Dateiname.exe] "RunAsOnNonAdminInstall"=dword:00000001 "BlockOnTSNonInstallMode"=dword:00000001 PS: Ich denke, der Wert "RunAsOnNonAdminInstall" dürfte ausreichen (= Ausführen als, bei Nicht-Admin-Installation). Der zweite "BlockOnTSNonInstallMode" bezieht sich, wenn ich raten soll, wohl auf Terminal Server. Was er aber genau bedeutet, weiß ich nicht. :oops: |
Re: RunAs Dialog vor dem Programmstart???
Danke für die zahlreichen Antworten. Wie ich das sehe verzichte ich wohl auf den RUNAS Dialog von Windows, obwohl es gut wäre, denn man bezieht sich gleich auf die vorhanden Users im Active Directory.
@kalmi01: Dein Programmcode kommt doch in die *.dpr datei oder wie integriere ich dein Codebeispiel? Gibt es irgendwo ein Tutorial in dem man sieht, wie ein gestartetes Programm sich erneut aufruft und die das zu erst geöffnete Programm schließt? Danke. |
Re: RunAs Dialog vor dem Programmstart???
Hi,
der Code kommt in Deine Main-Unit (z.B. Unit1.pas). Der Code ruft Dein Prog nicht noch einmal auf, sonder verleiht dem laufenden Prog die gewünschten Benutzerrechte, so als hättest Du es mit RunAs gestartet. |
Re: RunAs Dialog vor dem Programmstart???
ich würde das ganze einfach über parameter machen.
Delphi-Quellcode:
mein Problem wäre dabei jedoch das ich nicht weiß wie man den Dialog "Ausführen als" per Api öffnet.
var LStartedWithRunAs: Boolean;
LCount : Integer; begin LStartedWithRunAs := False; LCount := 1; while (LCount <= ParamCount) and not(LStartedWithRunAs) do begin LStartedWithRunAs := ParamStr(LCount) = 'StartedWithRunAs'; inc(LCount); end; if not(LStartedWithRunAs) then begin //Starten als Dialog hoch bringen [...] end; end; |
Re: RunAs Dialog vor dem Programmstart???
So ich habe jetzt ein einfaches Programm geschrieben wollte es mal probieren wie ihr es gesagt habt. Irgendwie verstehe ich das immer noch wie ich den Syntax setzen muss bzw. soll.
Kann mir mal einer ein komplettes beispiel geben? |
Re: RunAs Dialog vor dem Programmstart???
Zitat:
ich kenne das wirklich nur so, dass man ein programm mit den richtigen rechten starten kann, nicht aber dessen rechte zur laufzeit ändern kann. |
Re: RunAs Dialog vor dem Programmstart???
Moin, moin, CodeX,
Ich habe mehrere Programme bei über 300 Usern laufen, die sich auf diese Weise die notwendigen Berechtigungen holen. Bis dato gab es nur seeeehr selten Probs und wenn, dann hatte der DC ein Prob, soll heissen: auch RunAs lief dann nicht zuverlässig. Policies können einem IMMER die Suppe versalzen. Sicher funktioniert es ab XP/Server2003; bei NT-Maschinen gibt es manchmal Probs (Service-Pack), bei 2000 kann ich keine repräsentative Aussage machen, da nur eine handvoll PC damit liefen (aber ebenfalls OK). Vorteil ist, dass sich das Prog mit
Delphi-Quellcode:
nur genau dann User-Rechte holt, wenn diese benötigt werden.
ImpersonateLoggedOnUser(AdminToken)
Ausserdem kann man in einem Prog mehrfach die User-Rechte wechseln ! Was m it RunAs nicht geht. |
Re: RunAs Dialog vor dem Programmstart???
sehr gut zu wissen. danke.
aber dann nochmal zum verständnig: die benutzerrechte werden beim aufruf von LogonUser auf dem gesamten rechner geändern und nicht nur das programm betreffend, oder? mit RevertToSelf kehrt man ja dann erst zu den normalen rechten zurück. das würde ja dann bedeuten, dass wenn man beim starten des programmes LogonUser aufruft und beim beenden erst RevertToSelf, dass dann während der gesamten programmlaufdauer, der benutzer als admin angemeldet ist. das betrifft ja dann auch andere programme. somit müsste man statt dessen die programmfunktionen mit diesen funktionen umschließen, die adminrechte voraussetzen. das würde aber unter umständen doch dann zu ständigen benutzerwechseln führen. dann kann doch nicht gut sein. :? oder irre ich mich jetzt gewaltig und die benutzerwechel betreffen nur das eigene programm? (was ich mir technisch nicht vorstellen könnte) |
Re: RunAs Dialog vor dem Programmstart???
Zitat:
NUR das Programm selbst erhält die neuen Benutzerrechte. Zitat:
Kannst aber halt als verschiedene Benutzer innerhalb einer Session agieren. |
Re: RunAs Dialog vor dem Programmstart???
ich hab mal ein bisschen geforscht.
jetzt lass mich raten: du arbeitest dabei mit services, richtig? denn ich habe folgendes gefunden: Zitat:
|
Re: RunAs Dialog vor dem Programmstart???
Sagt mal, Jungs und Mädchen, wäre das nicht ein gutes Thema für eine kleine Delphi PRAXiS-DLL? Diese DLL könnte ihrerseits die hier gezeigten Funktionen kapseln, so dass man sie mit wenig Aufwand in eigene Programme einbinden kann.
Die Hauptfunktionen der DLL könnten dabei statisch in die eigenen Programme gelinkt werden, so dass die Anwendung ohne die DLL gar nicht startet. Im Gegensatz dazu sollten die benutzten API-Funktionen in der DLL natürlich dynamisch geladen werden, so dass bspw. ein Aufruf unter 9x/ME immer mit true (oder was weiß ich) beantwortet wird. Dazu vielleicht ein paar Typen und/oder Klassen bzw. Auflistungen, damit man nicht mit dem API-Zeug hantieren muss. Klappt das Erlangen der gewünschten Rechte nicht, könnte man sicher das API für sich arbeiten und die entsprechende Fehlermeldung direkt aus dem System ausgeben lassen (Stichwort: ![]() Und wer schlicht und einfach nur den "Ausführen als"-Dialog braucht, für den könnte man ja eine Dialogressource (nonVCL) integrieren, die dem Original nachempfunden ist, und mit der man das Konto auswählen und das Passwort eingeben kann. Selbstverständlich sollte sich der Anwender nicht mit der Nachrichtenschleife unter nonVCL herumschlagen müssen. Für ihn sollte ein simpler Aufruf à la
Delphi-Quellcode:
genügen.
if RunAsDialog(...) then
begin end; @Codex: Hast du da nicht ein Zitat vergessen: Zitat:
|
Re: RunAs Dialog vor dem Programmstart???
Zitat:
Delphi-Quellcode:
also ich würd ja sagen, daß der Code eh schon recht simpel/kurz/unaufwändig ist. Quasi nur eine if abfrage (mit einer if abfrage) und schon kannste deinen code reinschmeißen.
var
AdminToken : Cardinal; if LogonUser(PAnsiChar(USERNAME), // UserName PAnsiChar(DOMAIN), // Domäne oder lokaler Rechner PAnsiChar(PASSWORD), // Password LOGON32_LOGON_BATCH or LOGON32_LOGON_NETWORK or LOGON32_LOGON_INTERACTIVE, LOGON32_PROVIDER_DEFAULT, AdminToken) then begin if ImpersonateLoggedOnUser(AdminToken) then begin // hier kommt Dein Prog.-Code hin RevertToSelf; // zurückschalten zum angemeldeten Benutzer end; end; Hätt ich dden Code nur eher gekannt .. |
Re: RunAs Dialog vor dem Programmstart???
Das Thema ist ja richtig interessant geworden. Trotzdem bleibt meine Frage, da ich nicht wirklich fit bin in diesem Thema, wie ich diesen Code in meine vorhandene Applikation einbaue.
Ansonsten mache ich es mit CreateProcessAsUser halt für meine Unterprogramme in meinem Programm. Schöner wäre ja nur wenn das ganze Tool mit Admimrechten laufen würde. Danke. |
Re: RunAs Dialog vor dem Programmstart???
Zitat:
evtl./sicherheitshalber im OnClose noch das RevertToSelf rein ... :gruebel: |
Re: RunAs Dialog vor dem Programmstart???
Zitat:
also hier mal vollständig: Zitat:
unter 2000 jedoch nicht. LogonUser liefert hier false zurück. das wird wohl genau der hinweis sein, den ich als zitat gepostet habe. kann das bitte jemand auch ausprobieren und bestätigen/dementieren? (btw: als DOMAIN habe ich '' genommen, da ich das lokal machen möchte. ging unter XP, vllt braucht 2000 was anderes?) für meine zwecke müsste eine solche funktion für 2000/XP/2003 funktionieren. die 2000 user möchste/kann ich auf keinen fall ausnehmen. |
Re: RunAs Dialog vor dem Programmstart???
Warum nimmst du nicht
![]() ![]() |
Re: RunAs Dialog vor dem Programmstart???
Habe mit mal CreateProcessWithLogonW angeschaut. würde für meinen Fall auch zu treffen. Funktioniert das auch mit delphi3? Bekomme immer ein fehlermeldung das er EnablePrivilege oder CreateProcessAsLogon nicht kennt.
|
Re: RunAs Dialog vor dem Programmstart???
|
Re: RunAs Dialog vor dem Programmstart???
Zitat:
um das in einer exe verwenden zu können, muss sich das programm damit selber aufrufen und die aktuelle instanz beenden. dürfte den programmstart entsprechend verlangsamen. |
Re: RunAs Dialog vor dem Programmstart???
Moin Daywalker,
Zitat:
|
Re: RunAs Dialog vor dem Programmstart???
Zitat:
Ansonsten müsste man davon ausgehen müssen, dass Du was "Böses" machen willst. :-D Zitat:
Zitat:
Wenn das Prog schliesst ist alles um ! Kein Prog = keine Rechte ! Zitat:
Ich glaub man nennt das "Erarbeiten" :thumb: Zitat:
|
Re: RunAs Dialog vor dem Programmstart???
Zitat:
XP: geht 2000: geht nicht |
Re: RunAs Dialog vor dem Programmstart???
Zitat:
Wie ich schon sagte, Win2000-PC waren nur (sehr) wenige bei mir im Test, da wir 2K übersprungen haben (schade). Mit SP2 und allen/letzen Patches gehts bei mir. Aber vielleicht kriegst Du es ja raus, woran es liegt :wink: |
Re: RunAs Dialog vor dem Programmstart???
Moin Zusammen,
ich habe das gerade mal ausprobiert beide angesprochenen Privilegien zu aktivieren: Unter XP SP2 und W2K SP4 hat das geklappt, dennoch schlägt der Aufruf von LogonUser unter W2K fehl (Der Client besitzt ein erforderliches Recht nicht) :gruebel: Vorhanden sein müssen die Privilegien, sonst könnte ich sie nicht erfolgreich aktivieren. Irgendwie scheint in der Dokumentation eines (oder mehrere) zu fehlen. :? |
Re: RunAs Dialog vor dem Programmstart???
Zitat:
Ein an den Haaren herbeigezogenes Beispiel: Ich schreibe ein 08/15-Programm, das an einer bestimmten Stelle zwingend etwas in der Registry unter HKLM speichern muss. Ich rufe an dieser Stelle im Programm die (noch fiktive) Funktion "RunAsDialog" auf. Diese Funktion stellt fest, dass ich bereits Admin-Rechte habe und führt den gewünschten Programmcode aus. Bei einem Einsatz als Benutzer würde an der gleichen Stelle ein Dialog angezeigt werden, der mich auffordert, ein Admin-Konto zu wählen und das Passwort anzugeben. War das korrekt, erlangt das Programm die notwendigen Rechte und kann den Code ebenfalls speichern. Da es sich um ein 08/15-Programm handelt, könnte auch jemand auf die Idee kommen, es unter Windows 98 einzusetzen. Hier würden die NT-spezifischen Funktionen u.U. Fehler verursachen und im schlimmsten Fall das Programm sogar beenden oder am Programmlauf hindern, obwohl das Speichern in HKLM hier gar kein Problem ist. Der Entwickler, der so eine Bibliothek verwenden möchte, muss sich im Normalfall also um nichts weiter kümmern. Er ruft nur die Funktionen auf, den Rest erledigt die DLL intern. Und unter Systemen wie Windows 98 kommt es zu keiner Störung im Programmlauf, weil die Funktionen dann generell immer true (oder was weiß ich) zurückgeben, bzw. die nicht vorhandenen NT-Funktionen gar nicht erst aufrufen. Aber egal, es war eben nur so eine Idee, geboren aus Langeweile ... :stupid: |
Re: RunAs Dialog vor dem Programmstart???
ich finde die idee sehr gut. sowas in der art gibt es für delphi nocht nicht. brauchen tuns aber viele.
wichtig wäre aber, dass sich das ganze aber trotzdem noch anpassen ließe. also dialog (ob nun VCL oder non-VCL) und wo und wie (verschlüsselt) die admin daten ev. gespeichert werden. ganz nebenbei müsste erstmal das problem mit W2K geklärt werden. ob das an den privilegien am token oder sonstwo liegt... stellt sich nur die frage, ob jemand die erforderlichen kenntnisse besitzt, sich die zeit nimmt und sich die arbeit und mühe macht. :coder: |
Re: RunAs Dialog vor dem Programmstart???
Über das Konzept muss man noch reden. Und für mich stellt sich nicht die Frage, ob jemand mit den Kenntnissen diese Arbeit übernimmt. Für mich stellt sich die Frage, ob die hier interessiert Schreibenden willens sind, daran mitzuwirken. Fehlende Kenntnisse von irgendwas hat mich noch nie davon abgehalten, es dennoch zu versuchen :zwinker:. Ich dachte sowieso an eine Art Gemeinschaftsprojekt, bei dem jeder etwas beisteuern kann.
|
Re: RunAs Dialog vor dem Programmstart???
ja sowas wäre echt gut.
Das Programm nutzt immer nur dann höhere Rechte, wenn diese notwendig sind. z.b.
Delphi-Quellcode:
Was haltet ihr von dieser Hülle?
unit SimpleRights
type TRightInfo = record noch ein paar Infos hier über die Rechte end; TOnPrivExecute = procedure (Sender: TObject; RightsInfo : TRightsInfo; UserData : Pointer) of object; {Führt OnPrivExecute aus auf zwei Wegen aus: 1. Der Benutzer hat bereits die notwendigen Privilegien => OnPrivExecute wird einfach aufgerufen 2. Der Benutzer hat nicht die notwendigen Privilegien => Ein LoginDialog wird angezeigt und im Erfolgsfall wird OnPrivExecute aufgerufen. } function ExecutePrivilegedUser(Sender: TObject; OnPrivExecute : TOnPrivExecute; UserData : Pointer; <*> ForceShowLoginDlg : Boolean = false) : Boolean; ... <*>Hier sollten weitere Parameterstrukturen rein, die es ermöglichen anzugeben, welche Privilegien (Administrator?) nötig sind, um OnPrivExecute auszuführen. Sowie die Dialogeinstellungen. function ExecutePrivilegedUser(Sender: TObject; OnPrivExecute : TOnPrivExecute; UserData : Pointer; <*> ForceShowLoginDlg : Boolean = false) : Boolean; var AdminToken : Cardinal; begin hier noch überprüfen ob Benutzer genug Rechte hat ---> aber wie? vermutlich dieser link: [url]http://msdn.microsoft.com/library/default.asp?url=/library/en-us/secauthz/security/accesscheck.asp[/url] und ggf. den RunAsDialog (selbstgemacht) anzeigen für die Eingaben (<USERNAME,<DOMAIN>,...) if LogonUser(PAnsiChar(<USERNAME>), // UserName PAnsiChar(<DOMAIN>), // Domäne oder lokaler Rechner PAnsiChar(<PASSWORD>), // Password <LOGON32_LOGON_BATCH or LOGON32_LOGON_NETWORK or LOGON32_LOGON_INTERACTIVE>, <LOGON32_PROVIDER_DEFAULT>, AdminToken) then begin if ImpersonateLoggedOnUser(AdminToken) then begin // hier kommt Dein Prog.-Code hin try OnPrivExecute(Sender,...,UserData); finally RevertToSelf; // zurückschalten zum angemeldeten Benutzer end; end; end; end; unit FormTest; ... procedure TForm.OnMyPrivExecute (Sender : TObject; RightsInfo : TRightsInfo; UserData : Pointer); begin //hier mit anderen Rechten arbeiten end; procedure TForm1.ButtonClick(...) var MyData : Pointer; begin MyData := nil; if ExecutePrivilegedUser(Self,OnMyPrivExecute,...[benötigte Rechte],MyData) then //ok else //abbruch end; Hier noch ein paar must see links: ![]() ![]() Wie man Adminrechte erkennt: ![]() |
Re: RunAs Dialog vor dem Programmstart???
gibts hier noch etwas zu sagen?
|
Re: RunAs Dialog vor dem Programmstart???
Die Rechte kann man zb mit
![]() Aber meiner Meinung nach ist das "Projekt" hier absolut uninteressant, solange es nur mit Win XP richtig funktioniert. Es sollte noch mindestens Win2000 dazukommen, dann kann man weiter dran arbeiten. Aber das hat ja bisher noch keiner hinbekommen. (?) |
Re: RunAs Dialog vor dem Programmstart???
Nanu?
Ich dachte unter den meisten Windows 2000er funktioniert es? |
Re: RunAs Dialog vor dem Programmstart???
Außer kalmi01 und mir hat sich ja sonst niemand dazu geäußert. Bei ihm ging es bei ein paar wenigen Tests scheinbar.
Bei mir gings gar nicht. Microsoft meint auch, dass es unter Win2000 nicht gehen sollte. Siehe meinen Post ![]() Von Luckie meine ich irgendwo mal gelesen zu haben, dass bei W2K das Problem besteht, das Admin-Token zu holen und es deswegen nicht geht. Aber ich würde mich ja freuen, wenn ich mich irre und es doch irgendwie geht. |
Re: RunAs Dialog vor dem Programmstart???
ich werd noch verrückt.
Sobald ich ImpersonateLoggedOnUser aufgerufen habe - was kann ich dann alles machen? Sagen wir mit LogonUserW habe ich davor den Administrator eingeloggt. Jetzt könnte ich doch mit CreateProcess usw die Verwaltung (über Explorer) als Administrator starten. Aber das funktioniert nicht. Ich habe nicht genug Rechte, wenn ich z.b. Computername ändern will.
Delphi-Quellcode:
->> Der Client besitzt ein erforderliches Recht nicht.
if LogonUserW(PWideChar(LoginData.UserName), // UserName
PWideChar(LoginData.DomainName), // Domäne oder lokaler Rechner PWideChar(LoginData.Password), // Password {<LOGON32_LOGON_BATCH or LOGON32_LOGON_NETWORK or LOGON32_LOGON_INTERACTIVE>}LoginData.LogonType, {<LOGON32_PROVIDER_DEFAULT>,} LoginData.LogonProvider, AdminToken) then begin if ImpersonateLoggedOnUser(AdminToken) if not CreateProcessAsUser( AdminToken, // client's access token 'c:\windows\system32\cmd.exe', // file to execute nil,nil,nil,true,0,nil,nil,lpStartupInfo,lpProcessInformation) then ShowMEssage(SysErrorMessage(GetLastError)) Muss ich da irgendwas machen? Ich dachte nach ImpersonateLoggedOnUser, hat der Prozess (MainThread) alle Rechte des Benutzers ( hier Admin) ??? was mache ich falsch? ich hab das Beispiel verwendet: ![]() [edit=SirThornberry]Delphi-Tags gesetzt. Mfg, SirThornberry[/edit] |
Re: RunAs Dialog vor dem Programmstart???
Kann es sein, dass man höhere Rechte benötigt, um in die Rolle eines tiefergelegenen Users zu schlüpfen?
Also z.b. Systemrechte, um als Administrator sich einzuloggen? |
Alle Zeitangaben in WEZ +1. Es ist jetzt 05:59 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