AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Programm mit eigenen Adminrechten neu starten

Programm mit eigenen Adminrechten neu starten

Ein Thema von berens · begonnen am 18. Apr 2011 · letzter Beitrag vom 19. Apr 2011
Antwort Antwort
Seite 1 von 2  1 2   
berens

Registriert seit: 3. Sep 2004
430 Beiträge
 
Delphi 2010 Professional
 
#1

Programm mit eigenen Adminrechten neu starten

  Alt 18. Apr 2011, 15:39
Hallo zusammen,
ich habe mich schon versucht, in das erweiterte Thema mit der UAC einzulesen, und mein "Problem" ist wohl so einfach, das die Frage in dieser Form hier wohl noch nicht (klar beantwortet?) stand (?)

Mein Programm hat einen Start-Assistenten bekommen der für bestimmte Aktionen Admin-Rechte braucht. Da das Programm, dank UAC, auch wenn ich Administrator bin, mit "normalen" Rechten startet, können diese Aktionen nicht durchgeführt werden.

Wenn ich nun beim Programmstart eine Abfrage mache, und feststelle, dass ich keine Admin-Rechte habe, soll das Programm nochmal mit Admin-Rechten gestartet werden.

Ich benutze das Windows 7 Manifest mit "asInvoker".

----

Ist es richtig, dass ich hiermit einzelne Programm-Passagen nicht mit Admin-Berechtigung ausführen kann, sondern nur neue Prozesse etc. erstellen kann?
Delphi-Quellcode:
If ImpersonateLoggedOnUser(AdminToken) then begin
  // hier kommt Dein Prog.-Code hin
  RevertToSelf; // zurückschalten zum angemeldeten Benutzer
end;
Wie starte ich nun mein Programm ein zweites Mal, so dass der Benutzer die von Windows vorgegebene UAC-Abfrage bekommt, wenn ein Programm als Admin startet? GGf. mit Abfrage Benutzername/Kennwort. Ich stelle mit das so vor, wie wenn ich als "dummer" Benutzer einen Drucker konfigurieren will, aber alles gesperrt ist. Ich drücke dann auf den Button mit dem Schutzschild, gebe die Anmeldeinformationen ein und gut ist.

Alle von mir gefundenen Beispiele hier im Forum setzen voraus, dass Benutzername und Kennwort bekannt sind. Ich finde es aber unnötig, einen bereits als Administrator angemeldeten Benutzer nochmals seine Zugangsdaten in mein selbstgebasteltes Formular eintippen zu lassen; es gibt ja die Windows-Anmelde Dialoge. Aber wie fordere ich den bei/vor dem zweiten Programmstart an? Mir ist klar, dass dies pauschal für jeden Programmstart über das Manifest lösbar ist, aber das wäre eine Zumutung für den Benutzer (da der Assistent nur ein einziges Mal insgesamt gestartet werden soll).

Falls das Code-Beispiel oben doch für einzelne Programm-Passagen klappen sollte, bitte ich um Info, wie ich denn das Admin-Token für den aktuell angemeldeten Benutzer erstelle. Schon klar, dass der generell Lokaler/Domänen-Admin sein muss.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.100 Beiträge
 
Delphi 12 Athens
 
#2

AW: Programm mit eigenen Adminrechten neu starten

  Alt 18. Apr 2011, 16:03
Ist es richtig, dass ich hiermit einzelne Programm-Passagen nicht mit Admin-Berechtigung ausführen kann, sondern nur neue Prozesse etc. erstellen kann?
Delphi-Quellcode:
If ImpersonateLoggedOnUser(AdminToken) then begin
  // hier kommt Dein Prog.-Code hin
  RevertToSelf; // zurückschalten zum angemeldeten Benutzer
end;
Wenn ich das richtiog verstanden hab, dann ja, aber es funktioniert wohl nicht immer richtig, so wie gewollt,
bzw. es wäre ja im Prinzip eine Sicherheitslücke, wenn sich jedes nichtberechtigte Programm einfach so selbst die Rechte erweitern könnte.

Zitat:
Ich benutze das Windows 7 Manifest mit "asInvoker".
Das könnte man ja ändern.


Da dieses Wort ein bissl zu lang für den Index der Forensuche ist ... such mal über Google nach ImpersonateLoggedOnUser site:delphipraxis.net
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests

Geändert von himitsu (18. Apr 2011 um 16:07 Uhr)
  Mit Zitat antworten Zitat
shmia

Registriert seit: 2. Mär 2004
5.508 Beiträge
 
Delphi 5 Professional
 
#3

AW: Programm mit eigenen Adminrechten neu starten

  Alt 18. Apr 2011, 16:19
Versuch' mal:
Delphi-Quellcode:
ShellExecute(0, 'runas', PChar(ParamStr(0)), GetCommandLine, nil, SW_SHOWNORMAL);
Application.Terminate;
und sach Bescheid ob es funktioniert.
Das würde mich nämlich auch interessieren, aber ich habe gerade kein Vista/Win7 zur Hand.
Andreas

Geändert von shmia (18. Apr 2011 um 16:21 Uhr) Grund: GetCommandLine hinzu
  Mit Zitat antworten Zitat
berens

Registriert seit: 3. Sep 2004
430 Beiträge
 
Delphi 2010 Professional
 
#4

AW: Programm mit eigenen Adminrechten neu starten

  Alt 18. Apr 2011, 16:32
Zitat:
Wenn ich das richtiog verstanden hab, dann ja, aber es funktioniert wohl nicht immer richtig, so wie gewollt,
bzw. es wäre ja im Prinzip eine Sicherheitslücke, wenn sich jedes nichtberechtigte Programm einfach so selbst die Rechte erweitern könnte.
Nein, eigentlich nicht. Sagen wir du willst ein paar Werte in der Registry bei HKLM ändern. Unter Windows 98 kein Problem. Unter W7 bist du als Administrator angemeldet und startest das Programm. Der Button "Jetzt Änderungen an Registry vornehmen" hat das Schutzschild von Vista/W7 als Icon. Wenn man draufklickt (ImpersonateLoggedOnUser(AdminToken) kommt dann dieser Dialog ("Zur Fortsetzung des Vorgangs ist Ihre Zustimmung erforderlich"). Wenn man selbst _kein_ Administrator ist, kommt danach die Abfrage nach Benutzername/Passwort Administrator (Dialog hier; ohne Zertifikatwarnung. Nachdem ich alles geschrieben habe, gebe ich mit RevertToSelf meine Admin-Rechte auf. Wenn der Benutzer auf Abbrechen klickt, wird der komplette Block einfach nicht ausgeführt. Ich sehe darin keine Sicherheitslücke.

Mit dir himitsu hab ich ja den richtigen Ansprechpartner direkt an der Hand. Wenn ich deine Beschreibungen im Manifestcreator richtig verstehe, soll man "highestAvailable" nicht verwenden ("Planen Sie strukturverbesserungen [...]"). Auch soll mein Programm weder immer als Admin laufen, noch Admin-Rechte erfordert damit es überhaupt gestartet werden kann. Was bleibt mir denn also übrig ausser "asInvoker"

Auch über die Google-Suche komme ich wieder nur zu Ergebnissen, die voraussetzen, dass mein Programm bereits Benutzername und Passwort vom aktuellen Benutzer gespeichert haben. Warum sollte ich das tun, wenn es den o.g. (zweiten) Dialog gibt?

Gibt es nicht vielleicht einen Befehl wie ShellExecute oder so, wo ich einfach sowas wie "requireAdministrator" als Parameter übergebe und Windows (sprich: der Benutzer) muss sich um die Anmeldedaten kümmern? Ich kann mir nicht vorstellen, dass Microsoft in all seinen Programmen die ein Schutzschild auf dem Button haben, einen eigenen Dialog für Benutzername und Passwort einprogrammiert haben?

Edit 1: Eben kommt shmia's Beitrag rein, was dem ShellExecute ja schon nahe kommt. Ich teste das direkt.
Edit 2: Mit 'runas' wird das Programm nochmal gestartet, es kommt aber keine Benutzername/Passwort abfrage. (Hmm. vll. nochmal auf nem PC mit UAC testen?). Wenn dann müsste ich ja auch angeben können, dass sich nun unbedingt ein Admin, und nicht ein normaler Benutzer anmelden soll...

Geändert von berens (18. Apr 2011 um 16:35 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Assarbad
Assarbad

Registriert seit: 8. Okt 2010
Ort: Frankfurt am Main
1.234 Beiträge
 
#5

AW: Programm mit eigenen Adminrechten neu starten

  Alt 18. Apr 2011, 17:01
UAC funktioniert nur an Prozeßgrenzen, MSDN-Library durchsuchenImpersonateLoggedOnUser funktioniert hingegen pro Thread.

Will heißen, daß du bei dem UAC-Prompt danach einen anderen Prozeß mit erhöhten Rechten hast, der dann irgendwas macht (bspw. Dateien löschen oder Registryänderungen vornehmen). Das sind also komplett verschiedene Szenarien.
Oliver
"... aber vertrauen Sie uns, die Physik stimmt." (Prof. Harald Lesch)
  Mit Zitat antworten Zitat
shmia

Registriert seit: 2. Mär 2004
5.508 Beiträge
 
Delphi 5 Professional
 
#6

AW: Programm mit eigenen Adminrechten neu starten

  Alt 18. Apr 2011, 17:11
Hier noch etwas verbesserter Code:
Delphi-Quellcode:
function GetAppParameters:PChar;
begin
   Result := GetCommandLine;

   while Result^ <> #0 do
   begin
      if Result^ =' then
      begin
         Inc(Result);
         Break;
      end;
      Inc(Result);
   end;
end;

procedure ElevateMyself;
begin
   if ShellExecute(0, 'runas', PChar(ParamStr(0)), GetAppParameters, nil, SW_SHOWNORMAL) > 32 then
      Application.Terminate;
end;
Andreas
  Mit Zitat antworten Zitat
ASM

Registriert seit: 15. Aug 2004
165 Beiträge
 
Delphi 7 Enterprise
 
#7

AW: Programm mit eigenen Adminrechten neu starten

  Alt 18. Apr 2011, 18:07
Leider funktioniert die "runas"-Option nur dann, wenn der Dienst "Sekundäre Anmeldung" gestartet bzw. auf automatisch geschaltet ist. Ändern kann man den Dienst aber leider nur mit Administratorrechten. Die aber hat man ja gerade dann nicht, wenn man runas() braucht.
Normalerweise sollte der Dienst auf "automatisch gestartet" stehen, aber Windows kippt das merkwürdigerweise bei mancher Gelegenheit, so z.B. (nur manchmal ?, und wovon dann abhängig ?) bei einer evt. notwendigen Reparatur des Systems.

Wenn also runas() nicht klappen sollte, vor allem anderen erst einmal den genannten Dienst abfragen, was auch unter eingeschränkten Benutzerrechten problemlos funktioniert. Eine solche Abfrage wäre sowieso immer gut, damit man bei diesem evt. inaktiven Dienst die nach dem Versuch mit runas() sehr häßliche Systemfehlermeldung gescheiter im Programm abfangen kann. Dies kann man nämlich nicht mit einem unmittelbaren Exception-Handling.
  Mit Zitat antworten Zitat
berens

Registriert seit: 3. Sep 2004
430 Beiträge
 
Delphi 2010 Professional
 
#8

AW: Programm mit eigenen Adminrechten neu starten

  Alt 18. Apr 2011, 21:04
RunAs hört sich zwar einfach, aber durch den Dienst auch wieder sehr störungsanfällig an.

In http://www.delphipraxis.net/107066-v...-manifest.html meint himitsu, dass er das Ganze über CreateProcessWithLogonW gelöst hat. Wieder die Frage: Wie mache ich es, dass Windows und nicht mein Programm nach Benutzername/Kennwort fragt?

Kann alternativ bitte jemand einen Code-Schnippsel für ImpersonateLoggedOnUser mit einem Thread liefern? Wenn's geht bitte so, dass nicht Benutzername / Kennwort abgefragt werden, sondern dass Windows (Screenshots siehe oben) selbst danach fragt. Das Beispiel von Michael Puff ist leider hier nicht hilfreich...

Oder: Wie erstelle ich ein AdminToken?
Mein Codeschnippsel mit ImpersonateLoggedOnUser(AdminToken) hört sich zwar toll an, aber ich habe keine Idee, wie ich das Token erstelle. In den ganzen Threads war immer die Rede davon, dass man keine Token-Kopie etc machen soll, aber nicht, wie das Token überhaupt erstellt oder ausgelesen wird.

Es ist nicht so dass ich zu faul für die SuFu bin, sonder ich finde nur nichts zusammenhängendes.

PS: Kann es sein, dass die E-Mail Benachrichtigung bei neuen Beiträgen defekt ist?
Edit: In meinem Profil steht dieser Thread zwar bei Abonnements, aber bei "Benachrichtigung" stand nichts drinnen. Ist das neuerdings standardmäßig deaktiviert?

PS2: Die SuFu in der FireFox-Suchmaschinen-Liste kommt bei mir immer noch nicht mit den Sonderzeichen äöü zurecht. Gibt's da nen Update?



Edit: Das von shmia genannte ShellExecute Beispiel funktioniert bei mir genau wie es soll, sogar, auch und trotzdem dass der Dienst "Sekundäre Anmeldung" nicht gestartet ist! Für Alle, die sich mit dem Thema erst neu befassen: War für uns selbstverständlich ist, ist genauer betrachtet für die Entwicklung unseres Programms für eingeschränkte Benutzer (= nicht Admin) nicht förderlich: Delphi führt alle .exe Dateie mit F9 (scheinbar) immer als Administrator aus. Wenn Ihr also ein Programm mit (anfangs) eingeschränkten Rechten testen wollt, unbedingt die .exe direkt im Explorer doppelklicken. Stichwort SuFu: isAdmin
Dieser Ansatz von shmia würde mir generell erstmal genügen. Ich hoffe/erwarte dass in Domänen-Umgebungen statt des Ja/Nein Dialogs dann auch tatsächlich eine Abfrage nach Benutzername/Kennwort eines Domänen-Admins kommen.
Über einen Code-Schnippsel bzgl. kurzzeitiger Rechte-Erhöhung z.B. in einem Thread (ohne bekannte Benutzernamen/Passwort) würde ich mich dennoch sehr freuen! Gute Nacht einstweilen und vielen Dank!

Geändert von berens (18. Apr 2011 um 21:51 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#9

AW: Programm mit eigenen Adminrechten neu starten

  Alt 18. Apr 2011, 22:28
Delphi führt alle .exe Dateie mit F9 (scheinbar) immer als Administrator aus.
Unsinn. Das tut es nur, wenn es selbst auch als Administrator gestartet wurde. Denn wo sollten sonst die erhöhten Rechte herkommen?
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Dezipaitor

Registriert seit: 14. Apr 2003
Ort: Stuttgart
1.701 Beiträge
 
Delphi 7 Professional
 
#10

AW: Programm mit eigenen Adminrechten neu starten

  Alt 18. Apr 2011, 23:10
CreateProcessWithLogonW benutzt den sekundären Anmeldedienst. ShellExecute und runas macht das über die Shell.

ImpersonateLoggedOnUser kann man eigentlich nur für Dienste nutzen, die damit als ein anderer Benutzer auftreten wollen. Das ist der eigentliche Zweck. Mehr als die eigenen Rechte kann man damit nicht bekommen.

Wenn man ab Vista kurz mal mehr Rechte benötigt, kann man seine Methoden in COM-DLL auslagern, ein Interface dazu setzen und dann über Windows diese DLL mit Adminrechten (über eine Exe von Windows) starten lassen. Nennt sich COM Rlevation. Gibt ne Menge Beispiele für Delphi dazu, z.B. meine:
http://blog.delphi-jedi.net/2008/03/...gram-elevated/
http://blog.delphi-jedi.net/2008/03/...ta-with-jwscl/
Christian
Windows, Tokens, Access Control List, Dateisicherheit, Desktop, Vista Elevation?
Goto: JEDI API LIB & Windows Security Code Library (JWSCL)
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2   

Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 20:10 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