![]() |
Windows Vista/7 Adminrechte für Anfänger?
Hi,
ich hab bereits ausführlich gegoogle und auch einige Tutorials gefunden. Die, welche ich verstanden habe hatten jedoch alle nur einen Effekt: Ich starte mein Programm entweder mit oder ohne Adminrechte und dabei bleibt es dann. Ich würde aber gerne erstmal ohne Adminrechte starten und dise nur bei Bedarf anfordern. Gibt es dafür auch ein schönes Tutorial? |
Re: Windows Vista/7 Adminrechte für Anfänger?
Zitat:
Zitat:
- Die Anwendung prüft ab, ob sie Admin-Rechte hat (= nein) - Alle Aktionen die Admin-Rechte benötigen bekommen ein Schild auf dem Button (gibts ne API für, weiss den Namen aber im MOment nicht) - wird der Button gedrückt speichert die Anwendung ihren aktuellen Status irgendwo und -- beendet sich -- startet sich selber durch die Restart & Recovery API mit Adminrechten neu - Die neu gestartete instanz bekommt mit dass die durch R&R gestartet wurde -- und lädt den aktuellen Status der alten anwendung wieder -- und führt die Aktion durch wenn sie admin-rechte hat (die erst durch die UAC freigegeben werden) |
Re: Windows Vista/7 Adminrechte für Anfänger?
gut, das klingt schonmal logisch
und wie geht das? :D |
Re: Windows Vista/7 Adminrechte für Anfänger?
Die Application Recovery & Restart API (ARR) ist eigentlich ausreichend gut im
![]() |
Re: Windows Vista/7 Adminrechte für Anfänger?
ja gut, dass war jetzt zwar nichts was ich mir unter einem Tutorial für Anfänger vorgestellt hätte, aber dann werd ich auf der Basis weitergoogeln.
|
Re: Windows Vista/7 Adminrechte für Anfänger?
Hi Shubit,
dass du Änfänger bist steht nirgendwo. hi Phoenix, solche Verweise hasse ich wie die Pest. Wenn jemand nicht schon professioneller Programmierer ist und eine Menge Erfahrung hat kann er damit nichts anfangen. Grüsse rainer |
Re: Windows Vista/7 Adminrechte für Anfänger?
Zitat:
So schlecht ist die MSDN aber imho nicht. Zudem finde ich das der Herausgeber einer API/Schnittstelle immer ein guter Anlaufpunkt ist. |
Re: Windows Vista/7 Adminrechte für Anfänger?
Zitat:
|
Re: Windows Vista/7 Adminrechte für Anfänger?
Zitat:
ich habe gerade relativ wenig Zeit. Und ich denke, immerhin ein Verweis auf die R&R API ist besser, als überhaupt gar keine weitere Hilfe. Diese API ist nicht sonderlich verbreitet, und es gibt nur eine Handvoll Codebeispiele im Netz, und die nur für den .NET Wrapper um diese API. Das heisst ich hätte Shubit auch ganz im Regen stehen lassen können. Denn nur mit den Schlagworten Restart & Recovery braucht man eine ganze Weile, bis man überhaupt diese Referenz im MSDN findet. Wenigstens die Zeit habe ich ihm schon gespart. Man kann es nunmal nicht jedem Recht machen, insbesondere nicht, wenn ich gerade eine ziemlich lange ToDo-Liste vor mir habe. Sorry. |
Re: Windows Vista/7 Adminrechte für Anfänger?
Hallo,
die Anwendung mit Adminrechten neu zu starten ist nicht nötig!! Statt dessen kann man ein COM-Objekt verwenden, das die Funktionen enthält die Adminrechte benötigen und es vom "nicht-elevateten" Programm aus erzeugen um diese Funktionen mit Admin-Rechten auszuführen. Ich habe da mal einen Artikel ![]() Dort wird allerdings beschrieben, dass der COM Server eine EXE sein muss (out of process server). Es geht aber auch mit einer DLL (in process server)! Wir haben mal in einem Projekt mit einem DLL COM Server so gearbeitet. Leider kann ich im Moment nicht auf den Rechner zugreifen (bin gerade noch zu Hause) wo das Projekt drauf ist, ich melde mich wieder wenn ich wieder an das Projekt zugreifen kann. Ciao, Ralf |
Re: Windows Vista/7 Adminrechte für Anfänger?
Sry Phoenix dass ich es nicht deutlicher hingeschrieben hatte ;)
danke Alfi ich glaub dass entspricht dann eher dem was ich machen will. In Grund genommen brauche ich ja nur folgendes:
Delphi-Quellcode:
Also ich erstelle damit ein Objekt und weise dem die Funktionen zu die ich als Admin ausführen möchte?
function NewCoGetObject(pazName: PWideChar; pBindOptions: PBindOpts3;
const iid: TIID; out ppv): HResult; stdcall; external 'ole32.dll' name 'CoGetObject'; function CoCreateInstanceAsAdmin(WndHandle: HWND; clsid: TCLSID; iid: TIID; out ppv): HRESULT; var Bo : TBindOpts3; Moniker : PWideChar; begin Moniker := PWideChar(WideString('Elevation:Administrator!new:' + GuidToString(clsid))); FillChar(Bo, SizeOf(Bo), #0); Bo.hwnd := WndHandle; Bo.cbStruct := SizeOf(Bo); Bo.dwClassContext := CLSCTX_LOCAL_SERVER; Result := NewCoGetObject(Moniker, @Bo, iid, ppv); end; Kann mir jemand ein kurzes Beispiel posten? Einfach nur wie man das Objekt erstellt und dem dann sagt dass es beispielsweise einen Ordner in Program Files erstellen soll. |
Re: Windows Vista/7 Adminrechte für Anfänger?
Also mit deinem Beispiel kann ich nun sowas von überhaupt nichts anfangen...
Du musst einen eigenen COM Server erstellen (also ein extra Projekt!). Dieser enthält die Funktionen die als Admin ausgeführt werden sollen. Dann wird dieser COM Server als Admin instatiiert und Windows zeigt die UAC-Elevation-Warnung. Stimmt der Benutzer zu dann wird die aufgerufene Funktion ausgeführt, sonst nicht. (Hast du schon einen COM-Server dessen CLSID du dem Beispielquelltext übergibst??) -- Leider komm ich erst am Montag wieder an den nötigen Quelltext ran. Ich habs mir aber in meinen Kalender eingetragen, damit ich es nicht vergesse! |
Re: Windows Vista/7 Adminrechte für Anfänger?
Hmm ... ich hab keine Ahnung von COM-Servern :(
Ich werd mir mal ein paar Tutorials dazu suchen und und schauen ob ich deinen Quelltext dann auch verstehe^^ |
Re: Windows Vista/7 Adminrechte für Anfänger?
Also, ich hab mir den Quelltext um ein COM-Objekt unter Adminrechten zu erzeugen jetzt nochmal angesehen. Dieser stimmt weitgehend mit deiner Version von "CoCreateInstanceAsAdmin" überein.
Soweit so gut. Du benötigst jetzt also zuerst das COM-Objekt, das die Funktionen enthält die mit Adminrechten ausgeführt werden sollen: Erzeuge dazu in Delphi eine "ActiveX Library". Das ist eine DLL die COM-Objekte beinhaltet. Füge dieser DLL ein Manifest hinzu. Das kannst du einfach machen, indem due eine Manifestdatei als Resource einbindest. Dazu erstellst du eine Textdatei (z.B. "UAC.manifest") mit folgendem Inhalt im Projektverzeichnis der DLL:
Delphi-Quellcode:
Dann erstellst du eine RC-Datei (z.B. "UAC.RC"), ebenfalls im Projektverzeichnis der DLL, mit der du das Manifest in die DLL einbindest:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0"> <assemblyIdentity version="1.0.0.0" processorArchitecture="*" name="UACAwareApplication" type="win32"/> <trustInfo xmlns="urn:schemas-microsoft-com:asm.v3"> <security> <requestedPrivileges> <requestedExecutionLevel level="asInvoker"/> </requestedPrivileges> </security> </trustInfo> </assembly>
Delphi-Quellcode:
Diese RC-Datei wird nun dem DLL-Projekt hinzugefügt (einfach mit der Maus in den Projektmanager ziehen). Dadurch wird die angegebene Datei "UAC.manifest" beim erzeugen der DLL als Resource in die DLL eingebunden.
1 24 "UAC.manifest"
Dann kannst du mit den Typenbibliothekseditor von Delphi dem COM-Objekt Methoden hinzufügen. Diese werden dann später im Admin-Kontext ausgeführt. In der ActiveX-DLL wird eine Konstante definiert, die CLSID. Mit dieser CLSID kann das COM-Objekt aus der DLL dann später (mit deiner Funktion "CoCreateInstanceAsAdmin") erzeugt werden. Dazu übergibst du die CLSID deines COM-Servers an die Funktion und erhälst eine Referenz auf deinen COM-Server in der Variablen "ppv". Mit dieser Referenz kannst du dann auf die Methoden die du im COM-Server definiert hast zugreifen:
Delphi-Quellcode:
In diesem Beispiel wird die Methode "DoElevatedWork" die im COM-Server definiert ist mit Adminrechten ausgeführt. Die Parameter CLASS_LSPrivilegedFunctionsClass und IID_ILSPrivilegedFunctionsClass sind dabei vom Typenbibliothekseditor in der DLL definiert worden (wie diese bei dir heissen hängt natürlich davon ab, wie du dein COM-Objekt in der DLL benennst!!!)
procedure TFormMain.DoElevatedWork();
var privfunc : ILSPrivilegedFunctionsClass; // definiert im COM-Server res : HResult; begin // Create the COM object that executes the privileged function when UAC is turned on under Vista CoCreateInstanceAsAdmin(0, CLASS_LSPrivilegedFunctionsClass, IID_ILSPrivilegedFunctionsClass, privfunc); res := privfunc.DoElevatedWork(); if (res = E_FAIL) then begin ShowMessage('FEHLER!!'); Application.Terminate; end else begin ShowMessage('Hat geklappt!'); end; end; Ich hoffe, das hilft erst mal ein wenig, Ralf |
Re: Windows Vista/7 Adminrechte für Anfänger?
jo danke, kannst du noch den komplett Quelltext als zip anhängen?
|
Re: Windows Vista/7 Adminrechte für Anfänger?
Zitat:
Das COM-Objekt-Projekt weiterzugeben macht keinen Sinn, da du mit den Methoden die ich in meinem COM-Objekt brauche ja nichts anfangen kannst. Da musst du schon mit Delphi eine eigene ActiveX-DLL erstellen. :wink: Delphi erzeugt ja das gesamte "Gerüst" der COM-DLL automatisch. Du musst "nur noch" deine Methoden hinzufügen und mit Leben füllen. Ansonsten sag doch nochmal, welchen Teil des Quelltextes du benötigst. |
Re: Windows Vista/7 Adminrechte für Anfänger?
also ich denke ich hab jetzt verstanden wie es funktioniert, allerdings hab ich keinen Schimmer wie ich das umsetze (wie man einen Com Objekt erstellt, es einbindet, compiliert, ...)
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 19:16 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