게스트 사용자가 특정 프로그램을 닫지 못하게하는 방법이 있습니까?


38

랩톱이 있고 해당 사용자가 게스트 계정을 실행하고 있습니다.

시스템이 시작될 때 자동으로 시작되는 두 가지 프로그램이 있습니다 (NetLimiter & TeamViewer). 이러한 프로그램은 트레이에 숨겨져 있지만 게스트 사용자는 원하는 경우 닫을 수 있습니다. 그것을 막을 방법이 있습니까?

랩톱에 대한 전체 액세스 권한이 있으므로 설치할 구성이나 프로그램이 있으면 할 수 있습니다.



17
Teamviewer는 서비스로 실행할 수도 있습니다. 관리자가 관리자 계정으로 설치 한 경우 일반 사용자는 관리자를 닫을 수 없습니다. appdataworks.com/…
Ajasja

1
도구의 GUI를 열어서 메뉴를 통해 도구를 종료 할 수있는 방법을 거의 막을 수 없기 때문에 프로그램이 여전히 실행 중인지 확인하고 사용자가 다시 시작하는 경우 일반 스크립트를 실행하는 옵션은 어떤가요? 닫았습니까? 따라서 사용자가 닫을 수는 있지만 몇 초 후에 자동으로 다시 시작됩니까?
팔코

제안 dup 질문에 대한 답변이 있지만 자세한 내용이 부족하며 여기에 좋은 답변이 있으면 향후 복제본에 대해 훨씬 더 나은 "기본"솔루션이 될 수 있습니다.
music2myear

1
@RJFalconer 내가 한
alaslipknot

답변:


50

작업 관리자를 통한 폐쇄를 방지하려면

" 프로세스 탐색기 "를 가져 와서 두 프로그램에서 "게스트"에 대한 권한을 "종료"권한이 없도록 설정하십시오.

  1. 프로세스 탐색기 목록에서 프로세스를 찾아 "속성"을 마우스 오른쪽 단추로 클릭하십시오.
  2. 보안-> 권한
  3. "게스트"-> 편집을 선택하십시오.

스크린 샷

이렇게해도 프로그램이 정상적으로 종료되지는 않습니다. 타사 프로그램이나 레지스트리를 사용하여 창과 시스템 트레이 아이콘을 숨겨야합니다.

너무 많은 대역폭을 사용하여 네트워크 사용자를 제한하려면

이것은 실제 문제인 것 같습니다.

보다:


30
이것은 프로세스의 특정 실행 인스턴스 또는 현재 및 미래의 모든 인스턴스에만 적용됩니까?
Martin Smith

25
@MartinSmith 이것은 현재 실행중인 것에 만 영향을 미칩니다.
벤 N

1
호기심에서 (빨간색 X 버튼을 클릭하면 어떻게됩니까?)이를 시도했지만 작동하지 않는 것 같습니다.
Pavel

11
메뉴 또는 빨간색 X는 프로그램이 자발적으로 종료하도록 요청합니다. 종료는 작업 관리자에서 발생합니다.
Zan Lynx

@ZanLynx 그렇습니다. 즉, 내 이해에 따르면, 파는 [...]
Pavel

35

프로세스 탐색기 응답은 한 번만 작동하지만 컴퓨터를 다시 부팅 한 후에도 적용됩니다. 이를 위해 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)
    }
}

이 스택 오버플로 답변을 기반으로 합니다 . 기본적으로 보호 할 프로세스 목록과 사용자를 보호 할 프로세스 목록을 제공하며 프로세스의 ACL을 적절히 조정합니다. A와 저장 .ps1(어딘가 사용자가 읽고 쓸 수는 없지만) 파일, 다음 사용자의 시작에서 이런 일을 포함하는 배치 파일을 넣어 :

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

즉 보호 snippingtool.exemspaint.exe에서합니다 (자르는 도구 및 페인트는) 고객에 의해 살해된다.

이는 프로세스가 시작된 후에 실행되어야합니다 . PowerShell 스크립트 sleep 10Param차단 된 후 또는 그 이상 을 추가해야 할 수도 있습니다 . 완료되면 작업 관리자를 사용하여 해당 프로세스를 종료하려고하면 다음이 발생합니다.

접근 불가

또한 테스트하는 계정이 관리자이거나보다 정확하게 계정을 보유한 경우에는 아무 것도 유용하지 않습니다 SeDebugPrivilege.

창에서 X를 클릭하거나 응용 프로그램 자체의 닫기 기능을 사용하면 모든 프로세스가 실행 중지를 자유롭게 결정할 수 있으므로 프로세스가 여전히 종료됩니다. 다른 답변에 설명 된대로 알림 영역을 숨겨야 할 수도 있습니다. 또한 이러한 중요한 프로세스는 게스트 사용자로 실행되므로 해당 사용자는 프로세스 개체의 소유자이며 ACL을 다시 조정할 수 있거나 PROCESS_VM_WRITE프로세스의 메모리를 낙서하고 충돌하는 기능을 사용할 수 있습니다. 빈 ACE를 추가 OWNER RIGHTS하고로 변경 'PROCESS_TERMINATE, PROCESS_SUSPEND_RESUME, WRITE_DAC'하여 해결할 수 있습니다 'PROCESS_ALL_ACCESS'.

GPO를 통해 작업 관리자에 대한 액세스를 거부하면 사용자가 작업 관리자를 사용하지 못하게되며 가장 간단한 솔루션이지만 taskkill그룹 정책을 준수하지 않는 자체 프로그램 (또는 )을 실행하는 데 방해가되지는 않습니다. 방어하려는 프로세스가 방어하려는 프로세스와 다른 사용자로 실행 된 것이 가장 좋습니다.

물론, 손님이 이러한 다양한 "보호"를 우회하기 위해 그 모든 문제에 기꺼이 간다면 기술적 인 것보다 사회적 문제가 더있을 수 있습니다.


6
나는 그들이 아이콘을 마우스 오른쪽 버튼으로 클릭하고 작업 관리자를 통해 프로세스를 종료하지 않고 응용 프로그램의 "종료"옵션을 선택하는 것에 대해 걱정하고 있다고 생각합니다 (아직 문제는 있음).
Micheal Johnson

8

이는 게스트 사용자 계정을 잠 그려는 정도에 따라 달라 지므로 게스트 계정에서 수행 할 수있는 작업 / 할 수없는 작업에 대한 추가 정보가 유용합니다. 컴퓨터 도메인도 연결되어 있습니까?

내 개인적인 견해로는, 특히 실수로 잘못 손에 든 경우 해당 컴퓨터를 사용하여 악의적 인 작업을 수행 할 수 없도록 연결된 모든 게스트 계정 도메인을 엄격하게 잠그지 않아야한다는 것입니다. 그룹 정책을 사용하여 다음을 수행하여 시작합니다.

  1. 사용자가 백그라운드에서 실행중인 응용 프로그램에 액세스 할 수 없도록 알림 영역을 완전히 숨 깁니다. NetLimiter 및 TeamViewer와 상호 작용해야하는 경우 항상 시작 메뉴에서 시작할 수 있습니다.

    필요한 특정 GP 항목은 사용자 구성> 관리 템플릿> 시작 메뉴 및 작업 표시 줄> 알림 영역 숨기기 아래에 있습니다.

  2. 작업 관리자에 대한 액세스를 비활성화하여 프로세스를 종료하지 못하게합니다.

    사용자 구성> 관리 템플릿> 시스템> 작업 관리자 제거

  3. NetLimiter에는 다른 사용자에 대한 권한을 설정할 수있는 기능이 있다고 생각합니다. 이것들을 살펴보고 응용 프로그램을 제어하는 ​​사용자 계정 기능을 제거 할 수 있는지 확인하십시오.

사용자가 조금 더 고급 인 경우 좀 더 포괄적 인 그룹 정책을 설정해야 할 경우 대부분의 사용자를 제한해야합니다.

다음은 GP를 사용하여 필요한 경우 경찰을 특정 사용자로 제한하는 데 유용한 안내서입니다. http://www.sevenforums.com/tutorials/151415-group-policy-apply-specific-user-group.html


그들은 여전히 ​​시계를 볼 수 있기를 원할 것입니다.
Micheal Johnson

숨기기 알림 영역을 구성해도 시계가 계속 표시됩니다. 이들은 별도의 OS 구성 요소입니다
MattP

1

모든 자세한 답변을 보내 주셔서 감사합니다. 댓글의 제안 중 일부를 사용하여 끝났습니다. 다음은 내가 한 일입니다.

  • 어떤 이유로 든 레지스트리 항목을 편집 할 수 없으므로 게스트 계정을 완전히 비활성화하십시오. 관리자 권한이 필요합니다. 관리자 권한이 있으면 수정 사항이 관리자 계정에도 적용됩니다 (일반적인 것인지 확실하지 않음) 아니면 그냥 버그)

  • 새 사용자를 작성하고 다음을 수행하십시오.

  • 트레이 아이콘 비활성화 (레지스트리에서)

    • 이로 인해 볼륨 컨트롤 가젯을 추가해야했습니다.
  • 제어판 비활성화 (레지스트리에서)

  • 레지스트리에서 작업 관리자 비활성화

  • 이 소프트웨어의 위치에 액세스 할 수 없도록 특정 권한을 거부합니다 (제거하거나 제거 할 수 없음)

내 동생이 인터넷 속도의 20 % 이상을 사용할 수 없도록하기 위해 노력하고 있습니다 (그는 스트리밍과 토렌트를 멈추지 않을 것입니다 ...).

다시 감사합니다!


흠, 기본적으로이 답변은 "게스트 계정을 사용하지 마십시오"입니다. 슬프게도 반 기후입니다.
나는 말한다 Reinstate Monica

그러나 실용적 : Guest를 이용하는 것보다 매우 제한된 사용자를 더 많이 제어 할 수 있습니다.
music2myear

1
Guest 계정을 수정하면의 키를 변경하고 있기 때문에 HKLM모든 사용자에 대해 키가 변경되기 때문일 수 있습니다 (기본적으로 사용자 별 설정이없는 경우 사용되는 "기본"설정 수정). 또한 인터넷 속도 제한은 가능하면 장치별로 라우터에서 설정하는 것이 가장 좋습니다. 이를 해결하려면 MAC 주소를 변경하거나 라우터 구성에 액세스해야합니다.
wizzwizz4

5
라우터에서 QoS를 설정할 수 있습니다
Wayne Werner

6
이것은 XY 문제의 전형적인 예입니다. 당신은 Y가 정말로 필요할 때 해결책 X를 요구합니다. 이것은 컴퓨터보다 라우터에서 훨씬 더 잘 해결됩니다.
Floris
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.