Delphi-PRAXiS
Seite 2 von 2     12   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   C++ Administratorrechte anfordern (Elevation/Impersonation ?) (https://www.delphipraxis.net/93034-administratorrechte-anfordern-elevation-impersonation.html)

OregonGhost 4. Jun 2007 11:13

Re: Administratorrechte anfordern (Elevation/Impersonation ?
 
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 :mrgreen:), 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.

NicoDE 4. Jun 2007 16:35

Re: Administratorrechte anfordern (Elevation/Impersonation ?
 
Zitat:

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:

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.

OregonGhost 5. Jun 2007 11:08

Re: Administratorrechte anfordern (Elevation/Impersonation ?
 
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 :mrgreen:

himitsu 4. Mai 2008 13:13

Re: Administratorrechte anfordern (Elevation/Impersonation ?
 
Zitat:

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)

moelski 29. Jun 2009 06:56

Re: Administratorrechte anfordern (Elevation/Impersonation ?
 
Moin !

@NicoDE:
Vielen Dank für die TokenTools!

Funktioniert auch unter Windows 7 ganz vorzüglich. :feuerchen:

Delphi-Laie 24. Sep 2015 20:21

AW: Re: Administratorrechte anfordern (Elevation/Impersonation ?
 
Liebe Leute, bitte verzeiht mir, daß ich diese "Asbach-Diskussion" reanimiere.

Zitat:

Zitat von NicoDE (Beitrag 632305)
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?

NicoDE 17. Nov 2016 10:51

AW: Re: Administratorrechte anfordern (Elevation/Impersonation ?
 
Zitat:

Zitat von Delphi-Laie (Beitrag 1316922)
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.


Alle Zeitangaben in WEZ +1. Es ist jetzt 21:23 Uhr.
Seite 2 von 2     12   

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