Gibt es eine Möglichkeit, Gastbenutzer daran zu hindern, ein bestimmtes Programm zu schließen?

38

Ich habe einen Laptop und der Benutzer führt ein Gastkonto.

Es gibt 2 Programme, die beim Systemstart automatisch starten (NetLimiter & TeamViewer). Diese Programme sind in der Taskleiste versteckt, der Gastbenutzer kann sie jedoch schließen, wenn er möchte. Gibt es eine Möglichkeit, dies zu verhindern?

Ich habe vollen Zugriff auf den Laptop. Wenn also eine Konfiguration oder ein Programm installiert werden muss, kann ich dies tun.

alaslipknot
quelle
17
Teamviewer kann auch als Dienst ausgeführt werden. Wenn vom Administrator (unter dem Administratorkonto) installiert, sollte ein normaler Benutzer nicht in der Lage sein, es zu schließen. appdataworks.com/…
Ajasja
1
Da ein Benutzer, der die GUI des Tools öffnen kann, so gut wie nicht daran gehindert werden kann, es über das Menü zu beenden, besteht die Möglichkeit, ein reguläres Skript auszuführen, das prüft, ob das Programm noch ausgeführt wird, und es gegebenenfalls neu startet hat es geschlossen? So könnte der Benutzer es schließen, aber es würde automatisch nach ein paar Sekunden neu starten?
Falco
"Dup question" vorschlagen hat eine akzeptierte Antwort, aber es fehlen wesentliche Details, und eine gute Antwort hier könnte eine viel bessere "Basis" -Lösung für zukünftige Duplikate sein.
music2myear
1
@ RJFalconer Ich habe
Alaslipknot

Antworten:

50

So verhindern Sie das Schließen über den Task-Manager

Holen Sie sich " Process Explorer " und setzen Sie die Berechtigungen für "Guest" für die beiden Programme so, dass sie keine "Terminate" -Berechtigungen haben.

  1. Suchen Sie den Prozess in der Prozess-Explorer-Liste und klicken Sie mit der rechten Maustaste auf "Eigenschaften".
  2. Sicherheit -> Berechtigungen
  3. Wählen Sie "Gast" -> Bearbeiten.

Bildschirmfoto

Dies hindert sie jedoch nicht daran, das Programm normal zu schließen. Sie müssen das Fenster- und das Taskleistensymbol mit einem Programm eines Drittanbieters oder durch Fummeln in der Registrierung ausblenden.

So drosseln Sie einen Netzwerkbenutzer, der zu viel Bandbreite verwendet

Dies scheint Ihr eigentliches Problem zu sein.

Sehen:

RJFalconer
quelle
30
Gilt dies nur für eine bestimmte laufende Instanz des Prozesses oder für alle gegenwärtigen und zukünftigen?
Martin Smith
25
@MartinSmith Dies wirkt sich nur auf den aktuell ausgeführten aus.
Ben N
1
Aus Neugier (was passiert, wenn ich auf das rote X klicke) habe ich es versucht und es scheint bei mir nicht zu funktionieren.
Pavel
11
Das Menü oder das rote X fordern das Programm auf, freiwillig zu beenden. Beenden ist das, was im Task-Manager passiert.
Zan Lynx
@ZanLynx Ja, das ist meines Erachtens der Par, der [...]
Pavel
35

Die Process Explorer-Antwort funktioniert einmal, aber Sie möchten wahrscheinlich, dass dies auch nach dem Neustart des Computers zutrifft. Dazu können Sie PowerShell verwenden:

Param (
    [string[]]$ProcessNames,
    [string]$DenyUsername
)

$cscode = @"
using System;
using System.Security;
using System.Security.AccessControl;
using System.Security.Principal;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;

public class ProcessSecurity : NativeObjectSecurity
{
    public ProcessSecurity(SafeHandle processHandle)
        : base(false, ResourceType.KernelObject, processHandle, AccessControlSections.Access)
    {

    }

    public void AddAccessRule(ProcessAccessRule rule)
    {
        base.AddAccessRule(rule);
    }

    // this is not a full impl- it only supports writing DACL changes
    public void SaveChanges(SafeHandle processHandle)
    {
        Persist(processHandle, AccessControlSections.Access);
    }

    public override Type AccessRightType
    {
        get { return typeof(ProcessAccessRights); }
    }

    public override AccessRule AccessRuleFactory(System.Security.Principal.IdentityReference identityReference, int accessMask, bool isInherited, InheritanceFlags inheritanceFlags, PropagationFlags propagationFlags, AccessControlType type)
    {
        return new ProcessAccessRule(identityReference, (ProcessAccessRights)accessMask, isInherited, inheritanceFlags, propagationFlags, type);
    }

    public override Type AccessRuleType
    {
        get { return typeof(ProcessAccessRule); }
    }

    public override AuditRule AuditRuleFactory(System.Security.Principal.IdentityReference identityReference, int accessMask, bool isInherited, InheritanceFlags inheritanceFlags, PropagationFlags propagationFlags, AuditFlags flags)
    {
        throw new NotImplementedException();
    }

    public override Type AuditRuleType
    {
        get { throw new NotImplementedException(); }
    }
}

public class ProcessAccessRule : AccessRule
{
    public ProcessAccessRule(IdentityReference identityReference, ProcessAccessRights accessMask, bool isInherited, InheritanceFlags inheritanceFlags, PropagationFlags propagationFlags, AccessControlType type)
        : base(identityReference, (int)accessMask, isInherited, inheritanceFlags, propagationFlags, type)
    {
    }

    public ProcessAccessRights ProcessAccessRights { get { return (ProcessAccessRights)AccessMask; } }
}

[Flags]
public enum ProcessAccessRights
{
    STANDARD_RIGHTS_REQUIRED = (0x000F0000),
    DELETE = (0x00010000), // Required to delete the object. 
    READ_CONTROL = (0x00020000), // Required to read information in the security descriptor for the object, not including the information in the SACL. To read or write the SACL, you must request the ACCESS_SYSTEM_SECURITY access right. For more information, see SACL Access Right. 
    WRITE_DAC = (0x00040000), // Required to modify the DACL in the security descriptor for the object. 
    WRITE_OWNER = (0x00080000), // Required to change the owner in the security descriptor for the object. 

    PROCESS_ALL_ACCESS = STANDARD_RIGHTS_REQUIRED | SYNCHRONIZE | 0xFFF, //All possible access rights for a process object.
    PROCESS_CREATE_PROCESS = (0x0080), // Required to create a process. 
    PROCESS_CREATE_THREAD = (0x0002), // Required to create a thread. 
    PROCESS_DUP_HANDLE = (0x0040), // Required to duplicate a handle using DuplicateHandle. 
    PROCESS_QUERY_INFORMATION = (0x0400), // Required to retrieve certain information about a process, such as its token, exit code, and priority class (see OpenProcessToken, GetExitCodeProcess, GetPriorityClass, and IsProcessInJob). 
    PROCESS_QUERY_LIMITED_INFORMATION = (0x1000),
    PROCESS_SET_INFORMATION = (0x0200), // Required to set certain information about a process, such as its priority class (see SetPriorityClass). 
    PROCESS_SET_QUOTA = (0x0100), // Required to set memory limits using SetProcessWorkingSetSize. 
    PROCESS_SUSPEND_RESUME = (0x0800), // Required to suspend or resume a process. 
    PROCESS_TERMINATE = (0x0001), // Required to terminate a process using TerminateProcess. 
    PROCESS_VM_OPERATION = (0x0008), // Required to perform an operation on the address space of a process (see VirtualProtectEx and WriteProcessMemory). 
    PROCESS_VM_READ = (0x0010), // Required to read memory in a process using ReadProcessMemory. 
    PROCESS_VM_WRITE = (0x0020), // Required to write to memory in a process using WriteProcessMemory. 
    SYNCHRONIZE = (0x00100000), // Required to wait for the process to terminate using the wait functions. 
}
"@

Add-Type -TypeDefinition $cscode

$ProcessNames | % {
    Get-Process -ProcessName $_ | % {
        $handle = $_.SafeHandle
        $acl = New-Object ProcessSecurity $handle
        $ident = New-Object System.Security.Principal.NTAccount $DenyUsername
        $ace = New-Object ProcessAccessRule ($ident, 'PROCESS_TERMINATE, PROCESS_SUSPEND_RESUME, WRITE_DAC', $false, 'None', 'None', 'Deny')
        $acl.AddAccessRule($ace)
        $acl.SaveChanges($handle)
    }
}

Es basiert auf dieser Stack Overflow-Antwort . Grundsätzlich stellen Sie ihm die Liste der zu schützenden Prozesse und die Liste der zu schützenden Benutzer zur Verfügung, und die Zugriffssteuerungslisten der Prozesse werden entsprechend geändert. Speichern Sie es als .ps1Datei (irgendwo, wo der Benutzer lesen, aber nicht schreiben kann), und legen Sie dann eine Batch-Datei mit folgendem Inhalt im Autostart des Benutzers ab:

powershell \path\to\script.ps1 ('snippingtool', 'mspaint') 'Guest' -executionpolicy bypass

Das schützt snippingtool.exeund mspaint.exe(das Snipping Tool und Paint) davor, von Guest getötet zu werden.

Beachten Sie, dass dies ausgeführt werden muss, nachdem diese Prozesse gestartet wurden. Möglicherweise müssen Sie sleep 10nach dem ParamBlock des PowerShell-Skripts ein oder mehrere hinzufügen . Sobald dies abgeschlossen ist, führt der Versuch, diese Prozesse mit dem Task-Manager abzubrechen, zu folgendem Ergebnis:

Zugriff abgelehnt

Beachten Sie auch, dass es keinen Sinn macht, wenn das Konto, mit dem Sie es testen, ein Administrator ist oder genauer gesagt hat SeDebugPrivilege.

Wenn Sie in den Fenstern auf das X klicken oder die Schließfunktion der Anwendung verwenden, werden die Prozesse immer noch beendet, da alle Prozesse die Möglichkeit haben, die Ausführung zu beenden. Möglicherweise müssen Sie den Benachrichtigungsbereich ausblenden, wie in einer anderen Antwort beschrieben. Da diese wichtigen Prozesse als Gastbenutzer ausgeführt werden, ist dieser Benutzer der Eigentümer der Prozessobjekte und kann die Zugriffssteuerungsliste ohnehin zurücksetzen oder Funktionen verwenden PROCESS_VM_WRITE, um den Arbeitsspeicher der Prozesse zu kritzeln und sie zum Absturz zu bringen. Diese könnten durch Hinzufügen eines leeren ACE für OWNER RIGHTSbzw. durch Ändern 'PROCESS_TERMINATE, PROCESS_SUSPEND_RESUME, WRITE_DAC'von gelöst werden 'PROCESS_ALL_ACCESS'.

Das Verweigern des Zugriffs auf den Task-Manager über ein Gruppenrichtlinienobjekt würde den Benutzer (offensichtlich) daran hindern, den Task-Manager zu verwenden. Dies ist die einfachste Lösung, aber nichts hindert ihn daran, ein eigenes Programm (oder taskkill) auszuführen, das nicht den Gruppenrichtlinien entspricht. Es ist am besten, wenn die Prozesse, gegen die Sie verteidigen möchten, als ein anderer Benutzer ausgeführt werden als der, gegen den Sie verteidigen möchten.

Wenn Ihr Gast gewillt ist, all diese Anstrengungen zu unternehmen, um diese verschiedenen "Schutzmaßnahmen" zu umgehen, besteht möglicherweise eher ein soziales Problem als ein technisches.

Ben N
quelle
6
Ich glaube, sie sind besorgt, wenn sie mit der rechten Maustaste auf das Symbol klicken und die Option "Beenden" der Anwendung auswählen und den Vorgang nicht über den Task-Manager beenden (obwohl dies immer noch ein Problem darstellt).
Micheal Johnson
8

Dies hängt wirklich davon ab, wie sehr Sie Ihr Gastbenutzerkonto sperren möchten. Daher sind einige weitere Informationen darüber, was Ihr Gastkonto tun / nicht tun soll, hilfreich. Ist auch die Computerdomäne verbunden?

Meine persönliche Meinung ist jedoch, dass jede verbundene oder nicht verbundene Domäne eines Gastkontos stark gesperrt werden sollte, um sicherzustellen, dass mit diesem Computer nichts Bösartiges getan werden kann, insbesondere, wenn er versehentlich in die falschen Hände gerät. Ich beginne mit den folgenden Schritten unter Verwendung von Gruppenrichtlinien.

  1. Blenden Sie den Benachrichtigungsbereich vollständig aus, damit Ihr Benutzer nicht auf Anwendungen zugreifen kann, die im Hintergrund ausgeführt werden. Wenn Sie sie für die Interaktion mit NetLimiter und TeamViewer benötigen, können Sie sie jederzeit über das Startmenü starten.

    Das spezifische GP-Element, das Sie benötigen, befindet sich unter Benutzerkonfiguration> Administrative Vorlagen> Startmenü und Taskleiste> Benachrichtigungsbereich ausblenden

  2. Deaktivierter Zugriff auf den Task-Manager, der verhindern soll, dass der Vorgang beendet wird.

    Benutzerkonfiguration> Administrative Vorlagen> System> Task-Manager entfernen

  3. Ich glaube, dass NetLimiter Berechtigungen für verschiedene Benutzer festlegen kann. Sehen Sie sich diese an und prüfen Sie, ob Sie das Benutzerkonto entfernen können, mit dem Sie die Anwendung steuern können.

Dies ist ein guter Anfang, der die meisten Benutzer einschränken sollte, wenn Sie ein wenig fortgeschrittener sind, müssen Sie möglicherweise einige umfassendere Gruppenrichtlinien festlegen

Hier finden Sie eine gute Anleitung zur Verwendung von GP, ​​um Richtlinien auf bestimmte Benutzer zu beschränken, wenn dies erforderlich ist. Http://www.sevenforums.com/tutorials/151415-group-policy-apply-specific-user-group.html

MattP
quelle
Sie werden wahrscheinlich trotzdem in der Lage sein wollen, die Uhr zu sehen.
Micheal Johnson
Die Uhr wird weiterhin angezeigt, wenn Sie den Benachrichtigungsbereich ausblenden konfigurieren. Sie sind separate OS-Komponenten
MattP
1

Vielen Dank für die detaillierten Antworten. Ich habe am Ende einige der Vorschläge im Kommentar verwendet. Ich habe Folgendes getan:

  • Deaktivieren Sie das Gastkonto vollständig, da aus irgendeinem Grund das Bearbeiten des Registrierungseintrags nicht funktioniert. Sie benötigen die Administratorberechtigung. Sobald Sie diese erhalten, wird die Änderung auch für das Administratorkonto angewendet (nicht sicher, ob dies eine häufige Angelegenheit ist) oder nur ein Bug für mich)

  • Erstellen Sie einen neuen Benutzer und führen Sie dazu folgende Schritte aus:

  • Taskleistensymbol deaktivieren (in der Registrierung)

    • Musste aus diesem Grund ein Lautstärkeregler-Gadget hinzufügen.
  • Deaktivieren Sie die Systemsteuerung (in der Registrierung)

  • Task-Manager deaktivieren (in der Registrierung)

  • Verweigern Sie bestimmte Berechtigungen, damit er nicht auf die Speicherorte dieser Software zugreifen kann (sie können nicht entfernt oder deinstalliert werden).

Mache das so, dass mein Bruder nicht mehr als 20% der Internetgeschwindigkeit nutzen kann (er hört einfach nicht auf zu streamen und zu torrentieren ...) und ich denke, das reicht aus, um ihn gesperrt zu halten.

Danke noch einmal!

alaslipknot
quelle
Hmmm, also im Grunde ist diese Antwort "Verwenden Sie nicht das Gastkonto." Das ist leider antiklimatisch.
Ich sage Reinstate Monica
Aber praktisch: Sie haben mehr Kontrolle über einen sehr eingeschränkten Benutzer als über Guest.
music2myear
1
Die Bearbeitung des Gastkontos ist wahrscheinlich darauf zurückzuführen, dass Sie die Tastatureingabe HKLMfür alle Benutzer ändern (im Wesentlichen das Ändern der "Standard" -Einstellung, die verwendet wird, wenn keine Benutzereinstellung vorhanden ist). Außerdem sollten Internet-Geschwindigkeitsbegrenzungen, wenn möglich, pro Gerät am Router festgelegt werden. Sie müssen Ihre MAC-Adresse ändern oder auf die Router-Konfiguration zugreifen, um dies zu umgehen.
wizzwizz4
5
Sie könnten einfach QoS in Ihrem Router einrichten
Wayne Werner
6
Dies ist ein klassisches Beispiel für das XY-Problem. Sie fragen nach einer Lösung X, als Sie Y wirklich brauchten: "Wie verhindere ich, dass mein Bruder mehr als 20% der Bandbreite nutzt?". Was am Router weitaus besser gelöst ist als am Computer.
Floris