![]() |
Re: Admin
Dadurch, daß die Funktionen fest eingelinkt sind, wird die Applikation ganz einfach nicht starten können, weil der PE-Loader bestimmte Importe nicht auflösen kann.
@Luckie: Hau'n wir uns jetzt? Ich benutze in CMDasSYS eine Funktion, welche ganz ähnlich aussieht ;) ... die ursprüngliche Fassung stammt aus dem BDN soweit ich weiß - und ist nichts anderes als die Konvertierung von einem MSDN-Beispiel. Ist also nix besonderes. |
Re: Admin
@FriFra: Siehe Ollis Beitrag, das programm wird nicht starten. ;)
@Olli: Hauen, mit dir, wegen Code von Nico? :shock: :gruebel: |
Re: Admin
Und wie kann ich dann eine entspr. Prüfung so durchführen, dass mein programm auch noch unter Win9x startet?
Denkbar wäre hier doch sicherlich der Aufruf irgendwelcher API Funktionen aus dynamisch geladenen windows dll's... |
Re: Admin
Lade die Funktionen dynamisch.
|
Re: Admin
Zitat:
@Luckie: Wer sagt die sei von Nico ... die sieht meiner so ähnlich. Jetzt muß ich dich leider verklagen :mrgreen: ... ich will nur sagen, daß es gerade bei solchen PD-Funktionen nicht mehr darauf ankommt einen Autoren zu nennen, ganz einfach weil sie PD sind. |
Re: Admin
Welche Funktionen aus welcher dll muss ich vwerwenden um das ganze Win98 Kompatibel zu bekommen?
P.S.: Ich installiere mir gerade mal eine Win98SE Maschine unter VMWare, damit ich mal wieder darauf testen kann ;) |
Re: Admin
Zitat:
Definitiv: OpenProcessToken GetTokenInformation AllocateAndInitializeSid EqualSid FreeSid |
Re: Admin
Jetzt läuft mein VMware Windows98SE und das Programm funktioniert wunderbar ;)
Ich hab die Funktion der Schweizer noch etwas angepasst, so dass bei allen OS < NT4 immer True geliefert wird:
Delphi-Quellcode:
function TDupFind_Main.IsAdmin: Boolean;
const { operating system (OS)constants } cOsUnknown = -1; cOsWin95 = 0; cOsWin98 = 1; cOsWin98SE = 2; cOsWinME = 3; cOsWinNT = 4; cOsWin2000 = 5; cOsXP = 6; cOsWin2003 = 7; cOsWinNew = 8; function GetOperatingSystem: Integer; var osVerInfo: TOSVersionInfo; majorVer, minorVer: Integer; begin Result := cOsUnknown; { set operating system type flag } osVerInfo.dwOSVersionInfoSize := SizeOf(TOSVersionInfo); if GetVersionEx(osVerInfo) then begin majorVer := osVerInfo.dwMajorVersion; minorVer := osVerInfo.dwMinorVersion; case osVerInfo.dwPlatformId of VER_PLATFORM_WIN32_NT: { Windows NT/2000 } begin if majorVer <= 4 then Result := cOsWinNT else if (majorVer = 5) and (minorVer = 0) then Result := cOsWin2000 else if (majorVer = 5) and (minorVer = 1) then Result := cOsXP else if (majorVer = 5) and (minorVer = 2) then Result := cOsWin2003 else if (majorVer = 5) and (minorVer >= 3) then Result := cOsWinNew else Result := cOsUnknown; end; VER_PLATFORM_WIN32_WINDOWS: { Windows 9x/ME } begin if (majorVer = 4) and (minorVer = 0) then Result := cOsWin95 else if (majorVer = 4) and (minorVer = 10) then begin if osVerInfo.szCSDVersion[1] = 'A' then Result := cOsWin98SE else Result := cOsWin98; end else if (majorVer = 4) and (minorVer = 90) then Result := cOsWinME else Result := cOsUnknown; end; else Result := cOsUnknown; end; end else Result := cOsUnknown; end; const SECURITY_NT_AUTHORITY: TSIDIdentifierAuthority = (Value: (0, 0, 0, 0, 0, 5)); SECURITY_BUILTIN_DOMAIN_RID = $00000020; DOMAIN_ALIAS_RID_ADMINS = $00000220; var hAccessToken: THandle; ptgGroups: PTokenGroups; dwInfoBufferSize: DWORD; psidAdministrators: PSID; x: Integer; bSuccess: BOOL; TmpOS: integer; begin if GetOperatingSystem < 4 then Result := True else begin Result := False; bSuccess := OpenThreadToken(GetCurrentThread, TOKEN_QUERY, True, hAccessToken); if not bSuccess then begin if GetLastError = ERROR_NO_TOKEN then bSuccess := OpenProcessToken(GetCurrentProcess, TOKEN_QUERY, hAccessToken); end; if bSuccess then begin GetMem(ptgGroups, 1024); bSuccess := GetTokenInformation(hAccessToken, TokenGroups, ptgGroups, 1024, dwInfoBufferSize); CloseHandle(hAccessToken); if bSuccess then begin AllocateAndInitializeSid(SECURITY_NT_AUTHORITY, 2, SECURITY_BUILTIN_DOMAIN_RID, DOMAIN_ALIAS_RID_ADMINS, 0, 0, 0, 0, 0, 0, psidAdministrators); {$R-} for x := 0 to ptgGroups.GroupCount - 1 do if EqualSid(psidAdministrators, ptgGroups.Groups[x].Sid) then begin Result := True; Break; end; {$R+} FreeSid(psidAdministrators); end; FreeMem(ptgGroups); end; end; end; |
Re: Admin
Wo lädst du denn da die Funktionen dynamisch?
|
Re: Admin
Nirgends! Ich hab einfach nicht glauben wollen, dass das Programm mit dieser Funktion nicht startetm und hab das ganze jetzt einfach mal getestet...
Die Idee mit dem dynamischen Laden der entspr. dll-Funktionen kam mir ja nur, weil hier mehrfach behauptet wurde, dass diese Funktionen "fest eingelinkt sind" und das Programm deshalb nicht starten würde... es startet aber :roll: :???: |
Alle Zeitangaben in WEZ +1. Es ist jetzt 09:35 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