我正在开展一个项目,以防止从可移动设备启动应用程序。有谁知道我该怎么做?最好在 Windows 平台上使用 C++。
我的目标是防止执行 exe 文件,即使用户双击它或者即使他尝试从命令行启动它。
我正在开展一个项目,以防止从可移动设备启动应用程序。有谁知道我该怎么做?最好在 Windows 平台上使用 C++。
我的目标是防止执行 exe 文件,即使用户双击它或者即使他尝试从命令行启动它。
假设您希望停止从可移动驱动器启动的任何进程,这似乎是一个外壳挂钩的应用程序。我在过去半小时内编写了以下代码,似乎测试正常。请记住,编写钩子是一个不平凡的过程,而全局钩子需要编写 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:我提供的解决方案是“更友好的”(链接的 DLL 将被卸载等),但不太通用。
如果您想了解编写系统范围挂钩的基础知识,可以在我的网站上找到它们。请注意,上面的代码不是生产质量的代码,我将它破解成一个旧的 ANSI dll,因此缺乏对 Unicode 的支持,或者任何接近体面的调试能力的东西。它显示了基本思想。
您的网络管理员无需编写任何代码即可解决此问题。我们在这里实现了完全相同的东西,以防止员工将客户的私人信息复制到可移动设备上,并且网络管理员自己实现了它,而我们在开发部门不需要做任何事情。我不知道这是否适用于您的情况,但值得考虑。
如果当前磁盘类型是可移动设备,您可以编写从 Main 方法返回的片段。
调用GetCurrentDirectory拆分磁盘名称并使用WMI(这可以帮助)甚至更好的GetDriveType(这可以在这里提供帮助)方法来了解它是否在可移动磁盘上
在我看来,您正在寻找一种通用方法来阻止任何应用程序从已经运行的应用程序从设备上启动。所以本质上是三个问题: 1. 检测新应用程序已经启动 2. 检查它正在运行什么类型的设备 3. 如果你不想要它就强制应用程序死掉
第 1 部分:这是困难的一方,我认为您需要使用 EnumProcess 定期轮询,这不是很好,或者只是检查生成 WM_ACTIVATEAPP 的应用程序
第 2 部分:ArsenMkrt 的解决方案似乎适用于此
第 3 部分:TerminateProcess 应该为您完成