![]() |
Re: Beenden eines Prozesses mittels ACL verhindern
Moin Alexander,
die Funktionen haben in der Regel einen Rückgabewert. Den solltest Du mal auswerten. Was der jeweilige bedeutet kannst Du ja im MSDN bzw. PSDK nachschlagen. Ausserdem solltest Du auch mal Resourcenschutzblöcke einbauen. |
Re: Beenden eines Prozesses mittels ACL verhindern
@Alexander Roth:
läßt du es auch unter einen anderem Account laufen? für den aktuellen Benutzer soll es ja dennoch möglich sein das zu beenden Zitat:
|
Re: Beenden eines Prozesses mittels ACL verhindern
Upss... :duck:
probiere es sofort aus. |
Re: Beenden eines Prozesses mittels ACL verhindern
Zitat:
Die Frage ist übrigens immer noch offen ... Florian |
Re: Beenden eines Prozesses mittels ACL verhindern
immernoch offen.. njo... und ich würs auch gernmal wissen. habe nämöich vor sone art lehrer-schüler-anwensung zu schreiben.
mfg |
Re: Beenden eines Prozesses mittels ACL verhindern
Ja, wollte ich auch mal machen so in der Art, bzw will ich noch machen, leider wurde ich immer auf Services verwiesen.
Die ACL Frage interessiert mich aber weiterhin brennend. Florian |
Re: Beenden eines Prozesses mittels ACL verhindern
Und nochmal ein *push* nach längerer Zeit ... irgendwar wirds doch wohl wissen ...
|
Re: Beenden eines Prozesses mittels ACL verhindern
Nochmal ein Versuch ;) Irgendwann kommt schon eine Antwort :D
Kann es sein, dass man zu dem Code, den ich gefunden habe:
Delphi-Quellcode:
irgendwas mitt AddACL oder AddDeniedACL machen muss?
var
lpSecDesc: pointer; lpACL: PACL; dwSecurityInfo: DWORD; begin GetMem(lpSecDesc, SECURITY_DESCRIPTOR_MIN_LENGTH); InitializeSecurityDescriptor(lpSecDesc, 1); GetMem(lpACL, SizeOf(TACL)); InitializeACL(lpACL^, SizeOf(TACL), 2); SetSecurityDescriptorDACL(lpSecDesc, True, lpACL, False); dwSecurityInfo:= DACL_SECURITY_INFORMATION; SetKernelObjectSecurity(GetCurrentProcess, dwSecurityInfo, lpSecDesc); FreeMem(lpACL); FreeMem(lpSecDesc); end; |
Re: Beenden eines Prozesses mittels ACL verhindern
Liste der Anhänge anzeigen (Anzahl: 1)
So, der Florian hat mich breitgeschlagen nochmal zu gucken. Und obwohl wir erstmal den Admin nicht davon abhalten können unseren Prozeß zu killen (resistance is futile? :mrgreen: ), hier mal die aktuelle Lösung.
Die Kernfunktion ist folgende:
Delphi-Quellcode:
Man sieht wiedermal meine Vorliebe für GlobalAlloc (das nullt mir nämlich den Puffer auch gleich aus :P ... und ich mag es richtig schön ausgenullt). Aus Globalisierungsgründen wie immer auf Englisch dokumentiert ;)
function ForbidProcessAccess(hProcess: THandle): Boolean;
var lpSecDesc: PSECURITY_DESCRIPTOR; lpACL: PACL; dwAclLength: DWORD; lpWorldSid: Pointer; begin // Default result is FALSE Result := False; // Allocate memory for the security descriptor lpSecDesc := PSECURITY_DESCRIPTOR(GlobalAlloc(GPTR, SECURITY_DESCRIPTOR_MIN_LENGTH)); // Sanity check if (Assigned(lpSecDesc)) then try // Init the structure InitializeSecurityDescriptor(lpSecDesc, SECURITY_DESCRIPTOR_REVISION); // Sanity check the creation of the World/Everyone SID if (AllocateAndInitializeSid(SECURITY_WORLD_SID_AUTHORITY, 1, SECURITY_WORLD_RID, 0, 0, 0, 0, 0, 0, 0, lpWorldSid)) then try // Calculate the ACL size required dwAclLength := sizeof(ACL) + sizeof(ACCESS_DENIED_ACE) * 1 + {number of ACEs} GetLengthSid(lpWorldSid); // Allocate a buffer for the ACL lpACL := PACL(GlobalAlloc(GPTR, dwAclLength)); // Sanity check if (Assigned(lpACL)) then try // Initialize it, telling the size available InitializeACL(lpAcl^, dwAclLength, ACL_REVISION); // Add a "Deny ACE" to it if (AddAccessDeniedAce(lpAcl^, ACL_REVISION, PROCESS_ALL_ACCESS, lpWorldSid)) then // Set the ACL as part of the SD if (SetSecurityDescriptorDacl(lpSecDesc, True, lpACL, False)) then begin // Set the new SD // OWNER_SECURITY_INFORMATION should be given in the flags if the owner was set // using SetSecurityDescriptorOwner() Result := SetKernelObjectSecurity(hProcess, DACL_SECURITY_INFORMATION, lpSecDesc); end; finally // Clean up after us GlobalFree(HGLOBAL(lpACL)); end; finally // Clean up after us FreeSid(lpWorldSid); end; finally // Clean up after us GlobalFree(HGLOBAL(lpSecDesc)); end; end; So, diese Funktion ruft man nun auf und schon kann der unprivilegierte Benutzer den Prozess nicht mehr killen. Allerdings sollte vermutlich am Owner noch gefeilt werden?! Im Anhang das komplette Projekt (getestet auf BDS2K6) als DPR. Es enthält auch die benötigten und nicht von Delphi bereitgestellten Typendeklarationen usw.! Daß es funzt kann man hier nachvollziehen: ![]() Es existiert auch noch eine weitere Funktion, die ursprünglich dazu gedacht war das Problem zu lösen, aber das Weglassen von "Allow ACEs" hat es eben nicht gebracht, so daß wir auf "Deny ACEs" ausweichen mußten. Lizenz: keine! (PUBLIC DOMAIN, keine Garantien oder Haftung meinerseits) - Namensnennung erwünscht. License: none! (PUBLIC DOMAIN, no guarantees or liability from my side) - Attribution appreciated. Guten Rutsch (nur nicht auf der Straße, so wie ich vor zwei Wochen -> Gehirnerschütterung), |
Re: Beenden eines Prozesses mittels ACL verhindern
Wie sieht es eigentlich aus? Habt ihr es geschaft den Bösen Admin davon abzuhalten den Process zu Beenden ?
Könnte man auch einen Bestimmten Benutzer nur noch die rechte zum Beenden geben ? |
Alle Zeitangaben in WEZ +1. Es ist jetzt 15:51 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