Есть ли способ заблокировать гостевых пользователей от закрытия определенной программы?

38

У меня есть ноутбук, и у него есть гостевая учетная запись,

При запуске системы автоматически запускаются 2 программы (NetLimiter & TeamViewer). Эти программы скрыты в трее, но гость может закрыть их, если захочет. Есть ли способ предотвратить это?

У меня есть полный доступ к ноутбуку, поэтому, если есть какая-либо конфигурация или программа для установки, я могу это сделать.

alaslipknot
источник
17
Teamviewer также может быть запущен как сервис. Если он установлен администратором (под учетной записью администратора), обычный пользователь не сможет его закрыть. appdataworks.com/…
Аяся
1
Поскольку практически нет способа помешать пользователю, который может открыть графический интерфейс инструмента, выходить из него через меню, как насчет варианта запуска обычного сценария, который проверяет, запущена ли программа, и просто перезапускает его, если пользователь закрыл это? Таким образом, пользователь может закрыть его, но он автоматически перезагрузится через несколько секунд?
Falco
Вопрос о предложении дублирования имеет принятый ответ, но в нем отсутствуют существенные детали, и хороший ответ здесь может быть гораздо лучшим «базовым» решением для будущих дубликатов.
music2myear
1
@RJFalconer я сделал
alaslipknot

Ответы:

50

Для предотвращения закрытия через диспетчер задач

Получите « Process Explorer » и установите разрешения для «Гость» в двух программах, чтобы не иметь разрешения «Завершить».

  1. Найдите процесс в списке проводника процесса и щелкните правой кнопкой мыши «Свойства»
  2. Безопасность -> Разрешения
  3. Выберите «Гость» -> Изменить.

Скриншот

Это все еще не мешает им просто нормально закрывать программу. Вы должны будете скрыть окно и значок в системном трее, используя стороннюю программу или перебирая реестр.

Чтобы ограничить пользователя сети, используя слишком большую пропускную способность

Похоже, это ваша настоящая проблема.

Видеть:

RJFalconer
источник
30
Это относится только к конкретному работающему экземпляру процесса или ко всем настоящим и будущим?
Мартин Смит
25
@MartinSmith Это повлияет только на текущий запущенный.
Бен Н
1
Из любопытства (относительно того, что происходит, когда я нажимаю красную кнопку X), я попробовал это, и это, похоже, не работает для меня.
Павел
11
Меню или красная буква X требуют от программы добровольного выхода. Завершить то, что происходит в диспетчере задач.
Zan Lynx
@ZanLynx Да, это, насколько я понимаю, часть, в которой написано [...], но гость может закрыть их, если захочет. Есть ли способ предотвратить это?
Павел
35

Ответ Process Explorer работает один раз, но вы, вероятно, хотите, чтобы это применялось даже после перезагрузки компьютера. Для этого вы можете использовать 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)
    }
}

Это основано на этом ответе переполнения стека . По сути, вы предоставляете ему список процессов, которые нужно защитить, и пользователя, от которого нужно защищаться, и он соответствующим образом изменяет списки ACL процессов. Сохраните его как .ps1файл (где пользователь может читать, но не может писать), а затем поместите пакетный файл, содержащий что-то вроде этого, в Startup пользователя:

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

Это защищает snippingtool.exeи mspaint.exe(Снайперский инструмент и краски) от гибели гостя.

Обратите внимание, что это должно выполняться после запуска этих процессов. Возможно, вам придется добавить sleep 10или около того после Paramблока сценария PowerShell. Как только он завершится, попытка уничтожить эти процессы с помощью диспетчера задач приведет к следующему:

доступ не разрешен

Также обратите внимание, что ничего полезного не получится, если учетная запись, с которой вы тестируете учетную запись, является администратором или, точнее, имеет SeDebugPrivilege.

Нажатие X на их окнах или использование собственной функции закрытия приложений по-прежнему приводит к завершению процессов, поскольку все процессы могут свободно останавливаться. Возможно, вам придется скрыть область уведомлений, как описано в другом ответе. Кроме того, поскольку эти важные процессы выполняются в качестве гостевого пользователя, этот пользователь является владельцем объектов процесса и в любом случае сможет отрегулировать ACL-список или использовать PROCESS_VM_WRITEвозможности для перебора памяти процессов и их сбоя. Те , может быть решена путем добавления пустой ACE для OWNER RIGHTSи изменения , 'PROCESS_TERMINATE, PROCESS_SUSPEND_RESUME, WRITE_DAC'чтобы 'PROCESS_ALL_ACCESS', соответственно.

Отказ в доступе к диспетчеру задач через объект групповой политики помешает пользователю использовать диспетчер задач (очевидно) и является наиболее простым решением, но ничто не мешает им запускать собственную программу (или taskkill), которая не подчиняется групповой политике. Было бы лучше, если бы процессы, которые вы пытаетесь защитить, запускались от имени другого пользователя, а не от того, от которого вы пытаетесь защищаться.

Конечно, если ваш гость готов пойти на все эти неприятности, чтобы обойти эти различные «средства защиты», у вас может быть больше социальной проблемы, чем технической.

Бен Н
источник
6
Я думаю, что они беспокоятся о том, чтобы щелкнуть правой кнопкой мыши по значку и выбрать опцию «выход» из приложения, не прерывая процесс через диспетчер задач (хотя это все еще проблема).
Майкл Джонсон
8

Это действительно зависит от того, насколько сильно вы хотите заблокировать гостевую учетную запись пользователя, поэтому вам может пригодиться дополнительная информация о том, что вы хотите, чтобы ваша гостевая учетная запись могла делать / не делать. Также подключен ли компьютерный домен?

Тем не менее, по моему личному мнению, любой домен гостевой учетной записи, подключенный или не подключенный, должен быть жестко заблокирован, чтобы на этом компьютере нельзя было совершить никаких злонамеренных действий, особенно если он случайно попадет в чужие руки. Я начинаю с того, что делаю следующее, используя групповую политику.

  1. Полностью скройте область уведомлений, чтобы ваш пользователь не мог получить доступ ни к одному из приложений, работающих в фоновом режиме. Если вам нужно, чтобы они взаимодействовали с NetLimiter & TeamViewer, они всегда могут запустить их из меню «Пуск».

    Конкретный элемент GP, который вам нужен, находится в разделе «Конфигурация пользователя»> «Административные шаблоны»> «Пуск» и «Панель задач»> «Скрыть область уведомлений».

  2. Отключен доступ к диспетчеру задач, который должен помешать им завершить процесс.

    Конфигурация пользователя> Административные шаблоны> Система> Удалить диспетчер задач

  3. Я считаю, что NetLimiter имеет возможность устанавливать разрешения для разных пользователей. Изучите их и посмотрите, сможете ли вы удалить возможность учетной записи пользователя контролировать приложение.

Это хорошее начало, которое должно ограничивать большинство пользователей, если вы немного более продвинуты, чем вам, возможно, придется установить более комплексные групповые политики.

Вот хорошее руководство по использованию GP для ограничения политик для определенных пользователей, если вам это нужно http://www.sevenforums.com/tutorials/151415-group-policy-apply-specific-user-group.html

MattP
источник
Вероятно, они все еще захотят увидеть часы.
Майкл Джонсон
Часы по-прежнему отображаются при настройке скрыть область уведомлений. Это отдельные компоненты ОС
MattP
1

Спасибо всем за подробные ответы, в итоге я воспользовался некоторыми предложениями в комментарии, вот что я сделал:

  • Полностью отключите гостевую учетную запись, потому что по какой-то причине редактирование записи реестра для нее не будет работать, вам понадобится разрешение администратора, и как только вы его получите, модификация будет применена и к учетной записи администратора (не уверен, что это обычное дело или просто баг для меня)

  • Создайте нового пользователя и сделайте для него следующее:

  • Отключить значок в трее (в реестре)

    • Пришлось добавить гаджет управления громкостью из-за этого.
  • Отключить панель управления (в реестре)

  • Отключить диспетчер задач (в реестре)

  • Запретить определенные разрешения, чтобы он не мог получить доступ к расположению этих программ (не может удалить их или удалить их)

Я делаю это так, чтобы мой брат не мог использовать более 20% скорости интернета (он просто не перестанет транслировать и транслировать ...), и я думаю, этого достаточно, чтобы держать его взаперти.

Еще раз спасибо!

alaslipknot
источник
Хммм, так что в основном это ответ "не используйте гостевую учетную запись". Это, к сожалению, анти-климатическое.
Я говорю Восстановить Монику
Но практично: вы получаете больше контроля над очень ограниченным пользователем, чем над гостем.
music2myear
1
Вероятно, изменение учетной записи «Гость» происходит из-за того, что вы меняете ключ HKLM, который меняет его для всех пользователей (по сути, изменяя параметр «по умолчанию», который используется, если параметр для пользователя отсутствует). Кроме того, ограничения скорости интернета, вероятно, лучше всего устанавливать на маршрутизаторе для каждого устройства, если это возможно; вам нужно изменить свой MAC-адрес или получить доступ к конфигурации маршрутизатора, чтобы обойти это.
wizzwizz4
5
Вы можете просто настроить QoS в своем роутере
Уэйн Вернер
6
Это классический пример проблемы XY. Вы спрашиваете решение X, когда вам действительно нужен Y: «Как я могу помешать моему брату использовать более 20% пропускной способности»? Что гораздо лучше решается на маршрутизаторе, чем на компьютере.
Флорис