我正在开发一个项目,以防止从可移动设备启动应用程序。 有没有人知道我能做到这一点?最好在Windows平台上使用C++。如何停止执行应用程序
我的目标是防止执行exe文件,即使用户双击它,或者即使他试图从命令行启动它。
我正在开发一个项目,以防止从可移动设备启动应用程序。 有没有人知道我能做到这一点?最好在Windows平台上使用C++。如何停止执行应用程序
我的目标是防止执行exe文件,即使用户双击它,或者即使他试图从命令行启动它。
假设您希望停止从可移动驱动器启动任何进程,这似乎是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的支持,或者任何接近体面调试功能的东西。它显示了基本的想法。
即使在修改此代码以使用TerminateProcess之后,我也确信(从过去的经验来看),这对于控制台应用程序来说不起作用。这是因为控制台应用程序的处理方式与通过csrss.exe(某种“控制台服务器”)处理其消息循环的窗口应用程序的处理方式不同。我无法从你的回答中完全理解这种解决方案在这种情况下是否合适。 –
控制台应用程序不是一个GUI过程,所以不,我发布的代码不适用于控制台应用程序。我对TerminateProcess的评论涉及忽略WM_CLOSE的应用程序,而不是控制台应用程序。我认为OP需要对确切的要求更清楚一些:获得适用于所有情况的一些东西是非常棘手的。可能这个代码是足够的,但只有他可以澄清确切的意图。 –
如果当前磁盘类型是可移动设备,则可以编写从Main方法返回的代码片段。
呼叫GetCurrentDirectory拆分磁盘名称,并使用WMI(this可以帮助),或者甚至更好GetDriveType(this可以帮助这里)方法知道的是,它可移动磁盘上或不
简单的解决方案。你只是在启动时测试它,如果它不是从硬盘驱动器退出。 – Goz
他需要那个,不是吗? –
我看来,你正在寻找一种通用的方法来停止正在运行的应用程序从设备启动的应用程序。 所以基本上三个问题: 1.检测新应用程序已启动 2.检查正在运行什么类型的设备关闭 3.强制应用到死,如果你不希望它
1部分:这是困难的舞会上,我认为你需要可以使用EnumProcess定期是不是伟大,只是检查其产生WM_ACTIVATEAPP应用调查
第2部分:ArsenMkrt的解决方案似乎是恰当的这个
3部分: TerminateProcess应该为你做
您的网络管理员可以在不需要编写任何代码的情况下处理该问题。我们在这里实现了完全相同的目的,以防止员工将客户私人信息复制到可移动设备的可能性,并且网络管理员在开发部门需要做任何事情时没有我们自己实现它。我不知道这是否会适用于您的情况,但值得考虑。
尝试:开始 - >运行 - >“secpo.msc” - >安全设置 - >软件限制策略 - >其他规则,右键单击 - >新路径规则。应该可以编写一个应用程序来进行设置。 – Skizz
您对复数“应用程序”的使用似乎表明您要停止从可移动驱动器运行的任何应用程序。是这种情况,还是你想阻止你的应用程序从可移动驱动器运行?我的答案假设前者,而不是后者。 –
不知道,你想让你的应用拒绝运行,如果它驻留在可移动存储上? –
不是我只是想停止可能尝试从可移动设备启动的新可执行文件 –