Existe-t-il un moyen d'empêcher les utilisateurs invités de fermer un programme donné?

38

J'ai un ordinateur portable et son utilisateur utilise un compte invité.

Deux programmes démarrent automatiquement au démarrage du système (NetLimiter et TeamViewer). Ces programmes sont cachés dans le bac, mais l’utilisateur invité peut les fermer s’il le souhaite. Y a-t-il un moyen d'empêcher cela?

J'ai un accès complet à l'ordinateur portable, donc s'il y a une configuration ou un programme à installer, je peux le faire.

alaslipknot
la source
17
Teamviewer peut également être exécuté en tant que service. S'il est installé par l'administrateur (sous le compte administrateur), un utilisateur normal ne devrait pas pouvoir le fermer. appdataworks.com/…
Ajasja le
1
Comme il n’existe pratiquement aucun moyen d’empêcher un utilisateur pouvant ouvrir l’interface graphique de l’outil de le quitter via le menu, qu’en est-il de l’exécution d’un script standard qui vérifie si le programme est toujours en cours d’exécution et ne le redémarre que si l'a fermé? Donc, l'utilisateur pourrait le fermer, mais il redémarrerait automatiquement après quelques secondes?
Falco
Suggérer que Dup question a une réponse acceptée, mais elle manque de détails substantiels, et une bonne réponse ici pourrait être une bien meilleure solution de "base" pour les doublons à venir.
music2myear
1
@RJFalconer j'ai fait
alaslipknot

Réponses:

50

Pour empêcher la fermeture via le gestionnaire de tâches

Obtenez " Process explorer " et définissez les autorisations pour "Invité" sur les deux programmes afin de ne pas disposer des autorisations "Terminate".

  1. Recherchez un processus dans la liste de l'explorateur de processus et cliquez avec le bouton droit de la souris sur "Propriétés".
  2. Sécurité -> Autorisations
  3. Sélectionnez "Invité" -> Modifier.

capture d'écran

Cela ne les empêche toujours pas de simplement fermer le programme normalement. Vous devrez masquer la fenêtre et l'icône de la barre d'état système à l'aide d'un programme tiers ou d'un fauchage de registre.

Pour limiter un utilisateur du réseau utilisant trop de bande passante

Cela semble être votre problème actuel.

Voir:

RJFalconer
la source
30
Cela s'applique-t-il uniquement à une instance en cours d'exécution spécifique du processus ou à toutes les instances présentes et futures?
Martin Smith
25
@MartinSmith Ceci n'affectera que celui en cours d'exécution.
Ben N
1
Par curiosité (quant à ce qui se passe lorsque je clique sur le bouton X rouge), j’ai essayé cela et cela ne semble pas fonctionner pour moi.
Pavel
11
Le menu ou le X rouge demande au programme de quitter volontairement. Terminer est ce qui se passe dans le Gestionnaire des tâches.
Zan Lynx
@ZanLynx Oui, c'est ce que je comprends, le par qui dit [...] mais l'utilisateur invité peut les fermer s'il le souhaite. Y a-t-il un moyen d'empêcher cela?
Pavel
35

La réponse Process Explorer fonctionne une fois, mais vous souhaitez probablement que cela s'applique même après le redémarrage de l'ordinateur. Pour ce faire, vous pouvez utiliser PowerShell:

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

C'est basé sur cette réponse de débordement de pile . Fondamentalement, vous lui fournissez la liste des processus à protéger et les utilisateurs contre lesquels il doit se protéger, et il manipule les listes de contrôle d'accès des processus de manière appropriée. Enregistrez-le en tant que .ps1fichier (quelque part que l'utilisateur peut lire mais pas écrire), puis mettez un fichier de commandes contenant quelque chose comme ceci au démarrage de l'utilisateur:

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

Qui protège snippingtool.exeetmspaint.exe (l'outil de découpage et la peinture) d'être tués par Guest.

Notez que cela doit être exécuté après le démarrage de ces processus. Il se peut que vous deviez en ajouter sleep 10environ après le Parambloc du script PowerShell. Une fois l'opération terminée, essayer de supprimer ces processus avec le Gestionnaire des tâches aura les conséquences suivantes:

accès refusé

Notez également que cela ne servira à rien si le compte avec lequel vous le testez est un administrateur, ou plus précisément SeDebugPrivilege .

En cliquant sur le X dans leur fenêtre ou en utilisant la fonctionnalité de fermeture des applications, les processus resteront fermés, car tous les processus sont libres de décider de s’arrêter. Vous devrez peut-être masquer la zone de notification, comme décrit dans une autre réponse. De plus, étant donné que ces processus importants sont exécutés en tant qu'utilisateur invité, cet utilisateur est le propriétaire des objets de processus et pourra quand même réajuster la liste de contrôle d'accès PROCESS_VM_WRITE. Ceux-ci pourraient être résolus en ajoutant un ACE vierge pour OWNER RIGHTSet en changeant 'PROCESS_TERMINATE, PROCESS_SUSPEND_RESUME, WRITE_DAC'pour'PROCESS_ALL_ACCESS' , respectivement.

Refuser l’accès au gestionnaire de tâches via un objet de stratégie de groupe empêcherait l’utilisateur d’utiliser le gestionnaire de tâches (évidemment) et constitue la solution la plus simple, mais rien ne les empêche d’exécuter leur propre programme (ou taskkill ) qui ne respecte pas la stratégie de groupe. Il serait préférable que les processus que vous essayez de défendre soient exécutés sous un utilisateur différent de celui contre lequel vous essayez de vous défendre.

Bien sûr, si votre invité est prêt à tout mettre en œuvre pour contourner ces différentes "protections", vous aurez peut-être davantage un problème social que technique.

Ben N
la source
6
Je pense qu'ils craignent de cliquer avec le bouton droit de la souris sur l'icône et de choisir l'option "Quitter" de l'application, sans arrêter le processus via le gestionnaire de tâches (même si cela reste un problème).
Micheal Johnson
8

Cela dépend vraiment du degré de verrouillage de votre compte utilisateur invité. Il serait donc utile de disposer de davantage d'informations sur ce que vous souhaitez que votre compte invité puisse faire / ne pas faire. Le domaine de l'ordinateur est-il également connecté?

Cela dit, mon opinion personnelle est que tout domaine de compte invité connecté ou non devrait être fortement verrouillé afin de garantir que rien de malveillant ne puisse être fait en utilisant cette machine, en particulier si elle tombe accidentellement entre de mauvaises mains. Je commence par procéder comme suit à l'aide de la stratégie de groupe.

  1. Cachez complètement la zone de notification afin que votre utilisateur ne puisse accéder à aucune des applications exécutées en arrière-plan. Si vous souhaitez qu’ils interagissent avec NetLimiter & TeamViewer, ils peuvent toujours les lancer à partir du menu Démarrer.

    L'élément de stratégie de groupe dont vous avez besoin est sous Configuration de l'utilisateur> Modèles d'administration> Menu Démarrer et barre des tâches> Masquer la zone de notification.

  2. Accès désactivé au gestionnaire de tâches, ce qui devrait les empêcher de mettre fin au processus.

    Configuration utilisateur> Modèles d'administration> Système> Supprimer le gestionnaire de tâches

  3. Je crois que NetLimiter a la capacité de définir des autorisations pour différents utilisateurs. Explorez-les et voyez si vous pouvez supprimer la capacité du compte d'utilisateur à contrôler l'application.

C'est un bon début qui devrait limiter la plupart des utilisateurs si ceux-ci sont un peu plus avancés que vous devrez peut-être définir des stratégies de groupe plus complètes.

Voici un bon guide sur l'utilisation de GP pour limiter les stratégies à des utilisateurs spécifiques si vous en avez besoin http://www.sevenforums.com/tutorials/151415-group-policy-appol-apply-specific-user-group.html

MattP
la source
Ils voudront probablement quand même pouvoir voir l'horloge.
Micheal Johnson
L'horloge est toujours affichée lorsque vous configurez la zone de notification masquée. Ce sont des composants de système d'exploitation distincts
MattP
1

Merci à tous pour toutes les réponses détaillées, j'ai fini par utiliser certaines des suggestions du commentaire, voici ce que j'ai fait:

  • Désactivez complètement le compte invité car, pour une raison quelconque, modifier l'entrée du registre ne fonctionnera pas. Vous aurez besoin de l'autorisation de l'administrateur. Dès que vous l'obtiendrez, la modification s'appliquera également au compte administrateur (vous ne savez pas si c'est une chose courante) ou juste un bug pour moi)

  • Créez un nouvel utilisateur et procédez comme suit:

  • Désactiver l'icône de la barre d'état (dans le registre)

    • Il a fallu ajouter un gadget de contrôle du volume pour cette raison.
  • Désactiver le Panneau de configuration (dans le registre)

  • Désactiver le gestionnaire de tâches (dans le registre)

  • Refuser certaines autorisations afin qu'il ne puisse pas accéder aux emplacements de ces logiciels (ne peut pas les supprimer ou les désinstaller)

Je fais cela pour que mon frère ne puisse pas utiliser plus de 20% de la vitesse de l'internet (il n'arrêtera tout simplement pas de diffuser en continu et de torrent ...) et je pense que cela suffit pour le garder sous clé.

Merci encore!

alaslipknot
la source
Hmmm, donc cette réponse est "n'utilisez pas le compte Invité". C'est malheureusement anti-climatique.
Je dis: réintégrez Monica le
Mais pratique: vous avez plus de contrôle sur un utilisateur très limité que sur Guest.
music2myear
1
La modification du compte Invité est probablement due à la modification de la clé HKLM, qui la modifie pour tous les utilisateurs (essentiellement le paramètre "par défaut" utilisé si un paramètre par utilisateur est absent). En outre, il est probablement préférable de définir les limites de vitesse Internet au niveau du routeur, périphérique par périphérique, si possible. vous devrez changer votre adresse MAC ou accéder à la configuration du routeur pour résoudre ce problème.
wizzwizz4
5
Vous pouvez simplement configurer QoS dans votre routeur
Wayne Werner le
6
Ceci est un exemple classique du problème XY. Vous demandez une solution X lorsque vous aviez réellement besoin de Y: "comment empêcher mon frère d'utiliser plus de 20% de la bande passante"? Ce qui est bien mieux résolu au niveau du routeur que de l’ordinateur.
Floris