簡體   English   中英

從 C# 應用程序中添加 reg 並從 cmd 窗口中查詢值后,出現不同值的原因是什么?

[英]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.exereg.exe%SystemRoot%\\System32用於 32 位應用程序和 64 位cmd.exereg.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 位cmdreg編輯 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM