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


38

我有一台笔记本电脑,它的用户正在运行一个来宾帐户,

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

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



17
Teamviewer也可以作为服务运行。如果由管理员安装(使用管理员帐户),则普通用户应该无法将其关闭。appdataworks.com/…–
Ajasja

1
由于几乎没有办法阻止用户可以通过菜单打开工具的GUI来退出该工具,因此运行常规脚本的选项又如何呢?已经关门了吗?因此用户可以关闭它,但是几秒钟后它会自动重新启动?
Falco

建议dup问题的答案是可以接受的,但缺少实质性细节,此处的良好答案对于以后的重复工作可能是一个更好的“基础”解决方案。
music2myear

1
@RJFalconer 我做了
alaslipknot

Answers:


50

防止通过任务管理器关闭

获取“ Process Explorer ”,并在两个程序上将“ Guest”的权限设置为不具有“ Terminate”权限。

  1. 在进程浏览器列表中找到进程,然后右键单击“属性”
  2. 安全->权限
  3. 选择“来宾”->编辑。

屏幕截图

这仍然不能阻止他们仅正常关闭程序。您必须使用第三方程序或注册表摆弄来隐藏窗口和系统任务栏图标。

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

这似乎是您的实际问题。

看到:


30
这仅适用于流程的特定运行实例还是所有当前和将来的实例?
马丁·史密斯

25
@MartinSmith这只会影响当前正在运行的一个。
本N

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

它基于此Stack Overflow答案。基本上,您为它提供了要保护的进程列表和要防止的用户列表,并且适当地摆弄了进程的ACL。将其保存为.ps1文件(用户可以读取但不能写入的文件),然后将包含如下内容的批处理文件放入用户的Startup中:

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

保护snippingtool.exemspaint.exe从(在截图工具和画图)的游客被杀害。

请注意,这必须这些进程启动之后运行。您可能必须在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不遵守组策略的程序(或)。最好是,您要捍卫的进程与您要捍卫的进程的用户身份不同。

当然,如果您的客人愿意为解决这些各种“保护”而竭尽全力,那么您可能会遇到更多的社会问题,而不是技术问题。


6
我认为他们担心右键单击图标并选择应用程序的“退出”选项,而不是通过任务管理器终止过程(尽管这仍然是一个问题)。
米歇尔·约翰逊

8

这实际上取决于您要锁定访客用户帐户的数量,因此有关您希望访客帐户能够/不能够执行的操作的更多信息非常方便。还要连接计算机域吗?

那就是说,我个人的观点是,无论是否连接任何来宾帐户域,都应严格锁定,以确保使用该计算机无法进行任何恶意操作,尤其是如果该计算机意外地落入了错误的手里。我首先使用组策略执行以下操作。

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

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

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

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

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

如果您的用户更高级,那么这将是一个很好的开始,应该限制大多数用户,然后您可能必须设置一些更全面的组策略

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


他们可能仍然希望能够看到时钟。
米歇尔·约翰逊

配置隐藏通知区域时,时钟仍然显示。它们是单独的OS组件
MattP

1

谢谢大家提供的所有详细答案,我最终在评论中使用了一些建议,这是我所做的:

  • 完全禁用来宾帐户,因为出于某种原因,无法编辑注册表项,您将需要管理员权限,一旦获得该权限,修改内容也将同时应用于管理员帐户(不确定这是否很常见)或对我来说只是个错误)

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

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

    • 因此,不得不添加一个音量控制小工具。
  • 禁用控制面板(在注册表中)

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

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

这样做是为了让我的兄弟不能使用超过20%的互联网速度(他只是不会停止流式传输和洪流……),我认为这些足以使他锁定。

再次感谢!


嗯,所以基本上,这个答案是“不要使用访客帐户”。不幸的是,这是反气候的。
我说恢复莫妮卡的时间

但很实际:与对Guest相比,对有限用户的控制更多。
music2myear

1
对来宾帐户的编辑可能是因为您正在更改中的密钥HKLM,从而更改了所有用户的密钥(本质上是在缺少按用户设置的情况下修改使用的“默认”设置)。另外,如果可能,最好在路由器上按设备对Internet速度限制进行最佳设置。您需要更改您的MAC地址或访问路由器配置才能解决该问题。
wizzwizz4

5
您可以在路由器中设置QoS
Wayne Werner'1

6
这是XY问题的经典示例。您在真正需要Y时要求解决方案X:“如何防止我的兄弟使用超过20%的带宽”?在路由器上比在计算机上解决的要好得多。
Floris
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.