可以在已經打開的應用程序中傳播其創建或修改後的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