我正在开发一个项目,以防止从可移动设备启动应用程序。 有没有人知道我怎么做到这一点?最好是在Windows平台上使用C ++。
我的目标是防止执行exe文件,即使用户双击它,或者即使他试图从命令行启动它。
答案 0 :(得分:3)
假设您希望停止从可移动驱动器启动任何进程,这似乎是一个shell挂钩的应用程序。我在过去的半小时内编写了以下代码,似乎可以测试出来。请记住,编写一个钩子是一个非平凡的过程,而全局钩子需要编写一个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的支持,或任何接近适当的调试功能。它显示了基本的想法。
答案 1 :(得分:1)
您的网络管理员无需编写任何代码即可完成此操作。我们在这里实现了完全相同的事情,以防止员工将客户私人信息复制到可移动设备的可能性,并且网络管理员自己实现了它,而我们这里没有我们需要做任何事情的开发人员。我不知道这是否适用于您的情况,但值得考虑。
答案 2 :(得分:0)
如果当前磁盘类型是可移动设备,您可以编写从Main方法返回的代码段 调用GetCurrentDirectory拆分磁盘名称并使用WMI(this可以提供帮助)或甚至更好GetDriveType(this可以在此处提供帮助)方法知道它是否可移动磁盘与否
答案 3 :(得分:0)
在我看来,您正在寻找一种通用的方法来阻止从已经运行的应用程序启动任何应用程序。 基本上有三个问题: 1.已开始检测新应用程序 2.检查它正在运行的设备类型 3.如果你不想要它,强迫应用程序死掉
第1部分:这是一个困难的一方,我认为你需要定期使用EnumProcess进行轮询,这不是很好,或只是检查生成WM_ACTIVATEAPP的应用程序
第2部分:ArsenMkrt的解决方案似乎适用于此
第3部分:TerminateProcess应该为你做