ゲストユーザーが特定のプログラムを終了するのをブロックする方法はありますか?


38

私はラップトップを持っており、そのユーザーはゲストアカウントを実行しています。

システムの起動時に自動的に起動するプログラムが2つあります(NetLimiterとTeamViewer)。これらのプログラムはトレイに隠されていますが、ゲストユーザーは必要に応じて閉じることができます。それを防ぐ方法はありますか?

私はラップトップに完全にアクセスできるため、インストールする構成またはプログラムがあれば、それを実行できます。



17
Teamviewerはサービスとしても実行できます。管理者によって(管理者アカウントで)インストールされた場合、通常のユーザーはそれを閉じることができません。appdataworks.com/...
Ajasja

1
ツールのGUIを開いてメニューから終了できるユーザーを防ぐ方法はほとんどないため、プログラムがまだ実行されているかどうかを確認し、ユーザーが閉じましたか?したがって、ユーザーはそれを閉じることができますが、数秒後に自動的に再起動しますか?
ファルコ

dupのサジェストの質問には受け入れられた答えがありますが、実質的な詳細が欠けているため、ここでの良い答えは、将来の複製のためのはるかに優れた「ベース」ソリューションになる可能性があります。
music2myear

回答:


50

タスクマネージャーによる終了を防ぐには

プロセスエクスプローラー」を取得し、2つのプログラムの「ゲスト」のアクセス許可を「終了」アクセス許可を持たないように設定します。

  1. プロセスエクスプローラーリストでプロセスを検索し、[プロパティ]を右クリックします。
  2. セキュリティ->許可
  3. [ゲスト]-> [編集]を選択します。

スクリーンショット

それでも、プログラムが正常に終了するのを防ぐことはできません。サードパーティのプログラムまたはレジストリをいじるを使用して、ウィンドウとシステムトレイアイコンを非表示にする必要があります。

過剰な帯域幅を使用してネットワークユーザーを調整するには

これが実際の問題のようです。

見る:


30
これは、プロセスの特定の実行中のインスタンスまたは現在および将来のすべてのインスタンスにのみ適用されますか?
マーティンスミス

25
@MartinSmithこれは、現在実行中のものにのみ影響します。
ベンN

1
好奇心から(赤いXボタンをクリックするとどうなるか)、これを試しましたが、うまくいかないようです。
パベル

11
メニューまたは赤いXは、プログラムに自発的に終了するように要求します。終了は、タスクマネージャーで行われます。
ザンリンクス

@ZanLynxはい、つまり、私の理解では、[...]
パベル

35

プロセスエクスプローラーの回答は1回機能しますが、おそらくコンピューターの再起動後でもこれを適用したいでしょう。そのためには、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 answerに基づいています。基本的に、保護するプロセスと保護するユーザーのリストを提供し、プロセスのACLを適切に調整します。.ps1ファイルとして保存し(ユーザーは読み取りはできるが書き込みはできない)、次のようなバッチファイルをユーザーのスタートアップに配置します。

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

これはsnippingtool.exemspaint.exeGuestによって殺されることから(およびSnipping Toolとペイント)を保護します。

これらのプロセスの開始に実行する必要があることに注意してください。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%を超えて使用できないようにしています(ストリーミングとトレントを停止しません...)。

再度、感謝します!


うーん、だから基本的にこの答えは「ゲストアカウントを使わないで」だ。それは悲しいことに反気候です。
私は言う

しかし実用的:ゲストよりも、非常に限られたユーザーに対してより多くの制御が可能です。
music2myear

1
Guestアカウントの編集は、おそらくキーを変更するためです。HKLMこれにより、すべてのユーザーに対してキーが変更されます(ユーザーごとの設定がない場合に使用される「デフォルト」設定を本質的に変更します)。また、可能であれば、インターネットの速度制限はおそらくデバイスごとにルーターで設定するのが最適です。それを回避するには、MACアドレスを変更するか、ルーター設定にアクセスする必要があります。
wizzwizz4

5
ルーターにQoSをセットアップするだけでいい
ウェインワーナー

6
これは、XY問題の典型的な例です。Yが本当に必要なときに、ソリューションXを要求します。「兄弟が帯域幅の20%以上を使用しないようにするにはどうすればよいですか?」これは、コンピューターで解決するよりもルーターで解決する方がはるかに優れています。
フローリス
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.