可以在已经打开的应用程序中传播其创建或修改后的Windows变量的值(Windows的环境变量)而无需重新启动转换的应用程序?Windows系统上的环境变量传播
如何?
也许,使用服务器故障发布这样的问题会更好?
可以在已经打开的应用程序中传播其创建或修改后的Windows变量的值(Windows的环境变量)而无需重新启动转换的应用程序?Windows系统上的环境变量传播
如何?
也许,使用服务器故障发布这样的问题会更好?
不,我很确定这是不可能的。
类似SendMessage(HWND_BROADCAST,WM_WININICHANGE,0,"Environment")
是最好的选择,但大多数应用程序都会忽略它,但资源管理器应该处理它。
如果您想进入疯狂的无证土地,您可以使用WriteProcessMemory并在您有权访问的每个进程中更新环境块。
有趣,事实上,这似乎是不可能迫使一个正在运行的进程,以更新其环境变量,除非是以前计划的。 – pindare 2009-08-12 08:35:52
是的,这是可能的。
方法
它参与虽然。我将概述基本步骤。每个步骤的详细信息都记录在Web上的许多地方,包括Stack Overflow。
创建一个帮手DLL。除了设置你想要设置的环境变量之外,dll什么都不做。它可以从DllMain做到这一点,而不会造成任何问题。只是不要因DllMain中的其他函数调用而生气。如何与DLL进行通信设置哪些变量以及设置它们的值由您决定(读取文件,从注册表中读取...)
枚举您希望更新的所有进程(toolhelp32将帮助这个)。
对于你想更新的每个进程,注入你的helper dll。 CreateRemoteThread()将对此有所帮助。 NT 4上所有应用程序的2%会失败,XP上升到5%。 Vista/7和服务器版本的失败率最高。
事情你不得不忍受:
如果您是在64位操作系统上运行32位进程,远程线程将无法以注入DLL到32位应用程序的时间100% (无论如何,无法注入64位应用程序,因为这是64位应用程序的工作)。
编辑︰结果100%是不正确的。但它非常受打击和错过。不要依赖它。
如果你不想让你的助手DLL一直驻留在目标应用程序,为DLL_PROCESS_ATTACH通知返回FALSE不要一直驻留
。
BOOL APIENTRY DllMain(HANDLE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved)
{
if (ul_reason_for_call == DLL_PROCESS_ATTACH)
{
// set our env vars here
SetEnvironmentVariable("weebles", "wobble but they don't fall down");
// we don't want to remain resident, our work is done
return FALSE;
}
return TRUE;
}
+1,努力推进一点,你知道如何将这些改变传播给注册表(一些注册表引用环境变量,这些变量也需要刷新),我只是不知道API调用。 – zinking 2013-12-16 06:23:37
是的,使用regedit查找环境变量的存储位置(两个位置,32或64位操作系统,64位操作系统,一个32位子系统)。然后编写导航到注册表中适当位置的代码。写入适当的值。它涉及到混乱但不难。 – 2014-01-22 11:00:31
我同意你的观点,如果我从来没有耳朵的东西有关Windows的传播通过在命令行修改变量:净 – pindare 2009-08-10 09:19:17