![]() |
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 13:44 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