AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Delphi Vista: Rechte anfordern OHNE Manifest?

Vista: Rechte anfordern OHNE Manifest?

Ein Thema von Ralf Kaiser · begonnen am 21. Jan 2008 · letzter Beitrag vom 21. Jan 2008
Antwort Antwort
Benutzerbild von Ralf Kaiser
Ralf Kaiser

Registriert seit: 21. Mär 2005
Ort: Wuppertal
932 Beiträge
 
Delphi 10.3 Rio
 
#1

Vista: Rechte anfordern OHNE Manifest?

  Alt 21. Jan 2008, 19:31
Hallo,

weiss jemand ob es unter Vista irgendwie möglich ist für eine ganz bestimmte Funktion (die sehr selten benutzt wird) per API Admin-Rechte anzufordern?

Wenn ein Manifest eingebunden ist dann kommt die UAC-Frage ja schon beim Programmstart.

Oder sollte man solche Funktionen irgendwie auslagern (dynamisch geladene DLL, COM-Server, externes Programm mit Manifest)?

Ciao,
Ralf
Ralf Kaiser
  Mit Zitat antworten Zitat
Benutzerbild von jakobwenzel
jakobwenzel

Registriert seit: 31. Aug 2005
Ort: Ingelheim am Rhein
141 Beiträge
 
FreePascal / Lazarus
 
#2

Re: Vista: Rechte anfordern OHNE Manifest?

  Alt 21. Jan 2008, 19:37
Später Rechte anfordern, also Hochstufen ist nicht möglich.
Das muss wirklich beim Programmstart gemacht werden, ist also nur durch auslagern möglich.
Jakob Wenzel
"My store now sells Ninja Weapons!"
Comicverkäufer bei den Simpsons
  Mit Zitat antworten Zitat
Benutzerbild von Ralf Kaiser
Ralf Kaiser

Registriert seit: 21. Mär 2005
Ort: Wuppertal
932 Beiträge
 
Delphi 10.3 Rio
 
#3

Re: Vista: Rechte anfordern OHNE Manifest?

  Alt 21. Jan 2008, 19:57
Das habe ich mir fast gedacht.

Es sollte aber doch wohl folgendes funktionieren:
  • Haupt-Exe läuft ganz normal ohne Vista-Manifest.
  • "Kritische" Funktionen werden in einen COM-Server ausgelagert der ein Manifest enthält
  • Haupt-Exe bindet den COM-Sever mit Late-Binding ein und ruft die Funktionen bei Bedarf auf
Oder sehe ich das jetzt falsch?

Wäre bei diesem Projekt dann sowieso egal da es schon aus 5 verschiedenen COM-Servern besteht

Ciao,
Ralf
Ralf Kaiser
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

Re: Vista: Rechte anfordern OHNE Manifest?

  Alt 21. Jan 2008, 20:11
ich hab's so gelöst, daß das Programm überprüft als was es läuft und sich notfalls per CreateProcessWithLogonW selbst unter einem Adminkonto neu startet.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Benutzerbild von Ralf Kaiser
Ralf Kaiser

Registriert seit: 21. Mär 2005
Ort: Wuppertal
932 Beiträge
 
Delphi 10.3 Rio
 
#5

Re: Vista: Rechte anfordern OHNE Manifest?

  Alt 21. Jan 2008, 20:22
Also das halte ich für keine so ideale Lösung. Vor allem wenn das Programm für den Enduser/Nichtprofi gedacht ist. Da ist diese UAC-Meldung schon schlimm genug. Aber mit der Lösung teilt das Programm dem Benutzer mit (das tut es doch oder??) "Ich starte jetzt erst mal neu" und dann kommt auch noch die UAC-Meldung. Oder wird die Meldung irgendwie verhindert? - Die kommt doch auch beim Admin-Login.
Ralf Kaiser
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

Re: Vista: Rechte anfordern OHNE Manifest?

  Alt 21. Jan 2008, 20:55
also ich hatte es gleich beim Programmstart gemacht (wenn nötig)
und da gab's keine "ich starte mich neu Meldung", aber da ich ja das Passwort nicht knacken wollte, kommt dann zumindestens eine Frage bezüglich Passwort und welcher Benutzer(Admin)


gab es nicht sowas was irgendwie nach "impersionate" klingt, womit man das Programm selber hochstufen kann?
(nur find ich einfach nichts, egal wie ich's schreib ... eventuell mal Luckie, oder Olly fragen)
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Dezipaitor

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

Re: Vista: Rechte anfordern OHNE Manifest?

  Alt 21. Jan 2008, 20:58
Man kann die UAC verwenden, um erhöhte Rechte zu bekommen. Das geht entweder über ein Manifest oder über ein OutOfProcess COM-Server. Der Com-Server ist auch nicht mehr als eine Exe oder DLL-Datei, die einfach mit erhöhten Rechten ausgeführt wird. Man muss immer einen neuen Prozess mit den erhöhten Rechten starten damit es funkz.

Windows2000 führte eingeschränkte Benutzertoken ein. Ein Token enthält Informationen, wie Gruppenmitgliedschaften. Ein eingeschränktes Token enthält daher ein oder mehrere eingeschränkte Gruppen. Eine eingeschränkte Gruppe wird nur für Verweigerungen in Zugriffskontrolllisten (DACL) verwendet. In Vista werden eingeschränkte Benutzertoken werden nun aktiv verwendet.
Unter Vista gibt es zudem Zwillings- oder LinkedToken. Ist u.a. die Gruppe Administratoren in einem Token vorhanden, so erstellt das System eine Kopie dieses Tokens, entfernt einige Privilegien und ändert die Admin-gruppe, wie schon beschrieben, auf nur-verweigern.
Diese beiden Token werden nun verknüpft und man kann mit GetTokenInformation das jeweilige andere Token erhalten. Anfangen kann man damit jedoch nicht wirklich etwas. Ist der Benutzer übrigens in keine entsprechenden Admingruppe, so entfällt das Zwillingstoken. Die UAC fordert in diesem Falle auf, einen Adminaccount und dessen Passwort einzugeben.

Wenn ein Prozess erhöhte Rechte erfordert, dann kann er zuersteinmal nichts machen. Er fährt mit dem Token, welches die nur-verweigern Admingruppe enthält. Was die UAC also nun macht, ist den Prozess mit dem Zwillingstoken zu starten. Das geht über einen Service ganz einfach, indem man CreateProcessAsUser verwendet und das Token verwendet, welches die Admingruppe aktiv enthält.
Jetzt ist es auch einsichtig, warum CreateProcessWithLogonW und LogonUser mit CreateProcessAsUser oder ImpersonateLoggedOnUser, sowie ähnliche Funktionen nicht mit der UAC funktionieren. Das System loggt den Benutzer ein und liefert immer ein eingeschränktes Token zurück.
Was wir also brauchen ist ein Dienst, der dies macht.

Mit einem COM-Server läuft das etwas anders. Hier wird nicht direkt ein neuer Prozess aufgerufen. Um es zu vereinfachen, kann man es so ausdrücken: Das System lädt das COM Objekt in einen internen Prozess, der mit dem erhöhten Token läuft. Dort werden die Methoden des Objekts mit erhöhten Rechten ausgeführt. Jedesmal wenn eine Methode ausgeführt werden soll, wird der Methodenname und dess Parameterwerte mit der Hilfe eines Marshalls in einen Datenstrom zerlegt, der dann an den internen Prozess gesendet wird. Dort wird die Funktion ausgeführt und die Rückgabewerte werden genauso zurückgesendet.


Der Schluss liegt also jetzt nahe, dass ein eigener Dienst, das "Problem" des UAC-Prompts umgeht. Ein Dienst könnte das eigene Programm auf Anfrage mit erhöhten Rechten erneut starten. Dazu umgehen wir völlig die UAC - es kommt also keinerlei Abfrage.
Große Nachteile sind jedoch:
1. Es muss ein Dienst installiert werden. Dies kommt der Einrichtung eines COM-Servers nahe. Stichwort: Adminrechte
2. Der Dienst muss gesichert mit der Anwendung kommunizieren. D.h. entweder über Pipes, gemeinsamer anonymer Speicher (nicht-anonymer Speicher würde kein Sinn machen, da ihn jeder verwenden könnte. Man kann ihn auch nicht wirklich sichern.) oder andere Möglichkeiten. Hier muss ich jedoch wirklich darauf hinweisen, dass ein Dienst, der Befehle annehmen kann, ein wirkliches Sicherheitsrisiko darstellen kann, wenn man es nicht richtig macht und einfach alle Befehle annimmt und nicht überprüft. Zudem kommen TerminalServer spezifische Sachen, wie Sessionquarantäne und -restriktionen in Spiel. Ein Dienst muss genau wiessen, aus welcher Terminalsitzung ein Programm stammt und dort das Programm mit erhöhten Rechten starten. Zudem können keinerlei Handles über zwei verschiedenen Sitzungen vererbt werden. Darunter fallen auch Handles zu Pipes und gemeinsamer anonymer Speicher.
3. Die neue (erhöhte) Anwendung sollte nicht auf dem normalen Desktop des Anwenders gestartet werden. Laut Microsoft ist es sonst möglich per Nachrichten (SendMessage) die Anwendung zu kompromitieren. Daher wäre ein neue Desktop erforderlich. Leider ist es aktuell nicht ohne weiteres möglich einen Desktop in einer WindowStation (Winsta0) in einer anderen TSitzung zu erstellen. CreateDesktop wurde dafür nicht geschaffen. Hier wäre es notwendig, direkt mit den Kernelobjekten (NT objects) zu arbeiten.


PS.
CreateProcessWithLogonW verwendet den Dienst "Sekundärer Anmeldedienst" und wird fehlschlagen wenn dieser deaktiviert ist, wie z.B. im Kioskmodusvon Windows. LogonUser mit CreateProcessAsUser wäre eine Lösung dafür.
Christian
Windows, Tokens, Access Control List, Dateisicherheit, Desktop, Vista Elevation?
Goto: JEDI API LIB & Windows Security Code Library (JWSCL)
  Mit Zitat antworten Zitat
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 01:12 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