AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

SwitchDesktop verhindern

Ein Thema von Scorpion3000 · begonnen am 13. Feb 2006 · letzter Beitrag vom 11. Sep 2006
Antwort Antwort
Scorpion3000

Registriert seit: 18. Apr 2004
47 Beiträge
 
Delphi 7 Enterprise
 
#1

SwitchDesktop verhindern

  Alt 13. Feb 2006, 20:14
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
  Mit Zitat antworten Zitat
Olli
(Gast)

n/a Beiträge
 
#2

Re: SwitchDesktop verhindern

  Alt 10. Sep 2006, 13:20
Schau dir liber an wie du das Verhalten von Winlogon modifizieren kannst. Stichwort GINA.
  Mit Zitat antworten Zitat
peanut
(Gast)

n/a Beiträge
 
#3

Re: SwitchDesktop verhindern

  Alt 10. Sep 2006, 16:12
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.
  Mit Zitat antworten Zitat
peanut
(Gast)

n/a Beiträge
 
#4

Re: SwitchDesktop verhindern

  Alt 11. Sep 2006, 10:48
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.
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 
#5

Re: SwitchDesktop verhindern

  Alt 11. Sep 2006, 10:50
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.
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
peanut
(Gast)

n/a Beiträge
 
#6

Re: SwitchDesktop verhindern

  Alt 11. Sep 2006, 13:31
Hallo,

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.
Angehängte Dateien
Dateityp: zip -_desktop_-_281.zip (255,6 KB, 15x aufgerufen)
  Mit Zitat antworten Zitat
peanut
(Gast)

n/a Beiträge
 
#7

Re: SwitchDesktop verhindern

  Alt 11. Sep 2006, 18:22
Ich habe es nun geschafft: Man muss in WinSta0 einfach WINSTA_ENUMDESKTOPS entziehen, das war es dann schon

Gruß peanut.
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:34 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