Existe uma maneira de impedir que usuários convidados fechem um determinado programa?


38

Eu tenho um laptop e seu usuário está executando uma conta de convidado,

Existem 2 programas que iniciam automaticamente quando o sistema é iniciado (NetLimiter e TeamViewer). Esses programas estão ocultos na bandeja, mas o usuário convidado pode fechá-los se quiser. Existe uma maneira de evitar isso?

Eu tenho acesso total ao laptop, portanto, se houver alguma configuração ou programa para instalar, eu posso fazê-lo.



17
O Teamviewer também pode ser executado como um serviço. Se instalado pelo administrador (na conta do administrador), um usuário normal não poderá fechá-lo. appdataworks.com/...
Ajasja

1
Como quase não há maneira de impedir que um usuário que possa abrir a GUI da ferramenta saia do menu, que tal a opção de executar um script regular que verifica se o programa ainda está em execução e apenas o reinicia, se o usuário fechou? Para que o usuário pudesse fechá-lo, mas ele seria reiniciado automaticamente após alguns segundos?
Falco

A pergunta Suggest dup tem uma resposta aceita, mas faltam detalhes substanciais, e uma boa resposta aqui pode ser uma solução "base" muito melhor para futuras duplicatas.
music2myear

1
@RJFalconer eu fiz
alaslipknot

Respostas:


50

Para impedir o fechamento via gerenciador de tarefas

Obtenha o " Process explorer " e defina as permissões para "Convidado" nos dois programas para não ter permissões "Terminar".

  1. Encontre processo na lista do explorador de processos e clique com o botão direito em "Propriedades"
  2. Segurança -> Permissões
  3. Selecione "Convidado" -> Editar.

captura de tela

Isso ainda não os impede de fechar o programa normalmente. Você terá que ocultar a janela e o ícone da bandeja do sistema usando um programa de terceiros ou mexer no registro.

Para limitar um usuário de rede usando muita largura de banda

Este parece ser o seu problema real.

Vejo:


30
Isso se aplica apenas a uma instância específica do processo em execução ou a todas as presentes e futuras?
Martin Smith

25
@MartinSmith Isso afetará apenas o que está sendo executado no momento.
Ben N

1
Por curiosidade (sobre o que acontece quando clico no botão X vermelho), tentei isso e parece que não funciona para mim.
Pavel

11
O menu ou o X vermelho solicitam que o programa saia voluntariamente. Terminar é o que acontece no Gerenciador de Tarefas.
Zan Lynx

@ZanLynx Sim, isto é, na minha opinião, o par que diz [...] mas o usuário convidado pode fechá-lo se quiser. Existe uma maneira de evitar isso?
Pavel

35

A resposta do Process Explorer funciona uma vez, mas você provavelmente deseja que isso se aplique mesmo após a reinicialização do computador. Para fazer isso, você pode usar o 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)
    }
}

É baseado nesta resposta de estouro de pilha . Basicamente, você fornece a lista de processos a serem protegidos e o usuário a proteger, e ele toca as ACLs dos processos de maneira apropriada. Salve-o como um .ps1arquivo (em algum lugar que o usuário possa ler, mas não grave) e, em seguida, coloque um arquivo em lotes contendo algo parecido com isso na inicialização do usuário:

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

Isso protege snippingtool.exee mspaint.exe(a Ferramenta de Recorte e a Pintura) de serem mortos pelo Convidado.

Observe que isso precisa ser executado após o início desses processos. Pode ser necessário adicionar um valor sleep 10após o Parambloco do script do PowerShell. Quando terminar, tentar matar esses processos com o Gerenciador de tarefas causará o seguinte:

acesso negado

Observe também que isso não será útil se a conta com a qual você a testar for um administrador ou mais precisamente SeDebugPrivilege.

Clicar no X em suas janelas ou usar a funcionalidade de fechamento dos aplicativos ainda fará com que os processos saiam, pois todos os processos são livres para decidir parar de executar. Pode ser necessário ocultar a área de notificação, conforme descrito em outra resposta. Além disso, como esses processos importantes são executados como usuário convidado, esse usuário é o proprietário dos objetos do processo e poderá ajustar a ACL de qualquer maneira, ou poderá usar as PROCESS_VM_WRITEhabilidades para rabiscar a memória dos processos e travá-los. Para solucionar esses problemas, adicione um ACE em branco para OWNER RIGHTSe altere 'PROCESS_TERMINATE, PROCESS_SUSPEND_RESUME, WRITE_DAC'para 'PROCESS_ALL_ACCESS', respectivamente.

Negar o acesso ao Gerenciador de Tarefas via GPO impediria o usuário de usar o Gerenciador de Tarefas (obviamente) e é a solução mais direta, mas não há nada que impeça a execução de seu próprio programa (ou taskkill) que não obedeça à Diretiva de Grupo. Seria melhor se os processos que você está tentando defender funcionassem como um usuário diferente daquele que você está tentando defender.

Obviamente, se o seu convidado estiver disposto a fazer todo esse trabalho para contornar essas várias "proteções", você pode ter mais um problema social do que técnico.


6
Acho que eles estão preocupados em clicar com o botão direito do mouse no ícone e escolher a opção "encerrar" do aplicativo, não finalizando o processo através do gerenciador de tarefas (embora isso ainda seja um problema).
precisa

8

Isso realmente depende de quanto você deseja bloquear sua conta de usuário convidado, portanto mais informações sobre o que você deseja que sua conta de convidado possa / não faça seriam úteis. Também o domínio do computador está conectado?

Dito isso, minha opinião pessoal é que qualquer domínio de conta de convidado conectado ou não deve ser fortemente bloqueado para garantir que nada de malicioso possa ser feito usando essa máquina, especialmente se ela acabar acidentalmente em mãos erradas. Começo fazendo o seguinte usando a diretiva de grupo.

  1. Oculte a área de notificação completamente para que seu usuário não possa acessar nenhum dos aplicativos em execução em segundo plano. Se você precisar deles para interagir com o NetLimiter e o TeamViewer, eles sempre poderão iniciá-los no menu Iniciar.

    O item GP específico que você precisa está em Configuração do usuário> Modelos administrativos> Menu Iniciar e Barra de tarefas> Ocultar a área de notificação

  2. Acesso desabilitado ao Gerenciador de tarefas, o que deve impedir que eles encerrem o processo.

    Configuração do usuário> Modelos Administrativos> Sistema> Remover Gerenciador de Tarefas

  3. Acredito que o NetLimiter tem a capacidade de definir permissões para diferentes usuários. Explore-os e veja se você pode remover a capacidade da conta de usuário de controlar o aplicativo.

Esse é um bom começo que deve limitar a maioria dos usuários se você for um pouco mais avançado, talvez seja necessário definir algumas políticas de grupo mais abrangentes

Aqui está um bom guia para usar o GP para limitar políticas para usuários específicos, se você precisar http://www.sevenforums.com/tutorials/151415-group-policy-apply-specific-user-group.html


Eles provavelmente ainda querem poder ver o relógio.
precisa

O relógio ainda é mostrado quando você configura a área de notificação oculta. Eles são componentes separados do SO
MattP

1

Obrigado a todos por todas as respostas detalhadas, acabei usando algumas das sugestões no comentário, eis o que fiz:

  • Desabilite a conta de convidado completamente porque, por algum motivo, a edição da entrada do registro não funcionará, você precisará de permissão de administrador e, assim que a conseguir, a modificação também será aplicada à conta de administrador (não tenho certeza se isso é algo comum ou apenas um bug para mim)

  • Crie um novo usuário e faça o seguinte:

  • Ícone Desativar bandeja (no registro)

    • Tinha que adicionar um gadget de controle de volume por causa disso.
  • Desabilitar o Painel de Controle (no registro)

  • Desativar o Gerenciador de tarefas (no registro)

  • Negar determinadas permissões para que ele não possa acessar os locais desses softwares (não pode removê-los ou desinstalá-los)

Estou fazendo isso para que meu irmão não possa usar mais de 20% da velocidade da internet (ele simplesmente não para de transmitir e torrent ...) e acho que isso é suficiente para mantê-lo bloqueado.

Obrigado novamente!


Hmmm, então basicamente essa resposta é "não use a conta de convidado". Infelizmente isso é anti-climático.
Eu digo Restabelecer Monica

Mas prático: você obtém mais controle sobre um usuário muito limitado do que sobre o Guest.
music2myear

1
A edição da conta Convidado provavelmente ocorre porque você está alterando a chave HKLM, o que a altera para todos os usuários (essencialmente modificando a configuração "padrão" usada se uma configuração por usuário estiver ausente). Além disso, os limites de velocidade da Internet provavelmente são os melhores definidos no roteador por dispositivo, se possível; você precisará alterar seu endereço MAC ou obter acesso à configuração do roteador para contornar isso.
precisa saber é o seguinte

5
Você poderia apenas QoS configuração em seu roteador
Wayne Werner

6
Este é um exemplo clássico do problema XY. Você pede uma solução X quando realmente precisa de Y: "como evito que meu irmão use mais de 20% da largura de banda" ?. O que é muito melhor resolvido no roteador do que no computador.
Floris 23/01
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.