¿Hay alguna manera de impedir que los usuarios invitados cierren un programa determinado?

38

Tengo una computadora portátil y su usuario está ejecutando una cuenta de invitado,

Hay 2 programas que se inician automáticamente cuando se inicia el sistema (NetLimiter y TeamViewer). Estos programas están ocultos en la bandeja, pero el usuario invitado puede cerrarlos si lo desea. Hay alguna manera de prevenir eso?

Tengo acceso completo a la computadora portátil, así que si hay alguna configuración o programa para instalar, puedo hacerlo.

alaslipknot
fuente
17
Teamviewer también se puede ejecutar como un servicio. Si el administrador lo instala (bajo la cuenta de administrador), un usuario normal no debería poder cerrarlo. appdataworks.com/…
Ajasja
1
Dado que casi no hay forma de evitar que un usuario que puede abrir la GUI de la herramienta salga a través del menú, ¿qué pasa con la opción de ejecutar un script regular que verifica si el programa aún se está ejecutando y simplemente lo reinicia, si el usuario lo ha cerrado? ¿Entonces el usuario podría cerrarlo, pero se reiniciaría automáticamente después de unos segundos?
Falco
Sugerir pregunta duplicada tiene una respuesta aceptada, pero carece de detalles sustanciales, y una buena respuesta aquí podría ser una solución "base" mucho mejor para futuros duplicados.
music2myear
1
@RJFalconer lo hice
alaslipknot

Respuestas:

50

Para evitar el cierre a través del administrador de tareas

Obtenga el " Explorador de procesos " y establezca los permisos para "Invitado" en los dos programas para que no tengan permisos "Terminar".

  1. Encuentre el proceso en la lista del explorador de procesos y haga clic con el botón derecho en "Propiedades"
  2. Seguridad -> Permisos
  3. Seleccione "Invitado" -> Editar.

captura de pantalla

Esto todavía no les impide simplemente cerrar el programa normalmente. Tendrá que ocultar la ventana y el icono de la bandeja del sistema utilizando un programa de terceros o violín de registro.

Para estrangular a un usuario de la red usando demasiado ancho de banda

Este parece ser tu problema real.

Ver:

RJFalconer
fuente
30
¿Esto solo se aplica a una instancia específica del proceso o a todas las presentes y futuras?
Martin Smith
25
@MartinSmith Esto solo afectará al que se está ejecutando actualmente.
Ben N
1
Por curiosidad (en cuanto a lo que sucede cuando hago clic en el botón X rojo) he intentado esto y no parece funcionar para mí.
Pavel
11
El menú o la X roja le piden al programa que salga voluntariamente. Terminar es lo que sucede en el Administrador de tareas.
Zan Lynx
@ZanLynx Sí, eso es, según tengo entendido, el par que dice [...] pero el usuario invitado puede cerrarlos si lo desea. Hay alguna manera de prevenir eso?
Pavel
35

La respuesta de Process Explorer funciona una vez, pero probablemente desee que esto se aplique incluso después de reiniciar la computadora. Para hacer eso, puede usar 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)
    }
}

Se basa en esta respuesta de desbordamiento de pila . Básicamente, usted le proporciona la lista de procesos para proteger y el usuario para proteger, y manipula las ACL de los procesos de manera adecuada. Guárdelo como un .ps1archivo (en algún lugar donde el usuario pueda leer pero no escribir), luego coloque un archivo por lotes que contenga algo como esto en el Inicio del usuario:

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

Eso protege snippingtool.exey mspaint.exe(la herramienta de corte y pintura) de ser asesinado por el invitado.

Tenga en cuenta que esto tiene que ejecutarse después de que comiencen esos procesos. Es posible que deba agregar más sleep 10o menos después del Parambloque del script de PowerShell. Una vez que termine, tratar de matar esos procesos con el Administrador de tareas causará esto:

acceso denegado

También tenga en cuenta que no hará nada útil si la cuenta con la que lo prueba es un administrador, o más precisamente lo tiene SeDebugPrivilege.

Hacer clic en la X en sus ventanas o usar la funcionalidad de cierre de las aplicaciones seguirá haciendo que los procesos salgan, ya que todos los procesos son libres de decidir dejar de ejecutarse. Es posible que deba ocultar el área de notificación, como se describe en otra respuesta. Además, dado que estos procesos importantes se ejecutan como el usuario invitado, ese usuario es el propietario de los objetos del proceso y podrá ajustar la ACL de todos modos, o podría usar las PROCESS_VM_WRITEhabilidades para garabatear sobre la memoria de los procesos y bloquearlos. Esos podrían resolverse agregando un ACE en blanco para OWNER RIGHTSy cambiando 'PROCESS_TERMINATE, PROCESS_SUSPEND_RESUME, WRITE_DAC'a 'PROCESS_ALL_ACCESS', respectivamente.

Negar el acceso al Administrador de tareas a través de GPO impediría que el usuario use el Administrador de tareas (obviamente) y es la solución más sencilla, pero no hay nada que les impida ejecutar su propio programa (o taskkill) que no obedezca a la Política de grupo. Sería mejor si los procesos que intenta defender se ejecutan como un usuario diferente del que está tratando de defender.

Por supuesto, si su invitado está dispuesto a tomarse la molestia de eludir estas diversas "protecciones", es posible que tenga más problemas sociales que técnicos.

Ben N
fuente
66
Creo que les preocupa hacer clic con el botón derecho en el ícono y elegir la opción "salir" de la aplicación, no terminar el proceso a través del administrador de tareas (aunque eso sigue siendo un problema).
Micheal Johnson
8

Esto realmente depende de cuánto desea bloquear su cuenta de usuario invitado, por lo que sería útil tener más información sobre lo que desea que su cuenta de invitado pueda hacer / no hacer. ¿También está conectado el dominio de la computadora?

Dicho esto, mi opinión personal es que cualquier dominio de cuenta de invitado conectado o no debe bloquearse en gran medida para garantizar que no se pueda hacer nada malicioso con esa máquina, especialmente si accidentalmente termina en las manos equivocadas. Comienzo haciendo lo siguiente usando la política de grupo.

  1. Oculte el área de notificación por completo para que su usuario no pueda acceder a ninguna de las aplicaciones que se ejecutan en segundo plano. Si necesita que interactúen con NetLimiter y TeamViewer, siempre pueden iniciarlos desde el menú de inicio.

    El elemento GP específico que necesita está en Configuración de usuario> Plantillas administrativas> Menú Inicio y barra de tareas> Ocultar el área de notificación

  2. Acceso deshabilitado al Administrador de tareas que debería evitar que terminen el proceso.

    Configuración de usuario> Plantillas administrativas> Sistema> Eliminar administrador de tareas

  3. Creo que NetLimiter tiene la capacidad de establecer permisos para diferentes usuarios. Explore estos y vea si puede eliminar la capacidad de la cuenta de usuario para controlar la aplicación.

Es un buen comienzo que debería limitar a la mayoría de los usuarios si los usuarios son un poco más avanzados, entonces es posible que tenga que establecer algunas políticas de grupo más completas

Aquí hay una buena guía para usar GP para limitar las políticas a usuarios específicos si lo necesita http://www.sevenforums.com/tutorials/151415-group-policy-apply-specific-user-group.html

MattP
fuente
Sin embargo, probablemente aún quieran poder ver el reloj.
Micheal Johnson
El reloj todavía se muestra cuando configura el área de notificación oculta. Son componentes separados del sistema operativo
MattP
1

Gracias a todos por todas las respuestas detalladas, terminé usando algunas de las sugerencias en el comentario, esto es lo que hice:

  • Deshabilite la cuenta de invitado por completo porque, por alguna razón, editar la entrada del registro para que no funcione, necesitará permiso de administrador, y una vez que lo obtenga, la modificación se aplicará también a la cuenta de administrador (no estoy seguro de si esto es algo común) o solo un error para mí)

  • Cree un nuevo usuario y haga lo siguiente para ello:

  • Desactivar el icono de la bandeja (en el registro)

    • Tuve que agregar un dispositivo de control de volumen debido a esto.
  • Deshabilitar panel de control (en el registro)

  • Deshabilitar el Administrador de tareas (en el registro)

  • Denegar ciertos permisos para que no pueda acceder a las ubicaciones de estos softwares (no puede eliminarlos ni desinstalarlos)

Estoy haciendo esto para que mi hermano no pueda usar más del 20% de la velocidad de Internet (simplemente no dejará de transmitir y usar torrents ...) y creo que estos son suficientes para mantenerlo bloqueado.

¡Gracias de nuevo!

alaslipknot
fuente
Hmmm, así que básicamente esta respuesta es "no uses la cuenta de invitado". Eso es tristemente anti-climático.
Digo reinstalar a Mónica el
Pero práctico: obtienes más control sobre un usuario muy limitado que sobre Guest.
music2myear
1
La edición en la cuenta de Invitado probablemente se deba a que está cambiando la clave HKLM, que lo cambia para todos los usuarios (esencialmente modificando la configuración "predeterminada" que se usa si no existe una configuración por usuario). Además, los límites de velocidad de Internet probablemente se establezcan mejor en el enrutador por dispositivo, si es posible; necesitará cambiar su dirección MAC u obtener acceso a la configuración del enrutador para evitarlo.
wizzwizz4
55
Podría configurar QoS en su enrutador
Wayne Werner
66
Este es un ejemplo clásico del problema XY. Pide una solución X cuando realmente necesita Y: "¿cómo evito que mi hermano use más del 20% del ancho de banda"? Lo cual está mucho mejor resuelto en el enrutador que en la computadora.
Floris