有没有办法阻止来宾用户关闭某个程序?

有没有办法阻止来宾用户关闭某个程序?

我有一台笔记本电脑,它的用户正在运行访客帐户,

系统启动时会自动启动 2 个程序(NetLimiter 和 TeamViewer)。这些程序隐藏在托盘中,但来宾用户可以根据需要关闭它们。有没有什么方法可以阻止这种情况发生?

我可以完全访问笔记本电脑,因此如果有任何配置或程序需要安装,我都可以做到。

答案1

防止通过任务管理器关闭

得到 ”进程探索器”并将两个程序上“Guest”的权限设置为不具有“Terminate”权限。

  1. 在进程资源管理器列表中找到进程,然后右键单击“属性”
  2. 安全 -> 权限
  3. 选择“访客”-> 编辑。

截屏

这仍然不能阻止他们正常关闭程序。您必须使用第三方程序或注册表调整来隐藏窗口和系统托盘图标。

限制使用过多带宽的网络用户

这似乎是您的实际问题。

看:

答案2

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)
    }
}

它基于这个 Stack Overflow 上的答案基本上,您向它提供要保护的进程列表和要保护的用户,它会适当地修改进程的 ACL。将其保存为文件.ps1(用户可以读取但不能写入的地方),然后将包含以下内容的批处理文件放入用户的启动中:

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

这样可以保护snippingtool.exe截图mspaint.exe工具和画图工具不被 Guest 杀死。

请注意,这必须运行这些进程启动。您可能需要在 PowerShell 脚本块sleep 10后添加一个左右Param。完成后,尝试使用任务管理器终止这些进程将导致以下情况:

拒绝访问

还请注意,如果您用来测试的帐户是管理员,或者更准确地说,有,它将不会执行任何有用的操作SeDebugPrivilege

单击窗口上的 X 或使用应用程序自己的关闭功能仍会使进程退出,因为所有进程都可以自由决定停止运行。您可能需要隐藏通知区域,如另一个答案中所述。此外,由于这些重要进程以来宾用户身份运行,因此该用户是进程对象的所有者,并且无论如何都能够调整 ACL,或者可以使用能力在进程的内存上乱涂乱画并使其崩溃。这些问题可以通过分别将和 更改为PROCESS_VM_WRITE添加空白 ACE 来解决。OWNER RIGHTS'PROCESS_TERMINATE, PROCESS_SUSPEND_RESUME, WRITE_DAC''PROCESS_ALL_ACCESS'

通过 GPO 拒绝访问任务管理器将阻止用户使用任务管理器(显然),这是最直接的解决方案,但没有什么可以阻止他们运行taskkill不遵守组策略的自己的程序(或)。最好是,您要防御的进程以不同于您要防御的用户身份运行。

当然,如果您的客人愿意不遗余力地规避这些各种“保护措施”,您面临的社会问题可能比技术问题还要多。

答案3

这实际上取决于您想在多大程度上锁定您的访客用户帐户,因此有关您希望您的访客帐户能够做什么/不能做什么的更多信息会很方便。此外,计算机域是否已连接?

尽管如此,我个人的观点是,任何连接的来宾帐户域都应该严格锁定,以确保不会使用该机器进行任何恶意操作,尤其是当它意外落入坏人之手时。我首先使用组策略执行以下操作。

  1. 完全隐藏通知区域,这样您的用户就无法访问在后台运行的任何应用程序。如果您需要他们与 NetLimiter 和 TeamViewer 交互,那么他们可以随时从开始菜单启动它们。

    您需要的特定 GP 项目位于用户配置 > 管理模板 > 开始菜单和任务栏 > 隐藏通知区域下

  2. 禁用对任务管理器的访问,这应该可以阻止他们终止该进程。

    用户配置 > 管理模板 > 系统 > 删除任务管理器

  3. 我相信 NetLimiter 有能力为不同的用户设置权限。探索这些功能,看看是否可以删除用户帐户控制应用程序的能力。

这是一个很好的开始,应该可以限制大多数用户,如果你的用户更高级一点,那么你可能需要设置一些更全面的组策略

如果需要的话,这里有一份使用 GP 将策略限制到特定用户的良好指南http://www.sevenforums.com/tutorials/151415-group-policy-apply-specific-user-group.html

答案4

感谢大家的详细回答,我最终采用了评论中的一些建议,以下是我所做的:

  • 完全禁用来宾帐户,因为出于某种原因,编辑注册表项不起作用,您需要管理员权限,一旦获得该权限,修改也将应用于管理员帐户(不确定这是否是常见问题还是仅仅是我的错误)

  • 创建一个新用户并执行以下操作:

  • 禁用托盘图标(在注册表中)

    • 因此必须添加音量控制装置。
  • 禁用控制面板(在注册表中)

  • 禁用任务管理器(在注册表中)

  • 拒绝某些权限,这样他就无法访问这些软件的位置(无法删除或卸载它们)

我这样做是为了让我的弟弟不能使用超过 20% 的互联网速度(他只是不会停止流媒体和种子下载......)而且我认为这些足以让他保持锁定。

再次感谢!

相关内容