Windows系统上的环境变量传播

时间:2009-08-10 08:57:58

标签: windows environment-variables

可以在已经打开的应用程序中传播Windows变量创建或修改后的值(Windows的环境变量),而不必重新启动转向的应用程序?

如何?

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

3 个答案:

答案 0 :(得分:3)

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

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

答案 1 :(得分:3)

是的,这是可能的。

方式

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

  1. 创建一个帮助器dll。除了设置要设置的环境变量之外,dll不执行任何操作。它可以从DllMain执行此操作而不会导致任何问题。只是不要对来自DllMain内部的其他函数调用感到生气。如何与DLL通信要设置哪些变量以及设置它们的值由您决定(读取文件,从注册表中读取...)

  2. 枚举您要更新的所有进程(toolhelp32将对此有所帮助)。

  3. 对于您希望更新的每个进程,请注入您的帮助程序DLL。 CreateRemoteThread()将有助于此。对于NT 4上的所有应用程序,这将失败2%,在XP上升至5%。很可能Vista / 7和服务器版本的百分比失败率更高。

  4. 您必须与之共存的事物:

    如果您在64位操作系统上运行32位进程,CreateRemoteThread将无法在100%的时间内将您的DLL注入32位应用程序(并且无论如何都无法注入64位应用程序,因为这是64位工作位app)。

    编辑:结果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;
    }
    

答案 2 :(得分:1)

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