2009-08-10 72 views
0

可以在已经打开的应用程序中传播其创建或修改后的Windows变量的值(Windows的环境变量)而无需重新启动转换的应用程序?Windows系统上的环境变量传播

如何?

也许,使用服务器故障发布这样的问题会更好?

回答

1

不,我很确定这是不可能的。

+0

我同意你的观点,如果我从来没有耳朵的东西有关Windows的传播通过在命令行修改变量:净 – pindare 2009-08-10 09:19:17

3

类似SendMessage(HWND_BROADCAST,WM_WININICHANGE,0,"Environment")是最好的选择,但大多数应用程序都会忽略它,但资源管理器应该处理它。

如果您想进入疯狂的无证土地,您可以使用WriteProcessMemory并在您有权访问的每个进程中更新环境块。

+0

有趣,事实上,这似乎是不可能迫使一个正在运行的进程,以更新其环境变量,除非是以前计划的。 – pindare 2009-08-12 08:35:52

3

是的,这是可能的。

方法

它参与虽然。我将概述基本步骤。每个步骤的详细信息都记录在Web上的许多地方,包括Stack Overflow。

  1. 创建一个帮手DLL。除了设置你想要设置的环境变量之外,dll什么都不做。它可以从DllMain做到这一点,而不会造成任何问题。只是不要因DllMain中的其他函数调用而生气。如何与DLL进行通信设置哪些变量以及设置它们的值由您决定(读取文件,从注册表中读取...)

  2. 枚举您希望更新的所有进程(toolhelp32将帮助这个)。

  3. 对于你想更新的每个进程,注入你的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; 
} 
+0

+1,努力推进一点,你知道如何将这些改变传播给注册表(一些注册表引用环境变量,这些变量也需要刷新),我只是不知道API调用。 – zinking 2013-12-16 06:23:37

+0

是的,使用regedit查找环境变量的存储位置(两个位置,32或64位操作系统,64位操作系统,一个32位子系统)。然后编写导航到注册表中适当位置的代码。写入适当的值。它涉及到混乱但不难。 – 2014-01-22 11:00:31

相关问题