我有一台笔记本电脑,它的用户正在运行一个来宾帐户,
系统启动时,有2个程序会自动启动(NetLimiter和TeamViewer)。这些程序隐藏在托盘中,但是来宾用户可以根据需要关闭它们。有办法防止这种情况吗?
我对笔记本电脑拥有完全访问权限,因此,如果有任何要安装的配置或程序,我可以做到。
我有一台笔记本电脑,它的用户正在运行一个来宾帐户,
系统启动时,有2个程序会自动启动(NetLimiter和TeamViewer)。这些程序隐藏在托盘中,但是来宾用户可以根据需要关闭它们。有办法防止这种情况吗?
我对笔记本电脑拥有完全访问权限,因此,如果有任何要安装的配置或程序,我可以做到。
Answers:
获取“ Process Explorer ”,并在两个程序上将“ Guest”的权限设置为不具有“ Terminate”权限。
这仍然不能阻止他们仅正常关闭程序。您必须使用第三方程序或注册表摆弄来隐藏窗口和系统任务栏图标。
这似乎是您的实际问题。
看到:
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.exe
并mspaint.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
不遵守组策略的程序(或)。最好是,您要捍卫的进程与您要捍卫的进程的用户身份不同。
当然,如果您的客人愿意为解决这些各种“保护”而竭尽全力,那么您可能会遇到更多的社会问题,而不是技术问题。
这实际上取决于您要锁定访客用户帐户的数量,因此有关您希望访客帐户能够/不能够执行的操作的更多信息非常方便。还要连接计算机域吗?
那就是说,我个人的观点是,无论是否连接任何来宾帐户域,都应严格锁定,以确保使用该计算机无法进行任何恶意操作,尤其是如果该计算机意外地落入了错误的手里。我首先使用组策略执行以下操作。
完全隐藏通知区域,以使您的用户无法访问在后台运行的任何应用程序。如果您需要他们与NetLimiter&TeamViewer进行交互,那么他们总是可以从开始菜单启动它们。
您需要的特定GP项位于用户配置>管理模板>开始菜单和任务栏>隐藏通知区域下
禁用对任务管理器的访问,这应阻止他们终止进程。
用户配置>管理模板>系统>删除任务管理器
我相信NetLimiter可以为不同的用户设置权限。探索这些内容,看看是否可以删除用户帐户控制应用程序的功能。
如果您的用户更高级,那么这将是一个很好的开始,应该限制大多数用户,然后您可能必须设置一些更全面的组策略
如果需要,这是使用GP将策略限制到特定用户的很好的指南http://www.sevenforums.com/tutorials/151415-group-policy-apply-specific-user-group.html
谢谢大家提供的所有详细答案,我最终在评论中使用了一些建议,这是我所做的:
完全禁用来宾帐户,因为出于某种原因,无法编辑注册表项,您将需要管理员权限,一旦获得该权限,修改内容也将同时应用于管理员帐户(不确定这是否很常见)或对我来说只是个错误)
创建一个新用户,并为此执行以下操作:
禁用纸盘图标(在注册表中)
禁用控制面板(在注册表中)
禁用任务管理器(在注册表中)
拒绝某些权限,以使他无法访问这些软件的位置(无法删除或卸载它们)
这样做是为了让我的兄弟不能使用超过20%的互联网速度(他只是不会停止流式传输和洪流……),我认为这些足以使他锁定。
再次感谢!
HKLM
,从而更改了所有用户的密钥(本质上是在缺少按用户设置的情况下修改使用的“默认”设置)。另外,如果可能,最好在路由器上按设备对Internet速度限制进行最佳设置。您需要更改您的MAC地址或访问路由器配置才能解决该问题。