2009-08-10 73 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

相關問題