Czy istnieje sposób, aby zablokować użytkownikom gościa zamknięcie określonego programu?

38

Mam laptopa, a jego użytkownik prowadzi konto gościa,

Istnieją 2 programy, które uruchamiają się automatycznie po uruchomieniu systemu (NetLimiter i TeamViewer). Programy te są ukryte w zasobniku, ale użytkownik-gość może je zamknąć, jeśli chce. Czy istnieje sposób, aby temu zapobiec?

Mam pełny dostęp do laptopa, więc jeśli jest jakaś konfiguracja lub program do zainstalowania, mogę to zrobić.

alaslipknot
źródło
17
Teamviewer może być również uruchamiany jako usługa. Jeśli zostanie zainstalowany przez administratora (na koncie administratora), zwykły użytkownik nie powinien mieć możliwości jego zamknięcia. appdataworks.com/…
Ajasja
1
Ponieważ prawie nie ma sposobu, aby uniemożliwić użytkownikowi, który może otworzyć GUI narzędzia, wyjście z niego za pomocą menu, co z opcją uruchomienia zwykłego skryptu, który sprawdza, czy program nadal działa i po prostu go uruchamia ponownie, jeśli użytkownik zamknął to? Aby użytkownik mógł go zamknąć, ale po kilku sekundach uruchomi się ponownie automatycznie?
Falco,
Zaproponuj dup pytanie ma zaakceptowaną odpowiedź, ale brakuje w nim istotnych szczegółów, a dobrą odpowiedzią może być znacznie lepsze „podstawowe” rozwiązanie dla przyszłych duplikatów.
music2myear
1
@RJFalconer zrobiłem
alaslipknot

Odpowiedzi:

51

Aby zapobiec zamykaniu za pomocą menedżera zadań

Pobierz „ Eksploratora procesów ” i ustaw uprawnienia dla „Gościa” w obu programach, aby nie miały uprawnień „Zakończ”.

  1. Znajdź proces na liście eksploratora procesów i kliknij prawym przyciskiem myszy „Właściwości”
  2. Bezpieczeństwo -> Uprawnienia
  3. Wybierz „Gość” -> Edytuj.

zrzut ekranu

To nadal nie uniemożliwia im zwykłego zamknięcia programu. Musisz ukryć okno i ikonę zasobnika systemowego za pomocą programu innej firmy lub rejestru.

Aby dławić użytkownika sieci, który używa zbyt dużej przepustowości

To wydaje się być twoim rzeczywistym problemem.

Widzieć:

RJFalconer
źródło
30
Czy dotyczy to tylko konkretnej działającej instancji procesu, czy wszystkich obecnych i przyszłych?
Martin Smith
25
@MartinSmith Wpłynie to tylko na aktualnie działający.
Ben N
1
Z ciekawości (co się stanie, gdy kliknę czerwony przycisk X) próbowałem tego i wydaje się, że to nie działa dla mnie.
Pavel
11
Menu lub czerwony znak X proszą program o dobrowolne wyjście. Terminate dzieje się w Menedżerze zadań.
Zan Lynx,
@ZanLynx Tak, to znaczy, o ile mi wiadomo, wartość równa [...], ale użytkownik-gość może je zamknąć, jeśli chce. Czy istnieje sposób, aby temu zapobiec?
Pavel
35

Odpowiedź Process Explorer działa raz, ale prawdopodobnie chcesz, aby to się stało nawet po ponownym uruchomieniu komputera. Aby to zrobić, możesz użyć programu 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)
    }
}

Opiera się na odpowiedzi na przepełnienie stosu . Zasadniczo udostępniasz mu listę procesów do ochrony i użytkownika, przed którym ma się zabezpieczyć, i odpowiednio poprawia listy ACL procesów. Zapisz go jako .ps1plik (gdzieś użytkownik może czytać, ale nie pisać), a następnie umieść plik wsadowy zawierający coś takiego w Autostartie użytkownika:

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

To chroni snippingtool.exei mspaint.exe(narzędzie wycinania i farbę) przed zabiciem przez gościa.

Pamiętaj, że musi to działać po uruchomieniu tych procesów. Być może trzeba dodać sleep 10mniej więcej po Parambloku skryptu PowerShell. Po zakończeniu próba zabicia tych procesów za pomocą Menedżera zadań spowoduje:

brak dostępu

Pamiętaj też, że nie przyniesie to żadnego pożytku, jeśli konto, na którym go testujesz, jest administratorem, a ściślej ma SeDebugPrivilege.

Kliknięcie X w ich oknach lub użycie własnej funkcji zamykania aplikacji nadal spowoduje zamknięcie procesów, ponieważ wszystkie procesy mogą zdecydować o zatrzymaniu działania. Może być konieczne ukrycie obszaru powiadomień, jak opisano w innej odpowiedzi. Ponadto, ponieważ te ważne procesy są uruchamiane jako użytkownik-gość, użytkownik ten jest właścicielem obiektów procesów i będzie mógł zrezygnować z ACL z powrotem, lub może użyć PROCESS_VM_WRITEumiejętności do wypisania się na pamięci procesów i ich awarii. Można je rozwiązać, dodając odpowiednio pustą pozycję ACE OWNER RIGHTSi zmieniając 'PROCESS_TERMINATE, PROCESS_SUSPEND_RESUME, WRITE_DAC'na 'PROCESS_ALL_ACCESS'.

Odmowa dostępu do Menedżera zadań przez GPO uniemożliwiłaby użytkownikowi korzystanie z Menedżera zadań (oczywiście) i jest najprostszym rozwiązaniem, ale nic nie powstrzymuje ich przed uruchomieniem własnego programu (lub taskkill), który nie przestrzega zasad grupy. Byłoby najlepiej, gdyby procesy, które próbujesz bronić, działały jako inny użytkownik niż ten, przed którym próbujesz się bronić.

Oczywiście, jeśli gość jest gotów podjąć wszelkie trudy, aby obejść te różne „zabezpieczenia”, możesz mieć więcej problemów społecznych niż technicznych.

Ben N.
źródło
6
Myślę, że martwią się kliknięciem ikony prawym przyciskiem myszy i wybraniem opcji „wyjdź” z aplikacji, nie przerywając procesu za pośrednictwem menedżera zadań (choć nadal jest to problem).
Micheal Johnson
8

To naprawdę zależy od tego, jak bardzo chcesz zablokować swoje konto użytkownika gościa, więc przydatne będą dodatkowe informacje na temat tego, co chcesz, aby twoje konto gościa mogło robić / czego nie robić. Czy domena komputera jest również podłączona?

To powiedziawszy, moja osobista opinia jest taka, że ​​każda domena konta gościa podłączona lub nie powinna być mocno zablokowana, aby upewnić się, że nic złego nie może być zrobione przy użyciu tego komputera, szczególnie jeśli przypadkowo trafi w niepowołane ręce. Zaczynam od wykonania następujących czynności przy użyciu zasad grupy.

  1. Całkowicie ukryj obszar powiadomień, aby użytkownik nie mógł uzyskać dostępu do żadnej aplikacji działającej w tle. Jeśli potrzebujesz ich do interakcji z NetLimiter i TeamViewer, zawsze mogą je uruchomić z menu Start.

    Określony element GP, którego potrzebujesz, znajduje się w obszarze Konfiguracja użytkownika> Szablony administracyjne> Menu Start i pasek zadań> Ukryj obszar powiadomień

  2. Wyłączono dostęp do Menedżera zadań, co powinno uniemożliwić im zakończenie procesu.

    Konfiguracja użytkownika> Szablony administracyjne> System> Usuń Menedżera zadań

  3. Uważam, że NetLimiter ma możliwość ustawiania uprawnień dla różnych użytkowników. Przejrzyj je i sprawdź, czy możesz usunąć możliwość kontrolowania aplikacji przez konto użytkownika.

To dobry początek, który powinien ograniczyć większość użytkowników, jeśli jesteś nieco bardziej zaawansowany, być może będziesz musiał ustalić bardziej kompleksowe zasady grupy

Oto dobry przewodnik na temat korzystania z usług GP w celu ograniczenia polityk do konkretnych użytkowników, jeśli są potrzebne http://www.sevenforums.com/tutorials/151415-group-policy-apply-specific-user-group.html

MattP
źródło
Prawdopodobnie nadal będą chcieli zobaczyć zegar.
Micheal Johnson
Zegar jest nadal wyświetlany po skonfigurowaniu ukrytego obszaru powiadomień. Są to osobne komponenty systemu operacyjnego
MattP
1

Dziękuję wszystkim za wszystkie szczegółowe odpowiedzi, w końcu skorzystałem z niektórych sugestii w komentarzu, oto co zrobiłem:

  • Całkowicie wyłącz konto gościa, ponieważ z jakiegoś powodu edytowanie wpisu rejestru nie będzie działać, będziesz potrzebować uprawnienia administratora, a gdy go otrzymasz, modyfikacja zostanie również zastosowana do konta administratora (nie jestem pewien, czy jest to powszechna sprawa lub po prostu błąd dla mnie)

  • Utwórz nowego użytkownika i wykonaj dla niego następujące czynności:

  • Ikona Wyłącz tacę (w rejestrze)

    • Z tego powodu musiałem dodać gadżet regulacji głośności.
  • Wyłącz panel sterowania (w rejestrze)

  • Wyłącz Menedżera zadań (w rejestrze)

  • Odmów pewnych uprawnień, aby nie mógł uzyskać dostępu do lokalizacji tych programów (nie może ich usunąć ani odinstalować)

Robię to, aby mój brat nie mógł użyć więcej niż 20% prędkości internetu (po prostu nie przestanie streamować i torrentować ...) i myślę, że są one wystarczające, aby go zablokować.

Dzięki jeszcze raz!

alaslipknot
źródło
Hmmm, więc w zasadzie ta odpowiedź brzmi „nie używaj konta gościa”. To niestety jest anty-klimatyczne.
Twisty Impersonator,
Ale praktyczne: masz większą kontrolę nad bardzo ograniczonym użytkownikiem niż nad gościem.
music2myear
1
Edycja konta gościa jest prawdopodobnie spowodowana tym, że zmieniasz klucz HKLM, co zmienia go dla wszystkich użytkowników (zasadniczo modyfikujesz ustawienie „domyślne”, które jest używane, gdy nie ma ustawienia dla użytkownika). Ponadto, jeśli to możliwe, ograniczenia prędkości Internetu najlepiej ustawić na routerze w zależności od urządzenia; musisz zmienić adres MAC lub uzyskać dostęp do konfiguracji routera, aby obejść ten problem.
wizzwizz4,
5
Możesz po prostu skonfigurować QoS w routerze
Wayne Werner
6
To klasyczny przykład problemu XY. Pytasz o rozwiązanie X, kiedy naprawdę potrzebujesz Y: „jak mogę zapobiec, aby mój brat używał więcej niż 20% przepustowości”? Co znacznie lepiej rozwiązać na routerze niż na komputerze.
Floris,