[英]How to access specific value from deep within Json output in C# console application
[英]What is the reason for different value after reg add from within a C# application and query the value from within a cmd window?
我有一個用 C# 編碼的程序,它打開一個 cmd 控制台並添加/修改一個注冊表值。
在控制台輸出任務完成后,我使用reg query
測試注冊表值是否真的改變了。 沒有問題。 我得到了我預期的值0x1
。
但是,當我從當前 cmd 窗口外部查詢此注冊表時,就像我以管理員身份執行的另一個 cmd 一樣, reg query
上的值為0x0
。
這怎么可能?
這是我的 C# 代碼:
string command = @"/K reg add HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\AppModelUnlock /t REG_DWORD /f /v AllowDevelopmentWithoutDevLicense /d 1";
Process proc = Process.Start("cmd.exe", command);
程序從執行的cmd里面查詢:
reg query HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\AppModelUnlock
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\AppModelUnlock
AllowDevelopmentWithoutDevLicense REG_DWORD 0x1
從外面:
reg query HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\AppModelUnlock
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\AppModelUnlock
AllowDevelopmentWithoutDevLicense REG_DWORD 0x0
AllowAllTrustedApps REG_DWORD 0x0
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\AppModelUnlock\AllowDevelopmentWithoutDevLicense
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\AppModelUnlock\AllowDevelopmentWithoutDevLicense=1
當 64 位 Windows 上的 32 位應用程序訪問注冊表項時
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\AppModelUnlock
它被 Windows 注冊表重定向器重定向到
HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\AppModelUnlock
64 位應用程序由此真正訪問
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\AppModelUnlock
兩個注冊表路徑之間的區別在於, Wow6432Node
默認僅對 Windows x64 上的 64 位應用程序可見。
請參閱 Microsoft 開發人員文章受 WOW64 影響的注冊表項。
為了完整起見,另請參見:
在 64 位 Windows目錄%SystemRoot%\\SysWow64
中有 32 位cmd.exe
和reg.exe
是%SystemRoot%\\System32
用於 32 位應用程序和 64 位cmd.exe
和reg.exe
在%SystemRoot%\\System32
。
您的 C# 應用程序很可能被編譯為 32 位應用程序,因此調用 32 位cmd.exe
調用 32 位reg.exe
。
您可以通過顯式調用%SystemRoot%\\Sysnative\\cmd.exe
從 32 位應用程序中解決此問題。
但請注意, %SystemRoot%\\Sysnative
在 32 位 Windows 上不存在,對於 64 位 Windows 上的 64 位應用程序也不存在。 ( Sysnative
是一個特殊的別名,不是硬鏈接、聯結或真正的文件夾。)
因此,您的 32 位 C# 應用程序需要首先檢查%SystemRoot%\\Sysnative\\cmd.exe
存在,並使用此路徑使用 64 位cmd
和reg
編輯 64 位注冊表值。 但在 32 位 Windows 上, %SystemRoot%\\System32.exe\\cmd.exe
必須由 32 位 C# 應用程序調用。 順便說一句: %SystemRoot%
引用了環境變量SystemRoot的值。
另請參閱有關以下內容的答案:
注 1:
根本不需要運行cmd.exe
。 可以直接在 32 位 Windows 上運行
%SystemRoot%\System32\reg.exe
或在 64 位 Windows 上
%SystemRoot%\Sysnative\reg.exe
來自 32 位應用程序。
注 2:
最后但並非最不重要的是,C# 應用程序根本不需要使用reg.exe
,因為 .NET Framework 具有對訪問 Windows 注冊表的內置支持 - Registry.SetValue Method 。 微軟甚至在示例代碼塊中添加了一些示例。
KEY_WOW64_64KEY可用於 32 位應用程序以始終顯式訪問 64 位注冊表項,如 Microsoft 文檔頁面訪問備用注冊表視圖中所述。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.