C'è un modo per impedire agli utenti ospiti di chiudere un determinato programma?


38

Ho un laptop e il suo utente sta eseguendo un account ospite,

Esistono 2 programmi che si avviano automaticamente all'avvio del sistema (NetLimiter e TeamViewer). Questi programmi sono nascosti nel vassoio, ma l'utente ospite può chiuderli se lo desidera. C'è un modo per impedirlo?

Ho pieno accesso al laptop, quindi se c'è qualche configurazione o programma da installare posso farlo.



17
Teamviewer può anche essere eseguito come servizio. Se installato dall'amministratore (sotto l'account amministratore), un utente normale non dovrebbe essere in grado di chiuderlo. appdataworks.com/…
Ajasja

1
Poiché non esiste quasi alcun modo per impedire a un utente che può aprire la GUI dello strumento di uscire tramite il menu, che dire dell'opzione per eseguire uno script regolare che controlla se il programma è ancora in esecuzione e lo riavvia, se l'utente l'ha chiuso? Quindi l'utente potrebbe chiuderlo, ma si riavvierebbe automaticamente dopo alcuni secondi?
Falco,

Suggerisci una domanda duplice ha una risposta accettata, ma manca di dettagli sostanziali e una buona risposta qui potrebbe essere una soluzione "base" molto migliore per i duplicati futuri.
music2myear,

1
@RJFalconer l' ho fatto
alaslipknot il

Risposte:


50

Per impedire la chiusura tramite Task Manager

Ottieni " Process explorer " e imposta le autorizzazioni per "Guest" sui due programmi in modo che non dispongano delle autorizzazioni "Termina".

  1. Trova il processo nell'elenco di Esplora processi e fai clic con il pulsante destro del mouse su "Proprietà"
  2. Sicurezza -> Autorizzazioni
  3. Seleziona "Ospite" -> Modifica.

immagine dello schermo

Ciò non impedisce loro di chiudere normalmente il programma. Dovrai nascondere la finestra e l'icona della barra delle applicazioni utilizzando un programma di terze parti o il registro del sistema.

Per limitare un utente della rete utilizzando troppa larghezza di banda

Questo sembra essere il tuo vero problema.

Vedere:


30
Questo vale solo per una specifica istanza in esecuzione del processo o per tutte quelle presenti e future?
Martin Smith,

25
@MartinSmith Questo influenzerà solo quello attualmente in esecuzione.
Ben N

1
Per curiosità (su cosa succede quando faccio clic sul pulsante X rosso) ho provato questo e non sembra funzionare per me.
Pavel,

11
Il menu o la X rossa chiedono al programma di uscire volontariamente. Terminare è ciò che accade in Task Manager.
Zan Lynx,

@ZanLynx Sì, vale a dire, alla mia comprensione, la parità che dice [...] ma l'utente ospite può chiuderli se lo desidera. C'è un modo per impedirlo?
Pavel,

35

La risposta di Process Explorer funziona una volta, ma probabilmente vuoi applicarla anche dopo il riavvio del computer. Per fare ciò, puoi usare 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)
    }
}

Si basa su questa risposta Stack Overflow . Fondamentalmente, gli fornisci l'elenco dei processi da proteggere e l'utente da proteggere, e confonde gli ACL dei processi in modo appropriato. Salvalo come .ps1file (da qualche parte l'utente può leggere ma non scrivere), quindi inserisci un file batch contenente qualcosa di simile all'avvio dell'utente:

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

Ciò protegge snippingtool.exee mspaint.exe(lo strumento di cattura e la pittura) dall'essere ucciso dall'ospite.

Si noti che questo deve essere eseguito dopo l' avvio di tali processi. Potrebbe essere necessario aggiungere circa una volta sleep 10dopo il Paramblocco dello script PowerShell. Una volta terminato, provare a uccidere quei processi con Task Manager causerà questo:

accesso negato

Nota inoltre che non farà nulla di utile se l'account con cui lo collaudi è un amministratore, o più precisamente lo ha SeDebugPrivilege.

Facendo clic sulla X nelle finestre o utilizzando la funzionalità di chiusura delle applicazioni, i processi continueranno comunque a uscire, poiché tutti i processi sono liberi di decidere di interrompere l'esecuzione. Potrebbe essere necessario nascondere l'area di notifica, come descritto in un'altra risposta. Inoltre, poiché questi importanti processi vengono eseguiti come utenti guest, l'utente è il proprietario degli oggetti di processo e sarà in grado di regolare l'ACL in ogni caso, oppure potrebbe utilizzare le PROCESS_VM_WRITEabilità per scarabocchiare sulla memoria dei processi e bloccarli. Quelli potrebbero essere risolti aggiungendo un ACE vuoto per OWNER RIGHTSe cambiando 'PROCESS_TERMINATE, PROCESS_SUSPEND_RESUME, WRITE_DAC'a 'PROCESS_ALL_ACCESS', rispettivamente.

Negare l'accesso a Task Manager tramite GPO impedirebbe all'utente di utilizzare Task Manager (ovviamente) ed è la soluzione più semplice, ma non c'è nulla che impedisce loro di eseguire il proprio programma (o taskkill) che non obbedisce a Criteri di gruppo. Sarebbe meglio se i processi che stai cercando di difendere funzionassero come un utente diverso da quello contro cui stai cercando di difenderti.

Naturalmente, se il tuo ospite è disposto a fare tutto il possibile per aggirare queste varie "protezioni", potresti avere più di un problema sociale che tecnico.


6
Penso che siano preoccupati di fare clic con il tasto destro sull'icona e scegliere l'opzione "esci" dell'applicazione, senza interrompere il processo tramite il task manager (anche se questo è ancora un problema).
Micheal Johnson,

8

Questo dipende davvero da quanto vuoi bloccare il tuo account utente ospite in modo che qualche informazione in più su ciò che vuoi che il tuo account ospite sia in grado di fare / non fare sarebbe utile. Inoltre è collegato il dominio del computer?

Detto questo, la mia opinione personale è che qualsiasi dominio dell'account ospite collegato o meno dovrebbe essere pesantemente bloccato per garantire che non si possa fare nulla di dannoso utilizzando quella macchina, soprattutto se accidentalmente finisce nelle mani sbagliate. Comincio facendo quanto segue usando i criteri di gruppo.

  1. Nascondi completamente l'area di notifica in modo che l'utente non possa accedere a nessuna delle applicazioni in esecuzione in background. Se hai bisogno che interagiscano con NetLimiter e TeamViewer, possono sempre avviarli dal menu Start.

    L'elemento GP specifico necessario è in Configurazione utente> Modelli amministrativi> Menu Start e barra delle applicazioni> Nascondi l'area di notifica

  2. Accesso disabilitato a Task Manager che dovrebbe impedire loro di terminare il processo.

    Configurazione utente> Modelli amministrativi> Sistema> Rimuovi Task Manager

  3. Credo che NetLimiter abbia la possibilità di impostare autorizzazioni per diversi utenti. Esplora questi e vedi se riesci a rimuovere la capacità dell'account utente di controllare l'applicazione.

È un buon inizio che dovrebbe limitare la maggior parte degli utenti se gli utenti sono un po 'più avanzati, quindi potrebbe essere necessario impostare alcuni criteri di gruppo più completi

Ecco una buona guida per usare GP per limitare le politiche a utenti specifici se ne hai bisogno http://www.sevenforums.com/tutorials/151415-group-policy-apply-specific-user-group.html


Probabilmente vorranno comunque riuscire a vedere l'orologio.
Micheal Johnson,

L'orologio viene ancora visualizzato quando si configura l'area di notifica nascosta. Sono componenti del sistema operativo separati
MattP

1

Grazie a tutti per tutte le risposte dettagliate, ho finito per usare alcuni dei suggerimenti nel commento, ecco cosa ho fatto:

  • Disabilita completamente l'account guest perché per qualche motivo la modifica della voce del registro di sistema non funzionerà, avrai bisogno dell'autorizzazione dell'amministratore e, una volta ottenuta, la modifica verrà applicata anche per l'account Admin (non sono sicuro se questa è una cosa comune o solo un bug per me)

  • Crea un nuovo utente e procedi come segue:

  • Icona Disabilita vassoio (nel registro)

    • Ho dovuto aggiungere un gadget di controllo del volume per questo motivo.
  • Disabilita pannello di controllo (nel registro)

  • Disabilita Task Manager (nel registro)

  • Negare determinate autorizzazioni in modo che non possa accedere alle posizioni di questi software (non è possibile rimuoverli o disinstallarli)

Lo sto facendo in modo che mio fratello non possa usare più del 20% della velocità di Internet (semplicemente non smetterà di streaming e torrenting ...) e penso che questi siano sufficienti per tenerlo bloccato.

Grazie ancora!


Hmmm, quindi sostanzialmente questa risposta è "non usare l'account guest". È tristemente anti-climatico.
Dico Reintegrare Monica il

Ma pratico: ottieni un maggiore controllo su un utente molto limitato rispetto a quello su Guest.
music2myear,

1
La modifica all'account Ospite è probabilmente dovuta al fatto che si sta modificando la chiave HKLM, che la modifica per tutti gli utenti (essenzialmente modificando l'impostazione "predefinita" che viene utilizzata in caso di assenza di un'impostazione per utente). Inoltre, se possibile, è preferibile impostare i limiti di velocità di Internet sul router per dispositivo; dovrai cambiare il tuo indirizzo MAC o accedere alla configurazione del router per aggirare il problema.
wizzwizz4,

5
Potresti semplicemente installare QoS nel tuo router
Wayne Werner il

6
Questo è un classico esempio del problema XY. Chiedete una soluzione X quando avete davvero bisogno di Y: "come posso impedire a mio fratello di utilizzare più del 20% della larghezza di banda" ?. Che è molto meglio risolto sul router che sul computer.
Floris,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.