2012-03-17 17 views
3

こんにちは私は少し生産的になるためのプログラムをプログラミングしています。事前に設定された時間が経過すると、ユーザーはインターネットから切断されるか、コンピュータがシャットダウンされます。プログラムをタスクマネージャで閉じてはいけません。私はプログラムをコンパイルして実行することができますが、私はタスクマネージャーでそれを閉じることができます。私は、このページ Prevent user process from being killed with "End Process" from Process Explorerタスクマネージャでプロセスが閉じられないようにします

#include <iostream> 
#include <Windows.h> 

#include <AccCtrl.h> 
#include <AclAPI.h> 
#include <tchar.h> 

#include "shutdown.cpp" 
#include "disconnect.cpp" 



static const bool ProtectProcess() 
{ 

    HANDLE hProcess = GetCurrentProcess(); 
    EXPLICIT_ACCESS denyAccess = {0}; 
    DWORD dwAccessPermissions = GENERIC_WRITE|PROCESS_ALL_ACCESS|WRITE_DAC|DELETE|WRITE_OWNER|READ_CONTROL; 
    BuildExplicitAccessWithName(&denyAccess, _T("CURRENT_USER"), dwAccessPermissions, DENY_ACCESS, NO_INHERITANCE); 
    PACL pTempDacl = NULL; 
    DWORD dwErr = 0; 
    dwErr = SetEntriesInAcl(1, &denyAccess, NULL, &pTempDacl); 
    // check dwErr... 
    dwErr = SetSecurityInfo(hProcess, SE_KERNEL_OBJECT, DACL_SECURITY_INFORMATION, NULL, NULL, pTempDacl, NULL); 
    // check dwErr... 
    LocalFree(pTempDacl); 
    CloseHandle(hProcess); 
    return dwErr == ERROR_SUCCESS; 

} 


int main() 
{ 
    using namespace std; 
    int abfrage; 

    ProtectProcess(); 

    for (;;) 
    { 
     cout << "10.Cut your Internet connection" << endl 
      << "11.Cut your Internet connection after 'x' minutes of surfing" << endl 
      << "20.Shutdown"     << endl; 
     cin >> abfrage; 

     switch(abfrage) 
     { 
      case 10: disconnectnow(); break; 
      case 11: disconnectlater(); break; 
      case 20: shutdown(); break; 

      default: cout << "nothing to see here" << endl; 
     } 
    } 
    return EXIT_SUCCESS; 
} 
+0

管理者は常にあなたのプログラムを殺すことができるでしょうか?インターネット接続を止めないと生産性が低下しますか? –

+5

タスクマネージャからプログラムを隠したり、プログラムマネージャが閉じられないようにするには、Windowsが明白な理由で防ぐのが難しいものがあります。 – ChrisF

+0

@Carl Norum私はしばしば勉強のためにpdfsを読む必要がありますが、インターネットは私を止めています。これは管理者権限とユーザー権限の両方で機能しません。 – AaronP

答えて

6

この機能is, deliberately, unsupported and actively made intractable:

できないのはなぜあなたはトラップのTerminateProcessからインスピレーションを得ましたか。

ユーザーがタスクマネージャを発射し、[アプリケーション]タブの[タスクの終了]ボタンをクリックすると、Windowsが最初のGUIプログラムやプログラムをコンソールにCTRL_CLOSE_EVENTイベントにWM_CLOSEメッセージを送信することにより、うまく自分のプログラムをシャットダウンしようとします。しかし、あなたはTerminateProcessを傍受する機会はありません。何故なの?

TerminateProcessは、低レベルのプロセスを強制終了する機能です。それはDLL_PROCESS_DETACHとその他の処理をバイパスします。 TerminateProcessで殺すと、それ以上のユーザーモードコードは実行されません。それはなくなった。行ってはいけません。 200ドルを徴収しないでください。

TerminateProcessを傍受する可能性がある場合は、プログラムとユーザーの間で武器競争をエスカレートすることになります。あなたがそれを傍受できるとします。さて、あなたのプログラムを理解しづらいものにしたいのであれば、あなたはTerminateProcessハンドラを手渡すだけです!そして、人々は「TerminateProcessで殺されることを拒否するプロセスを殺す方法」を求め、我々が始めたところに戻ります。

実際には、検出とタスクの強制終了を回避しようとするプログラムは、Windowsシステムプロセスのほぼアイソフォームに名前を変更しようとします。これをしないでください。あなたのプログラムがマルウェアとして提出され、あなたの信頼性が失われることを保証します。

関連する問題