我有一台笔记本电脑,它的用户正在运行访客帐户,
系统启动时会自动启动 2 个程序(NetLimiter 和 TeamViewer)。这些程序隐藏在托盘中,但来宾用户可以根据需要关闭它们。有没有什么方法可以阻止这种情况发生?
我可以完全访问笔记本电脑,因此如果有任何配置或程序需要安装,我都可以做到。
答案1
防止通过任务管理器关闭
得到 ”进程探索器”并将两个程序上“Guest”的权限设置为不具有“Terminate”权限。
- 在进程资源管理器列表中找到进程,然后右键单击“属性”
- 安全 -> 权限
- 选择“访客”-> 编辑。
这仍然不能阻止他们正常关闭程序。您必须使用第三方程序或注册表调整来隐藏窗口和系统托盘图标。
限制使用过多带宽的网络用户
这似乎是您的实际问题。
看:
答案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
这实际上取决于您想在多大程度上锁定您的访客用户帐户,因此有关您希望您的访客帐户能够做什么/不能做什么的更多信息会很方便。此外,计算机域是否已连接?
尽管如此,我个人的观点是,任何连接的来宾帐户域都应该严格锁定,以确保不会使用该机器进行任何恶意操作,尤其是当它意外落入坏人之手时。我首先使用组策略执行以下操作。
完全隐藏通知区域,这样您的用户就无法访问在后台运行的任何应用程序。如果您需要他们与 NetLimiter 和 TeamViewer 交互,那么他们可以随时从开始菜单启动它们。
您需要的特定 GP 项目位于用户配置 > 管理模板 > 开始菜单和任务栏 > 隐藏通知区域下
禁用对任务管理器的访问,这应该可以阻止他们终止该进程。
用户配置 > 管理模板 > 系统 > 删除任务管理器
我相信 NetLimiter 有能力为不同的用户设置权限。探索这些功能,看看是否可以删除用户帐户控制应用程序的能力。
这是一个很好的开始,应该可以限制大多数用户,如果你的用户更高级一点,那么你可能需要设置一些更全面的组策略
如果需要的话,这里有一份使用 GP 将策略限制到特定用户的良好指南http://www.sevenforums.com/tutorials/151415-group-policy-apply-specific-user-group.html
答案4
感谢大家的详细回答,我最终采用了评论中的一些建议,以下是我所做的:
完全禁用来宾帐户,因为出于某种原因,编辑注册表项不起作用,您需要管理员权限,一旦获得该权限,修改也将应用于管理员帐户(不确定这是否是常见问题还是仅仅是我的错误)
创建一个新用户并执行以下操作:
禁用托盘图标(在注册表中)
- 因此必须添加音量控制装置。
禁用控制面板(在注册表中)
禁用任务管理器(在注册表中)
拒绝某些权限,这样他就无法访问这些软件的位置(无法删除或卸载它们)
我这样做是为了让我的弟弟不能使用超过 20% 的互联网速度(他只是不会停止流媒体和种子下载......)而且我认为这些足以让他保持锁定。
再次感谢!