4

我有一個批處理文件,將一個目錄複製到一個新位置,創建2個其他.bat文件,2個.json文件和插入註冊表項。當爲命令行運行批處理腳本時,我不會遇到任何錯誤和所有期望的結果。從生成後事件命令行運行它時,我沒有得到任何錯誤,但我缺少註冊表項。同事建議,這可能是由於Visual Studio沒有管理員權限,而命令行可以。我的問題是:有沒有辦法(沒有運行Visual Studio作爲管理員)提升生成後事件的權限?如果你想知道爲什麼不直接以管理員身份運行VS,那是因爲這個解決方案是通過TFS共享的,並不是所有的同事都知道他們將VS的實例作爲管理員運行在這個特定的解決方案上。我已經沒有任何東西可以顯示它了。預先感謝您的幫助!這是我正在使用的Post-build事件命令行。我再次知道它的工作原理......它只是不填充註冊表值。 CMD的確如此。 PS。在Windows 7使用VS 2013提升權限到Visual Studio後生成事件批處理腳本

if $(ConfigurationName) == Debug call "$(ProjectDir)BatchFiles\DebugHelper.bat" "$(TargetDir)" C:\CEC\Batch\Test\ 
+0

如果你是在64位有可能你正在查看錯誤位的密鑰。有些密鑰是虛擬化的,因此32位和64位程序認爲它是相同的密鑰,但引擎蓋下是完全不同的密鑰,這也適用於'system32'文件夾。 'HKEY_LOCAL_MACHINE \ Software' 'HKEY_USERS \ * \ Software \ Classes' 'HKEY_USERS \ * _ Classes' – Trigger

+0

好的....那我該怎麼辦?我的.bat文件執行HKLM \ Software \ Google \ Chrome \ NativeMessagingHosts \ abc.def.ghi – MegaMark

回答

1

這是從Windows SDK約重定向(這裏還反射和共享)

註冊表重定向

註冊表重定向器隔離32位和通過在WOW64上提供獨立的註冊表關鍵部分邏輯視圖來實現64位應用程序。註冊表重定向程序截取到每個邏輯註冊表視圖的32位註冊表調用,並將它們映射到相應的物理註冊表位置。重定向過程對於應用程序是透明的。因此,即使數據存儲在64位Windows上的不同位置,32位應用程序也可以像訪問32位Windows一樣訪問註冊表數據。

重定向爲以下注冊表鍵激活:

HKEY_LOCAL_MACHINE\Software 
HKEY_USERS\*\Software\Classes 
HKEY_USERS\*_Classes 
Note * indicates a match for all user security IDs (SID). 

下面的方案說明使用它們的邏輯的觀點:

32位應用程序檢查的所述所有腦幹以下注冊表項:HKEY_LOCAL_MACHINE \ Software \ Hello。如果密鑰不存在,它將以默認值「Hello 32-bit world」創建它;否則,它讀取並顯示該值。 將相同的應用程序修改爲編寫「Hello 64位世界」而不是「Hello 32位世界」,並重新編譯爲64位應用程序。

當32位應用程序在64位Windows上運行時,它將顯示「Hello 32-bit world」。當64位應用程序運行時,它會顯示「Hello 64-bit world」。兩個應用程序都使用相同的預定義句柄和相同的密鑰名稱調用相同的註冊表函數;不同之處在於每個應用程序都在其註冊表的邏輯視圖上運行,並且每個視圖都映射到註冊表的一個單獨的物理位置,從而使字符串的兩個版本保持不變。

爲了幫助將包含%ProgramFiles%的REG_EXPAND_SZ鍵寫入註冊表的應用程序,WOW64攔截這些寫入,並用「%ProgramFiles(x86)%」替換它們。這個環境變量是爲所有進程定義的。例如,如果Program Files目錄位於C驅動器上,則「%ProgramFiles(x86)%」擴展爲「C:\ Program Files(x86)」。

爲了通過COM和其他機制啓用應用程序互操作性,WOW64使用註冊表反射,該注入反射在兩個註冊表視圖之間複製特定的註冊表項和值以保持它們同步。該反射器是智能的,並且在視圖之間複製本地服務器的COM激活數據,但不復制正在處理的數據,因爲在64位Windows上不允許32/64進程內數據混合。

怎麼辦

在程序

KEY_WOW64_64KEY 0x0100 Access a 64-bit key from either a 32-bit or 64-bit application. 
Windows 2000: This flag is not supported. 

KEY_WOW64_32KEY 0x0200 Access a 32-bit key from either a 32-bit or 64-bit application. 
Windows 2000: This flag is not supported. 

從命令提示符處看到reg flags /?讓你的鑰匙退出重定向。

並提醒UAC也可能將其虛擬化。因爲它會將一些寫入HKLM的內容重定向到HKCU。授予用戶寫入密鑰的權限將會克服這一點。

+0

經過一段時間後,我的頭圍繞着它......它實際上是完全有意義的。 CMD將關鍵字添加到32位註冊表位置,而Visual Studio正在寫入64位位置(即使VS本身是32位......我猜是因爲操作系統是64位的?)謝謝束!!! – MegaMark