![]() |
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:
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.
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; } |
Re: Administratorrechte anfordern (Elevation/Impersonation ?
Zitat:
Sicherheitshalber könte man es gleich so schreiben:
Code:
static PIsUserAnAdminFunc ApiIsUserAnAdmin = (PIsUserAnAdminFunc)
GetProcAddress(LoadLibrary(L"SHELL32"), "IsUserAnAdmin"); Zitat:
|
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:
|
Re: Administratorrechte anfordern (Elevation/Impersonation ?
Zitat:
Zitat:
|
Re: Administratorrechte anfordern (Elevation/Impersonation ?
Moin !
@NicoDE: Vielen Dank für die TokenTools! Funktioniert auch unter Windows 7 ganz vorzüglich. :feuerchen: |
AW: Re: Administratorrechte anfordern (Elevation/Impersonation ?
Liebe Leute, bitte verzeiht mir, daß ich diese "Asbach-Diskussion" reanimiere.
Zitat:
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? |
AW: Re: Administratorrechte anfordern (Elevation/Impersonation ?
Zitat:
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 ![]() |
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:23 Uhr. |
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