Чи є спосіб заблокувати гостьових користувачів закрити певну програму?


38

У мене ноутбук, і його користувач працює в гостьовому обліковому записі,

Є дві програми, які запускаються автоматично при запуску системи (NetLimiter & TeamViewer). Ці програми приховані в лотку, але гостьовий користувач може закрити їх, якщо захоче. Чи є спосіб запобігти цьому?

У мене є повний доступ до ноутбука, тому якщо є якась конфігурація або програма для встановлення, я можу це зробити.



17
Teamviewer також може працювати як сервіс. Якщо встановлений адміністратором (під обліковим записом адміністратора), звичайний користувач не зможе його закрити. appdataworks.com/…
Ajasja

1
Оскільки майже немає способу завадити користувачеві, який може відкрити графічний інтерфейс інструменту, вийти з нього через меню, що робити з можливістю запуску звичайного скрипту, який перевіряє, чи програма все ще працює, і просто перезавантажує її, якщо користувач закрив його? Так користувач міг би закрити його, але він автоматично перезапуститься через кілька секунд?
Фалько

Запропонувати запитання щодо дублювання є прийнятою відповіддю, але він не має суттєвих деталей, і хороша відповідь тут може бути набагато кращим "базовим" рішенням для майбутніх дублікатів.
music2myear

1
@RJFalconer я зробив
alaslipknot

Відповіді:


51

Щоб запобігти закриттю через диспетчер завдань

Отримайте " Провідник процесів " та встановіть для двох програм права "Guest", щоб вони не мали дозволу "Скасувати".

  1. Знайдіть процес у списку дослідників процесів та клацніть правою кнопкою миші «Властивості»
  2. Безпека -> Дозволи
  3. Виберіть "Гість" -> Редагувати.

скріншот

Це все ще не заважає їм нормально закривати програму. Вам потрібно буде приховати піктограму вікна та системного лотка за допомогою сторонньої програми чи реєстру.

Щоб придушити користувача мережі, використовуючи занадто велику пропускну здатність

Це здається вашою реальною проблемою.

Подивитися:


30
Це стосується лише конкретного запущеного примірника процесу або всіх теперішніх та майбутніх?
Мартін Сміт

25
@MartinSmith Це вплине лише на поточну версію.
Бен Н

1
З цікавості (щодо того, що відбувається, коли я натискаю червону кнопку X), я спробував це, і, здається, це не працює для мене.
Павло

11
Меню або червоний X просять програму добровільно вийти. Закінчити - це те, що відбувається в диспетчері завдань.
Зан Лінкс

@ZanLynx Так, на моє розуміння, параметр, який говорить [...], але гість-користувач може закрити їх, якщо захоче. Чи є спосіб запобігти цьому?
Павло

35

Відповідь Провідника процесу працює один раз, але ви, мабуть, хочете, щоб це застосувалося навіть після перезавантаження комп'ютера. Для цього ви можете використовувати 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файл (десь користувач може читати, а не писати), а потім помістіть пакетний файл, що містить щось подібне, у запуск користувача:

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', відповідно.

Заборона доступу до диспетчера завдань через GPO заважає користувачеві використовувати диспетчер завдань (очевидно) і є найбільш простим рішенням, але ніщо не заважає їм запускати власну програму (або 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

1

Дякую всім за всі детальні відповіді, я в кінцевому підсумку використовував деякі пропозиції в коментарі, ось що я зробив:

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

  • Створіть нового користувача та зробіть для нього наступне:

  • Вимкнути значок лотка (у реєстрі)

    • Через це довелося додати гаджет регулювання гучності.
  • Вимкнути панель управління (у реєстрі)

  • Вимкнути диспетчер завдань (у реєстрі)

  • Заборонити певні дозволи, щоб він не міг отримати доступ до цих програм (не може їх видалити чи видалити)

Я роблю це так, що мій брат не може використовувати більше 20% швидкості Інтернету (він просто не перестане стріляти і торрентіювати ...), і я думаю, що цього достатньо, щоб він не був заблокований.

Знову дякую!


Гммм, тому в основному ця відповідь "не використовуйте гостьовий рахунок". Це, на жаль, антикліматично.
Twisty Impersonator

Але практично: ви отримуєте більше контролю над обмеженим користувачем, ніж над гостем.
music2myear

1
Редагування облікового запису гостей, ймовірно, відбувається через те, що ви змінюєте ключ HKLM, який змінює його для всіх користувачів (істотно змінюючи налаштування "за замовчуванням", яке використовується, якщо налаштування для кожного користувача відсутнє). Крім того, обмеження швидкості в Інтернеті, ймовірно, найкраще встановлювати на маршрутизаторі на основі пристрою, якщо це можливо; Вам потрібно буде змінити свою MAC-адресу або отримати доступ до конфігурації маршрутизатора, щоб обійти це.
wizzwizz4

5
Ви можете просто налаштувати QoS у своєму маршрутизаторі
Wayne Werner

6
Це класичний приклад проблеми XY. Ви запитуєте рішення X, коли вам справді потрібен Y: "як я заважаю братові використовувати більше 20% пропускної здатності". Що набагато краще вирішити на маршрутизаторі, ніж на комп’ютері.
Флоріс
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.