AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) C++ Administratorrechte anfordern (Elevation/Impersonation ?)
Thema durchsuchen
Ansicht
Themen-Optionen

Administratorrechte anfordern (Elevation/Impersonation ?)

Ein Thema von OregonGhost · begonnen am 30. Mai 2007 · letzter Beitrag vom 17. Nov 2016
Antwort Antwort
Seite 2 von 2     12   
OregonGhost

Registriert seit: 8. Jun 2002
Ort: Lübeck
1.216 Beiträge
 
Delphi 3 Professional
 
#11

Re: Administratorrechte anfordern (Elevation/Impersonation ?

  Alt 4. Jun 2007, 11:13
So, ich danke dir für die Funktion. Ich habe sie übersetzt und soweit scheint sie zu funktionieren. Falls es jemanden interessiert (oder jemand Lust hat, meinen Code auf Fehler zu überprüfen ), so sieht sie jetzt bei mir aus:
Code:
typedef BOOL(__stdcall *PIsUserAnAdminFunc)();
typedef BOOL(__stdcall *PSHTestTokenMembershipFunc)(HANDLE, ULONG);
typedef BOOL(__stdcall *PCheckTokenMembershipFunc)(HANDLE, PSID, PBOOL);

bool TService::IsUserAnAdmin()
{
    static HMODULE hShellLib = LoadLibrary(L"SHELL32");
   
    static PIsUserAnAdminFunc ApiIsUserAnAdmin = (PIsUserAnAdminFunc)GetProcAddress(hShellLib, "IsUserAnAdmin");
    if (ApiIsUserAnAdmin) {
        return ApiIsUserAnAdmin();
    }

    static PSHTestTokenMembershipFunc ApiTestTokenMembership = (PSHTestTokenMembershipFunc)GetProcAddress(hShellLib, "SHTestTokenMembership");
    if (ApiTestTokenMembership) {
        return ApiTestTokenMembership(NULL, DOMAIN_ALIAS_RID_ADMINS);
    }

    static HMODULE hAdvApiLib = LoadLibrary(L"ADVAPI32");
    static PCheckTokenMembershipFunc ApiCheckTokenMembership = (PCheckTokenMembershipFunc)GetProcAddress(hAdvApiLib, "CheckTokenMembership");
   
    if (ApiCheckTokenMembership) {
        PSID sidToCheck;
        static SID_IDENTIFIER_AUTHORITY sidia = SECURITY_NT_AUTHORITY;
        if (AllocateAndInitializeSid(&sidia, 2, SECURITY_BUILTIN_DOMAIN_RID, DOMAIN_ALIAS_RID_ADMINS, 0, 0, 0, 0, 0, 0, &sidToCheck)) {
            BOOL bIsMember;
            bool bSuccess = ApiCheckTokenMembership(NULL, sidToCheck, &bIsMember);
            FreeSid(sidToCheck);
            if (bSuccess) {
                return bIsMember;
            }
        }
    }
    return false;
}
Ich habe mir den letzten (und längsten) Fallback gespart, weil der laut Doku nur unterhalb von Windows 2000 nötig sein sollte, was Mindestanforderung für die Software ist. Wenn da jemand mehr weiß, immer her mit Informationen.
Oregon Ghost
---
Wenn NULL besonders groß ist, ist es fast schon wie ein bisschen eins.
  Mit Zitat antworten Zitat
NicoDE
(Gast)

n/a Beiträge
 
#12

Re: Administratorrechte anfordern (Elevation/Impersonation ?

  Alt 4. Jun 2007, 16:35
Zitat von OregonGhost:
Code:
static HMODULE hShellLib = LoadLibrary(L"SHELL32");
static PIsUserAnAdminFunc ApiIsUserAnAdmin = (PIsUserAnAdminFunc)GetProcAddress(hShellLib, "IsUserAnAdmin");
Ich bin nicht sicher (jemand da, der den C++-'ANSI-Standard' auswendig kennt ?-), ob du dich bei den Initialisierungen der statischen Variablen auf die Reihenfolge 100%-ig verlassen kannst.
Sicherheitshalber könte man es gleich so schreiben:
Code:
static PIsUserAnAdminFunc ApiIsUserAnAdmin = (PIsUserAnAdminFunc)
    GetProcAddress(LoadLibrary(L"SHELL32"), "IsUserAnAdmin");
Zitat von OregonGhost:
Wenn da jemand mehr weiß, immer her mit Informationen.
Passt schon, NT4 unterstützt kaum noch jemand. Und wenn, dann ist meist eine aktuelle Shell-Version (mit der entsprechenden API) vorhanden.
  Mit Zitat antworten Zitat
OregonGhost

Registriert seit: 8. Jun 2002
Ort: Lübeck
1.216 Beiträge
 
Delphi 3 Professional
 
#13

Re: Administratorrechte anfordern (Elevation/Impersonation ?

  Alt 5. Jun 2007, 11:08
Mir ist auch aufgefallen, dass man sich die HMODULE-Dinger sparen könnte, weil damit ja nicht viel gemacht wird, aber statische Variablen innerhalb einer Funktion sollten eigentlich auch in der Reihenfolge ihrer Definition initialisiert werden. Unser ISO-C++-Auswendigkenner ist gerade nicht anwesend, ich frag ihn bei Gelegenheit mal
Oregon Ghost
---
Wenn NULL besonders groß ist, ist es fast schon wie ein bisschen eins.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

Re: Administratorrechte anfordern (Elevation/Impersonation ?

  Alt 4. Mai 2008, 13:13
Zitat von OregonGhost:
Edit: Gerade gelesen unter IsUserAnAdmin():
Zitat:
Note This function is available through Microsoft Windows XP Service Pack 2 (SP2) and Windows Server 2003. It might be altered or unavailable in subsequent versions of Windows.
*seufz*
im "neuen" MSDN steht jetzt
Zitat:
Note This function is available through Windows Vista. It might be altered or unavailable in subsequent versions of Microsoft Windows.
also scheint Microsoft diese Funktion doch weiter mitgenomen zu haben (passen nur ständig den text an das neuste windows an) ... also sollte es och wohl jetzt noch funktionieren? (2000..Vista)
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
moelski

Registriert seit: 31. Jul 2004
1.110 Beiträge
 
Delphi 2010 Professional
 
#15

Re: Administratorrechte anfordern (Elevation/Impersonation ?

  Alt 29. Jun 2009, 06:56
Moin !

@NicoDE:
Vielen Dank für die TokenTools!

Funktioniert auch unter Windows 7 ganz vorzüglich.
Dominik Schmidt
Greetz Dominik

I love Delphi 2007/2010
  Mit Zitat antworten Zitat
Delphi-Laie

Registriert seit: 25. Nov 2005
1.474 Beiträge
 
Delphi 10.1 Berlin Starter
 
#16

AW: Re: Administratorrechte anfordern (Elevation/Impersonation ?

  Alt 24. Sep 2015, 20:21
Liebe Leute, bitte verzeiht mir, daß ich diese "Asbach-Diskussion" reanimiere.

ps: Die von Luckie kopierte IsAdmin-Funktion enthält den klassischen Fehler (es wurde vergessen zu prüfen, ob die aktuelle Sid überhaupt im Token aktiviert ist).
Von der simplen IsAdmin-Funktion, von der Luckie hier eine veröffentlichte, sind einige - einander ziemlich ähnliche - Versionen im Netz aufzuspüren.

Auch wenn sie genaugenommen fehlerhaft sein mag, so hat sie (bei mir jedenfalls) bisher immer das gewünschte, also korrekte Ergebnis geliefert. Tut sie das aber immer? Falls, ja, dann ist sie "phänomenologisch" eben doch richtig. Oder sind Konstellationen möglich (nichtaktivierte SID im Token?), bei der ihre Fehlerhaftigkeit eben doch durchschlägt?
  Mit Zitat antworten Zitat
Benutzerbild von NicoDE
NicoDE

Registriert seit: 16. Jul 2012
Ort: Darmstadt
26 Beiträge
 
Delphi 10.3 Rio
 
#17

AW: Re: Administratorrechte anfordern (Elevation/Impersonation ?

  Alt 17. Nov 2016, 10:51
Auch wenn sie genaugenommen fehlerhaft sein mag, so hat sie (bei mir jedenfalls) bisher immer das gewünschte, also korrekte Ergebnis geliefert.
Das gewünschte Ergebnis hängt von der Fragestellung ab
Es macht einen erheblichen Unterschied, ob ich im aktuellen Kontext administrative Rechte habe oder haben könnte.
Im letzteren Fall würde man eher etwas wie "IsUserInAdminGroup" im UAC self-elevation (CppUACSelfElevation)-Beispielprojekt von Microsoft schreiben.
Nico Bendlin
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 2     12   


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 03:41 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