Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi SwitchDesktop verhindern (https://www.delphipraxis.net/63078-switchdesktop-verhindern.html)

Scorpion3000 13. Feb 2006 19:14


SwitchDesktop verhindern
 
Hallo Leute!

Ich erstelle mittels CreateDesktop einen neuen Desktop, schalte dann mittels SwitchDesktop um.
Soweit so gut. Leider hab ich folgendes Problem: Ich hab auf meiner Tastatur Sondertasten. Eine zB: startet den IExplorer. Betätige ich nun diese schaltet er von meinem Desktop in den "Deafult" - Desktop um.

Ich hab mir schon überlegt die Zugriffsrechte für den "default" - Desktop so zu ändern, dass SwitchDesktop nicht ausgeführt werden kann. Leider scheitere ich am ziemlich komplizierten Benutzung der SetSecurityInfo bzw. ACL.

Hab mir auch das mit den "Secured Desktops" (zB: WinLogon, ScreenSaver) angeschaut. Allerdings wüsste ich nicht, wie ich selbst einen gesicherten Desktop erstellen sollte. Soweit ich das verstehe, kümmert sich um die Erstellung der "sicheren Desktops" die WinLogon.

Keyboard-Hook funktioniert leider nicht bei den Sondertasten.

Es ist wichtig, dass der Benutzer nur durch eine Passwort-Eingabe den von mir erstellten Desktop verlassen kann!

Mfg Scorpion3000

Olli 10. Sep 2006 12:20

Re: SwitchDesktop verhindern
 
Schau dir liber an wie du das Verhalten von Winlogon modifizieren kannst. Stichwort GINA.

peanut 10. Sep 2006 15:12

Re: SwitchDesktop verhindern
 
Hallo Scorpion3000,

mit Desktop-Rechten habe ich auch mal gespielt :-) ist ziemlich frustrierend gewesen, habe es aber schließlich geschafft. Vielleicht helfen Dir ja die folgenden Schnipsel weiter:

Delphi-Quellcode:
[...]

  TACE_HEADER = record
     AceType : Byte;
     AceFlags: Byte;
     AceSize : Word;
  end;
  PACE_HEADER = ^TACE_HEADER;

  TACCESS_MASK = DWORD;
  PACCESS_MASK = ^TACCESS_MASK;

  TACCESS_ALLOWED_ACE = record
     Header : TACE_HEADER;
     Mask   : TACCESS_MASK;
     SidStart: DWORD;
  end;
  PACCESS_ALLOWED_ACE = ^TACCESS_ALLOWED_ACE;

[...]

function GetUserSID(szUsername: String): PSID;
var
  UserSID : PSID;
  cbUserSID: Cardinal;
  sDomain : String;
  cbsDomain: Cardinal;
  pNameUse : SID_NAME_USE;
begin
  Result := nil;
  cbUserSID := 0; UserSID := nil;
  sDomain := ''; cbsDomain := 0;
  LookupAccountName(PChar('\\.'), PChar(szUsername), UserSID, cbUserSID, @sDomain[1], cbsDomain, pNameUse);
  GetMem(UserSID, cbUserSID);
  ZeroMemory(UserSID, cbUserSID);
  SetLength(sDomain, cbsDomain);
  ZeroMemory(@sDomain[1], Length(sDomain));
  if (LookupAccountName(PChar('\\.'), PChar(szUsername), UserSID, cbUserSID, @sDomain[1], cbsDomain, pNameUse)) then
    Result := UserSID;
end;

function SecureUpDesktop(hDesktop: HDESK; dwAccessMask: DWORD): Boolean;
var
  si         : SECURITY_INFORMATION;
  UserSID    : PSID;
  pNewAcl    : PACL;
  cbACL      : Cardinal;
  psdNew     : PSECURITY_DESCRIPTOR;
begin
  Result := FALSE;
  if (hDesktop <> 0) then
  begin
    UserSID := GetUserSID('MyTestAccount');
    if (UserSID <> nil) and (IsValidSid(@UserSID^)) then
    try
      // Neuen SecurityDescriptor erstellen und initialisieren...
      psdNew := PSECURITY_DESCRIPTOR(LocalAlloc(LPTR, SECURITY_DESCRIPTOR_MIN_LENGTH));

      if not InitializeSecurityDescriptor(psdNew, SECURITY_DESCRIPTOR_REVISION) then
        Exit;

      // ACL erstellen und Initialisieren
      cbACL := SizeOf(ACL) + SizeOf(TACCESS_ALLOWED_ACE) + GetLengthSid(UserSID) - SizeOf(DWORD);
      pnewAcl := PACL(LocalAlloc(LPTR, cbACL)) ;
      if not InitializeAcl(pnewAcl^, cbACL, 2) then
        Exit;

      // Füge Rechte zu Acl hinzu
      if not(AddAccessAllowedAce(pnewAcl^, pnewAcl.AclRevision, dwAccessMask, UserSID)) then
        Exit;

      // Acl in den Security-Descriptor schreiben
      if not(SetSecurityDescriptorDacl(psdNew, True, pNewAcl, False)) then
        Exit;

      // Setze die neuen Rechte...
      si := DACL_SECURITY_INFORMATION;
      if not(SetUserObjectSecurity(hDesktop, si, psdNew)) then
        Exit;
    finally
      FreeMem(UserSID);
    end;
  end;
end;

[...]

      SecureUpDesktop(hNewDesktop, DESKTOP_READOBJECTS or DESKTOP_CREATEWINDOW or DESKTOP_CREATEMENU or DESKTOP_WRITEOBJECTS or DESKTOP_ENUMERATE);

[...]
Viele Grüße

peanut.

peanut 11. Sep 2006 09:48

Re: SwitchDesktop verhindern
 
Hallo,

wo wir gerade bei Desktops sind, weiß jemand, wieso man einen Desktop mittels EnumerateDesktop auflisten kann, obwohl man dieses Recht (DESKTOP_ENUMERATE) entzogen hat? Gleiches gilt auch, wenn man einen Desktop mittels CreateDesktop erzeugt, DESKTOP_ENUMERATE aber gar nicht als Konstante übergeben hat. Der dürfte dann doch gar nicht in der Liste auftauchen?

Gruß

peanut.

SirThornberry 11. Sep 2006 09:50

Re: SwitchDesktop verhindern
 
Ich denke es wird nix anderes übrig bleiben als sich das Recht zu holen. Denn welchen Sinn würden die Rechte machen wenn Sie keien Auswirkung hätten.

peanut 11. Sep 2006 12:31

Re: SwitchDesktop verhindern
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo,

Zitat:

Zitat von SirThornberry
Denn welchen Sinn würden die Rechte machen wenn Sie keien Auswirkung hätten.

Sehe ich ja ein, aber trotzdem kann ich mir alle Desktops anzeigen lassen, siehe Demo (Achtung: Benutzername MyTestUser ändern...). Ich erstelle einen Desktop, passe dort sogar die Zugriffsrechte an, kann ihn aber dennoch mittels EnumDesktops auflisten???

Gruß peanut.

peanut 11. Sep 2006 17:22

Re: SwitchDesktop verhindern
 
Ich habe es nun geschafft: Man muss in WinSta0 einfach WINSTA_ENUMDESKTOPS entziehen, das war es dann schon :)

Gruß peanut.


Alle Zeitangaben in WEZ +1. Es ist jetzt 14:57 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