2009-11-10 506 views
0

我正在開發一個項目,以防止從可移動設備啓動應用程序。 有沒有人知道我能做到這一點?最好在Windows平臺上使用C++。如何停止執行應用程序

我的目標是防止執行exe文件,即使用戶雙擊它,或者即使他試圖從命令行啓動它。

+0

您對複數「應用程序」的使用似乎表明您要停止從可移動驅動器運行的任何應用程序。是這種情況,還是你想阻止你的應用程序從可移動驅動器運行?我的答案假設前者,而不是後者。 –

+0

不知道,你想讓你的應用拒絕運行,如果它駐留在可移動存儲上? –

+0

不是我只是想停止可能嘗試從可移動設備啓動的新可執行文件 –

回答

3

假設您希望停止從可移動驅動器啓動任何進程,這似乎是shell hook的應用程序。我在過去的半小時內寫了下面的代碼,它似乎測試了OK。請記住,編寫鉤子是一個不平凡的過程,而全局鉤子需要編寫一個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將被卸載等),但不太一般。

如果您想了解編寫全系統鉤子的基礎知識,可以在我的網站here上找到它們。請注意,以上不是生產質量的代碼,我將它轉換成了一箇舊的ANSI DLL,因此缺乏對Unicode的支持,或者任何接近體面調試功能的東西。它顯示了基本的想法。

+0

即使在修改此代碼以使用TerminateProcess之後,我也確信(從過去的經驗來看),這對於控制檯應用程序來說不起作用。這是因爲控制檯應用程序的處理方式與通過csrss.exe(某種「控制檯服務器」)處理其消息循環的窗口應用程序的處理方式不同。我無法從你的回答中完全理解這種解決方案在這種情況下是否合適。 –

+0

控制檯應用程序不是一個GUI過程,所以不,我發佈的代碼不適用於控制檯應用程序。我對TerminateProcess的評論涉及忽略WM_CLOSE的應用程序,而不是控制檯應用程序。我認爲OP需要對確切的要求更清楚一些:獲得適用於所有情況的一些東西是非常棘手的。可能這個代碼是足夠的,但只有他可以澄清確切的意圖。 –

0

如果當前磁盤類型是可移動設備,則可以編寫從Main方法返回的代碼片段。
呼叫GetCurrentDirectory拆分磁盤名稱,並使用WMIthis可以幫助),或者甚至更好GetDriveTypethis可以幫助這裏)方法知道的是,它可移動磁盤上或不

+0

簡單的解決方案。你只是在啓動時測試它,如果它不是從硬盤驅動器退出。 – Goz

+0

他需要那個,不是嗎? –

0

我看來,你正在尋找一種通用的方法來停止正在運行的應用程序從設備啓動的應用程序。 所以基本上三個問題: 1.檢測新應用程序已啓動 2.檢查正在運行什麼類型的設備關閉 3.強制應用到死,如果你不希望它

1部分:這是困難的舞會上,我認爲你需要可以使用EnumProcess定期是不是偉大,只是檢查其產生WM_ACTIVATEAPP應用調查

第2部分:ArsenMkrt的解決方案似乎是恰當的這個

3部分: TerminateProcess應該爲你做

1

您的網絡管理員可以在不需要編寫任何代碼的情況下處理該問題。我們在這裏實現了完全相同的目的,以防止員工將客戶私人信息複製到可移動設備的可能性,並且網絡管理員在開發部門需要做任何事情時沒有我們自己實現它。我不知道這是否會適用於您的情況,但值得考慮。

+0

嘗試:開始 - >運行 - >「secpo.msc」 - >安全設置 - >軟件限制策略 - >其他規則,右鍵單擊 - >新路徑規則。應該可以編寫一個應用程序來進行設置。 – Skizz