Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Windows Vista/7 Adminrechte für Anfänger? (https://www.delphipraxis.net/143851-windows-vista-7-adminrechte-fuer-anfaenger.html)

Shubit 24. Nov 2009 19:54


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?

Phoenix 24. Nov 2009 19:58

Re: Windows Vista/7 Adminrechte für Anfänger?
 
Zitat:

Zitat von Shubit
alle nur einen Effekt: Ich starte mein Programm entweder mit oder ohne Adminrechte und dabei bleibt es dann.

Das ist korrekt.
Zitat:

Zitat von Shubit
Ich würde aber gerne erstmal ohne Adminrechte starten und dise nur bei Bedarf anfordern. Gibt es dafür auch ein schönes Tutorial?

Im Prinzip läuft das so ab:
- 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)

Shubit 24. Nov 2009 20:01

Re: Windows Vista/7 Adminrechte für Anfänger?
 
gut, das klingt schonmal logisch
und wie geht das? :D

Phoenix 24. Nov 2009 20:24

Re: Windows Vista/7 Adminrechte für Anfänger?
 
Die Application Recovery & Restart API (ARR) ist eigentlich ausreichend gut im MSDN dokumentiert.

Shubit 25. Nov 2009 07:07

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.

R2009 25. Nov 2009 07:33

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

mkinzler 25. Nov 2009 07:37

Re: Windows Vista/7 Adminrechte für Anfänger?
 
Zitat:

solche Verweise hasse ich wie die Pest. Wenn jemand nicht schon professioneller Programmierer ist und eine Menge Erfahrung hat kann er damit nichts anfangen.
Wie du schon geschrieben hast, steht nirgends, dass er Anfänger ist.
So schlecht ist die MSDN aber imho nicht. Zudem finde ich das der Herausgeber einer API/Schnittstelle immer ein guter Anlaufpunkt ist.

Angel4585 25. Nov 2009 08:01

Re: Windows Vista/7 Adminrechte für Anfänger?
 
Zitat:

Zitat von mkinzler
Wie du schon geschrieben hast, steht nirgends, dass er Anfänger ist.

Ich hatte es schon geahnt als ich mir die Überschrift angeguckt hab :zwinker:

Phoenix 25. Nov 2009 08:06

Re: Windows Vista/7 Adminrechte für Anfänger?
 
Zitat:

Zitat von R2009
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.

Hi Rainer,

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.

Ralf Kaiser 25. Nov 2009 08:52

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 im EDN gefunden.

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

Shubit 27. Nov 2009 21:03

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:
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;
Also ich erstelle damit ein Objekt und weise dem die Funktionen zu die ich als Admin ausführen möchte?

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.

Ralf Kaiser 27. Nov 2009 21:08

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!

Shubit 28. Nov 2009 08:43

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^^

Ralf Kaiser 30. Nov 2009 13:19

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:
<?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>
Dann erstellst du eine RC-Datei (z.B. "UAC.RC"), ebenfalls im Projektverzeichnis der DLL, mit der du das Manifest in die DLL einbindest:

Delphi-Quellcode:
1 24 "UAC.manifest"
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.

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:
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;
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!!!)

Ich hoffe, das hilft erst mal ein wenig,
Ralf

Shubit 3. Dez 2009 09:21

Re: Windows Vista/7 Adminrechte für Anfänger?
 
jo danke, kannst du noch den komplett Quelltext als zip anhängen?

Ralf Kaiser 3. Dez 2009 09:53

Re: Windows Vista/7 Adminrechte für Anfänger?
 
Zitat:

Zitat von Shubit
jo danke, kannst du noch den komplett Quelltext als zip anhängen?

Das da oben ist der komplette Quelltext (zumindest für das Erzeugen des COM-Objektes zur Laufzeit). Wichtig ist. das Manifest in die COM-DLL einzubauen und das COM-Objekt nicht, wie normal, mit MeinComObjektClass.CoCreate() zu erzeugen sondern mit der Funkktion (aus deinem Post, die stimmte fast mit meiner Version überein, natürlich waren die Variablennamen anders).

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.

Shubit 1. Apr 2010 08:25

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 03:57 Uhr.

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