2008-10-02 212 views
10

彈出在Vista UAC對話框時寫入HKLM註冊表配置單元,我們選擇不使用Win32註冊表API,因爲Vista權限缺乏的時候,我們就需要重新啓動我們的管理員權限整個應用程序。相反,我們做這一招:如何從32位代碼啓動64位Windows進程?

ShellExecute(hWnd, "runas" /* display UAC prompt on Vista */, windir + "\\Reg", "add HKLM\\Software\\Company\\KeyName /v valueName /t REG_MULTI_TZ /d ValueData", NULL, SW_HIDE); 

這個解決方案工作得很好,除了我們的應用程序是一個32位的一個,和它運行REG.EXE命令,因爲它會使用是一個32位的應用程序WOW兼容層! :(如果REG.EXE從命令行運行,它的正確運行在64位模式。這一點很重要,因爲如果它跑了作爲一個32位應用程序,註冊表項將在錯誤的地方結束,由於registry reflection

那麼有什麼辦法可以從32位應用程序以編程方式啓動64位應用程序,而不是使用WOW64子系統(如其父級32位進程)運行(即任務管理器中的「*」後綴)?

回答

11

試試這個(從32位進程):

> %WINDIR%\sysnative\reg.exe query ... 

(發現here)。我已經爲我自己的解決方案做

2

你有沒有考慮設立一個小型的「助手」應用程序使註冊表更新嗎?如果你把它編譯成64位,其中包括一個清單,表示它需要管理員權限,那麼它會替你兩個基地。

有API檢測你正在運行的操作系統的「比特性」,所以你可以想象,編譯RegistryUpdate32.exe和RegistryUpdate64.exe並調用相關的。

8

無論是32位或64位的天然(非託管)程序運行完全取決於可執行文件。在C:\ Windows \ System32(64位)和C:\ Windows \ SysWOW64(32位)中有reg.exe的兩個副本。因爲你不指定路徑,你要什麼先在PATH環境變量,它是32位版本的32位過程中出現。

你應該把這個功能放到一個單獨的程序或COM對象中,並用清單標記程序,或使用COM elevation moniker啓動COM對象。

+0

不要忘記的是,由於文件系統重定向(或任何MS調用它),試圖在32位進程打開/ EXEC「C:\ WINDOWS \ SYSTEM32 \ foo.exe的」將有一個文件打開/除非採取特定的措施禁用重定向,否則exec將自動重定向到「C:\ windows \ SysWow64 \ foo.exe」。 – 2008-10-02 20:08:14

+0

是的,邁克,這是我注意到我作爲一個「答案」後注意到的。那就是 - 我實際上已經*在我的測試中寫了完整的「System32」路徑,所以它應該選擇了64位版本,但是沒有。我認爲這是你指出的原因。 :) – Jonas 2008-10-02 21:22:56