Có cách nào để chặn người dùng khách đóng một chương trình nhất định không?


38

Tôi có một máy tính xách tay và người dùng của nó đang chạy một tài khoản khách,

Có 2 chương trình tự khởi động khi hệ thống khởi động (NetLimiter & TeamViewer). Các chương trình này được ẩn trong khay nhưng người dùng khách có thể đóng chúng nếu muốn. Có cách nào để ngăn chặn điều đó?

Tôi có toàn quyền truy cập vào máy tính xách tay vì vậy nếu có bất kỳ cấu hình hoặc chương trình nào để cài đặt, tôi có thể làm điều đó.



17
Teamviewer cũng có thể được chạy như một dịch vụ. Nếu được cài đặt bởi quản trị viên (trong tài khoản quản trị viên), người dùng bình thường sẽ không thể đóng nó. appdatawork.com/ từ
Ajasja

1
Vì hầu như không có cách nào để ngăn người dùng có thể mở GUI của công cụ để thoát nó qua menu, còn tùy chọn chạy tập lệnh thông thường sẽ kiểm tra xem chương trình có còn chạy không và chỉ khởi động lại, nếu người dùng đã đóng cửa chưa? Vì vậy, người dùng có thể đóng nó, nhưng nó sẽ tự động khởi động lại sau vài giây?
Falco

Đề xuất câu hỏi song công có một câu trả lời được chấp nhận, nhưng nó thiếu chi tiết đáng kể và một câu trả lời tốt ở đây có thể là một giải pháp "cơ sở" tốt hơn nhiều cho các bản sao trong tương lai.
nhạc2myear

1
@RJFalconer tôi đã làm
alaslipizard

Câu trả lời:


50

Để ngăn chặn việc đóng cửa thông qua trình quản lý tác vụ

Nhận "Trình thám hiểm quy trình " và đặt quyền cho "Khách" trên hai chương trình để không có quyền "Chấm dứt".

  1. Tìm quy trình trong danh sách quá trình thám hiểm và nhấp chuột phải vào "Thuộc tính"
  2. Bảo mật -> Quyền
  3. Chọn "Khách" -> Chỉnh sửa.

ảnh chụp màn hình

Điều này vẫn không ngăn họ chỉ đóng chương trình bình thường. Bạn sẽ phải ẩn biểu tượng cửa sổ và khay hệ thống bằng cách sử dụng chương trình của bên thứ 3 hoặc đăng ký.

Để tiết kiệm người dùng mạng sử dụng quá nhiều băng thông

Đây dường như là vấn đề thực tế của bạn.

Xem:


30
Điều này chỉ áp dụng cho một trường hợp chạy cụ thể của quá trình hoặc tất cả các hiện tại và tương lai?
Martin Smith

25
@MartinSmith Điều này sẽ chỉ ảnh hưởng đến cái hiện đang chạy.
Ben N

1
Vì tò mò (như những gì xảy ra khi tôi nhấp vào nút X màu đỏ) tôi đã thử điều này và nó dường như không hoạt động đối với tôi.
Pavel

11
Menu hoặc X màu đỏ yêu cầu chương trình thoát tự nguyện. Chấm dứt là những gì xảy ra trong Trình quản lý tác vụ.
Zan Lynx

@ZanLynx Vâng, đó là, theo hiểu biết của tôi, mệnh nói [...] nhưng người dùng khách có thể đóng chúng nếu muốn. Có cách nào để ngăn chặn điều đó?
Pavel

35

Câu trả lời Process Explorer hoạt động một lần, nhưng bạn có thể muốn áp dụng điều này ngay cả sau khi máy tính được khởi động lại. Để làm điều đó, bạn có thể sử dụng 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)
    }
}

Nó dựa trên câu trả lời Stack Overflow này . Về cơ bản, bạn cung cấp cho nó danh sách các quy trình cần bảo vệ và người dùng để bảo vệ chống lại, và nó xử lý các ACL của quy trình một cách thích hợp. Lưu nó dưới dạng .ps1tệp (nơi nào đó người dùng có thể đọc nhưng không thể ghi), sau đó đặt tệp bó chứa nội dung như thế này trong Khởi động của người dùng:

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

Điều đó bảo vệ snippingtool.exemspaint.exe(Công cụ Snipping và Sơn) khỏi bị giết bởi Khách.

Lưu ý rằng điều này phải chạy sau khi các quá trình bắt đầu. Bạn có thể phải thêm một sleep 10hoặc nhiều hơn sau Paramkhối tập lệnh PowerShell. Khi nó kết thúc, cố gắng giết các tiến trình đó bằng Trình quản lý tác vụ sẽ gây ra điều này:

truy cập bị từ chối

Cũng lưu ý rằng nó sẽ không có gì hữu ích nếu tài khoản bạn kiểm tra nó là quản trị viên, hoặc chính xác hơn là có SeDebugPrivilege.

Nhấp vào X trên cửa sổ của họ hoặc sử dụng chức năng đóng riêng của ứng dụng sẽ vẫn khiến các quy trình thoát ra, vì tất cả các quy trình đều tự do quyết định ngừng chạy. Bạn có thể cần ẩn khu vực thông báo, như được mô tả trong câu trả lời khác. Ngoài ra, vì các quy trình quan trọng này chạy với tư cách là người dùng khách, người dùng đó là chủ sở hữu của các đối tượng quy trình và sẽ có thể điều chỉnh lại ACL hoặc có thể sử dụng các PROCESS_VM_WRITEkhả năng để viết nguệch ngoạc trên bộ nhớ của quy trình và khắc phục chúng. Những vấn đề này có thể được giải quyết bằng cách thêm một ACE trống cho OWNER RIGHTSvà bằng cách thay đổi 'PROCESS_TERMINATE, PROCESS_SUSPEND_RESUME, WRITE_DAC'thành 'PROCESS_ALL_ACCESS', tương ứng.

Từ chối quyền truy cập vào Trình quản lý tác vụ thông qua GPO sẽ ngăn người dùng sử dụng Trình quản lý tác vụ (rõ ràng) và là giải pháp đơn giản nhất, nhưng không có gì ngăn họ chạy chương trình của riêng họ (hoặc taskkill) không tuân thủ Chính sách nhóm. Sẽ là tốt nhất nếu các quy trình bạn đang cố bảo vệ chạy với tư cách là một người dùng khác với quy trình bạn đang cố gắng chống lại.

Tất nhiên, nếu khách của bạn sẵn sàng đi đến tất cả những rắc rối đó để phá vỡ những "sự bảo vệ" khác nhau này, bạn có thể gặp nhiều vấn đề xã hội hơn là vấn đề kỹ thuật.


6
Tôi nghĩ rằng họ lo lắng về việc nhấp chuột phải vào biểu tượng và chọn tùy chọn "thoát" của ứng dụng, không chấm dứt quá trình thông qua trình quản lý tác vụ (mặc dù đó vẫn là một vấn đề).
Micheal Johnson

8

Điều này thực sự phụ thuộc vào mức độ bạn muốn khóa tài khoản người dùng khách của mình, vì vậy một số thông tin khác về những gì bạn muốn tài khoản khách của bạn có thể làm / không làm sẽ có ích. Ngoài ra tên miền máy tính được kết nối?

Điều đó nói lên ý kiến ​​cá nhân của tôi là bất kỳ tên miền tài khoản khách nào được kết nối hay không nên được khóa chặt để đảm bảo rằng không có gì độc hại có thể được thực hiện khi sử dụng máy đó, đặc biệt là nếu nó vô tình rơi vào tay kẻ xấu. Tôi bắt đầu bằng cách làm như sau bằng cách sử dụng chính sách nhóm.

  1. Ẩn hoàn toàn khu vực thông báo để người dùng của bạn không thể truy cập bất kỳ ứng dụng nào đang chạy ẩn. Nếu bạn cần họ tương tác với NetLimiter & TeamViewer thì họ luôn có thể khởi chạy chúng từ menu bắt đầu.

    Mục GP cụ thể bạn cần nằm trong Cấu hình người dùng> Mẫu quản trị> Menu bắt đầu và Thanh tác vụ> Ẩn vùng Thông báo

  2. Vô hiệu hóa quyền truy cập vào Trình quản lý tác vụ sẽ ngăn họ kết thúc quá trình.

    Cấu hình người dùng> Mẫu quản trị> Hệ thống> Xóa Trình quản lý tác vụ

  3. Tôi tin rằng NetLimiter có khả năng đặt quyền cho những người dùng khác nhau. Khám phá những điều này và xem liệu bạn có thể loại bỏ khả năng kiểm soát tài khoản người dùng hay không.

Đó là một khởi đầu tốt nên giới hạn hầu hết người dùng nếu người dùng của bạn tiến bộ hơn một chút thì bạn có thể phải thiết lập một số chính sách nhóm toàn diện hơn

Dưới đây là một hướng dẫn tốt để sử dụng GP để giới hạn chính sách cho người dùng cụ thể nếu bạn cần nó http://www.sevenforums.com/tutorials/151415-group-policy-apply-specific-user-group.html


Họ có lẽ vẫn sẽ muốn có thể nhìn thấy đồng hồ mặc dù.
Micheal Johnson

Đồng hồ vẫn được hiển thị khi bạn định cấu hình ẩn khu vực thông báo. Chúng là các thành phần HĐH riêng biệt
MattP

1

Cảm ơn tất cả các câu trả lời chi tiết, cuối cùng tôi đã sử dụng một số gợi ý trong bình luận, đây là những gì tôi đã làm:

  • Hoàn toàn vô hiệu hóa tài khoản khách vì một số lý do chỉnh sửa mục đăng ký cho nó không hoạt động, bạn sẽ cần sự cho phép của Quản trị viên và khi bạn nhận được điều đó, sửa đổi cũng sẽ được áp dụng cho tài khoản Quản trị viên (không chắc đây có phải là điều phổ biến không hoặc chỉ là một lỗi cho tôi)

  • Tạo một người dùng mới và làm như sau cho nó:

  • Tắt biểu tượng Khay (trong sổ đăng ký)

    • Phải thêm một tiện ích điều khiển âm lượng vì điều này.
  • Vô hiệu hóa Bảng điều khiển (trong sổ đăng ký)

  • Vô hiệu hóa Trình quản lý tác vụ (trong sổ đăng ký)

  • Từ chối một số quyền nhất định để anh ta không thể truy cập vào vị trí của các phần mềm này (không thể xóa chúng hoặc gỡ cài đặt chúng)

Đang làm điều này để anh tôi không thể sử dụng hơn 20% tốc độ internet (anh ấy sẽ không ngừng phát trực tuyến và torrent ...) và tôi nghĩ rằng những điều này là đủ để giữ cho anh ấy bị khóa.

Cảm ơn một lần nữa!


Hmmm, vì vậy về cơ bản câu trả lời này là "không sử dụng tài khoản khách." Thật đáng buồn khi chống khí hậu.
Tôi nói Phục hồi Monica

Nhưng thực tế: Bạn có quyền kiểm soát nhiều hơn đối với người dùng rất hạn chế so với bạn nhận được trên Khách.
nhạc2myear

1
Việc chỉnh sửa tài khoản Guest có thể là do bạn đang thay đổi khóa HKLM, điều này sẽ thay đổi nó cho tất cả người dùng (về cơ bản sửa đổi cài đặt "mặc định" được sử dụng nếu không có cài đặt theo người dùng). Ngoài ra, giới hạn tốc độ internet có thể được đặt tốt nhất tại bộ định tuyến trên cơ sở mỗi thiết bị nếu có thể; bạn sẽ cần thay đổi địa chỉ MAC hoặc có quyền truy cập vào cấu hình bộ định tuyến để khắc phục điều đó.
wizzwizz4

5
Bạn chỉ có thể thiết lập QoS trong bộ định tuyến của mình
Wayne Werner

6
Đây là một ví dụ cổ điển về vấn đề XY. Bạn yêu cầu một giải pháp X khi bạn thực sự cần Y: "làm cách nào để ngăn anh tôi sử dụng hơn 20% băng thông"?. Đó là giải quyết tốt hơn nhiều tại bộ định tuyến so với tại máy tính.
Floris
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.