0

アプリケーションがリムーバブル デバイスから起動されないようにするプロジェクトに取り組んでいます。誰かが私がこれを行う方法を知っていますか? できれば、Windows プラットフォームの C++ で。

私の目的は、ユーザーがダブルクリックしたり、コマンドラインから起動しようとしても、exe ファイルの実行を防ぐことです。

4

4 に答える 4

3

リムーバブルドライブからのプロセスの起動を停止したい場合、これはシェルフックのアプリケーションのようです。過去30分間に次のコードを記述しましたが、テストは問題ないようです。フックの作成は重要なプロセスであり、グローバルフックではDLLを作成する必要があることに注意してください。これは、フックDLLの関連する内臓です。

BOOL __declspec(dllexport) __stdcall InstallShellHook ()
{
   lpfnHookProc = (HOOKPROC) ShellFunc ;
   BOOL bRetVal = FALSE;

   if (hShellHook == NULL)
   {
      hShellHook = SetWindowsHookEx (WH_SHELL, 
                                     lpfnHookProc, 
                                     hInstance, 
                                     NULL);
      return TRUE;
   }
   return FALSE;
}

LRESULT CALLBACK ShellFunc(int nCode, WPARAM wParam, LPARAM lParam)
{
   HWND hWndNew;
   char szBuff  [_MAX_PATH];
   char szDrive [_MAX_DRIVE];

   switch (nCode)
   {
      case HSHELL_WINDOWCREATED:
         hWndNew = (HWND)wParam;
         GetWindowModuleFileName (hWndNew, szBuff, _MAX_PATH);
         _splitpath (szBuff, szDrive, NULL, NULL, NULL);
         if (GetDriveType (szDrive) ==  DRIVE_REMOVABLE)
         {
            PostMessage (hWndNew, WM_CLOSE, 0, 0);
         }
         break;

      default:
         break;
   }
   return 0;
}

シンプルなダイアログテストベッドからインストールしたこのコードをテストしました。ハードドライブからウィンドウアプリケーションを起動できますが、USBキーから起動したアプリケーションはすぐに閉じます。

このソリューションはすべてのGUIプロセス(つまり、非コンソール)で機能しますが、トップレベルウィンドウでWM_CLOSEに応答する必要があることに注意してください。より積極的な一般的な解決策では、おそらくhwndをhprocessに解決し、TerminateProcessを呼び出す必要があります。私が提供した解決策は「kinder」(リンクされたDLLはアンロードされるなど)ですが、それほど一般的ではありません。

システム全体のフックを作成するための基本を知りたい場合は、こちらの私のWebサイトで見つけることができます。上記は本番品質のコードではないことに注意してください。私はそれを私が置いていた古いANSIdllにハッキングしたため、Unicodeのサポートがないか、まともなデバッグ機能に近づいています。しかし、それは基本的な考え方を示しています。

于 2009-11-10T12:40:49.320 に答える
1

ネットワーク管理者は、コードを記述する必要なく、それを処理できます。ここでもまったく同じことを実装して、従業員が顧客の個人情報をリムーバブル デバイスにコピーする可能性を防ぎました。ネットワーク管理者は、開発部門の私たちが何もする必要なく、自分で実装しました。それがあなたの状況でうまくいくかどうかはわかりませんが、検討する価値があります。

于 2009-11-10T14:24:56.490 に答える
0

現在のディスクの種類がリムーバブル デバイスの場合、Main メソッドから返されるスニペットを記述できます。GetCurrentDirectory分割ディスク名を
呼び出し、 WMI (これが役立つ場合があります) またはさらに優れたGetDriveType (これはここで役立つ場合があります) メソッドを使用して、それがリムーバブル ディスク上にあるかどうかを確認します。

于 2009-11-10T10:52:13.017 に答える
0

すでに実行されているアプリケーションからデバイスから起動されるアプリを停止する一般的な方法を探しているようです。基本的に 3 つの問題があります: 1. 新しいアプリケーションが開始されたことを検出する 2. 実行中のデバイスの種類を確認する 3. 不要な場合はアプリを強制的に終了させる

パート 1: これは難しいパーティです。EnumProcess を使用して定期的にポーリングする必要があると思いますが、これはあまり良くないか、WM_ACTIVATEAPP を生成するアプリケーションをチェックするだけです。

パート 2: ArsenMkrt のソリューションはこれに適しているようです

パート 3: TerminateProcess が自動的に実行します

于 2009-11-10T11:38:31.833 に答える