Delphi-PRAXiS
Seite 2 von 3     12 3      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Admin (https://www.delphipraxis.net/33151-admin.html)

Olli 15. Aug 2005 21:01

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.

Luckie 15. Aug 2005 21:11

Re: Admin
 
@FriFra: Siehe Ollis Beitrag, das programm wird nicht starten. ;)

@Olli: Hauen, mit dir, wegen Code von Nico? :shock: :gruebel:

FriFra 15. Aug 2005 21:17

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...

Luckie 15. Aug 2005 21:27

Re: Admin
 
Lade die Funktionen dynamisch.

Olli 15. Aug 2005 21:31

Re: Admin
 
Zitat:

Zitat von FriFra
Denkbar wäre hier doch sicherlich der Aufruf irgendwelcher API Funktionen aus dynamisch geladenen windows dll's...

Genauso wird's gemacht ;)

@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.

FriFra 15. Aug 2005 22:26

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 ;)

Olli 15. Aug 2005 22:35

Re: Admin
 
Zitat:

Zitat von FriFra
Welche Funktionen aus welcher dll muss ich vwerwenden um das ganze Win98 Kompatibel zu bekommen?

Alle der oben verwendeten Funktionen, die aus der ADVAPI32.DLL stammen (schau im PSDK nach).

Definitiv:
OpenProcessToken
GetTokenInformation
AllocateAndInitializeSid
EqualSid
FreeSid

FriFra 16. Aug 2005 01:24

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;

Luckie 16. Aug 2005 01:30

Re: Admin
 
Wo lädst du denn da die Funktionen dynamisch?

FriFra 16. Aug 2005 01:37

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.
Seite 2 von 3     12 3      

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