2012-08-04 22 views
26

Tôi đang cố gắng để chèn một số khóa registry đơn giản sử dụng Microsoft.Win32.RegistryKey trong C# nhưng con đường tự động thay đổi từ:Tránh Registry Wow6432Node Redirection

HKEY_LOCAL_MACHINE\SOFTWARE\Test 

để

HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Test 

tôi đã cố gắng google nhưng tôi chỉ nhận được một số kết quả mơ hồ và khó hiểu. Có ai xử lý vấn đề này trước đây không? Một số mã ví dụ sẽ được nhiều appereciated.

+1

thể trùng lặp của [Visual Studio 2010 Thiết lập dự án 64 bit tạo registry vấn đề quan trọng] (http://stackoverflow.com/questions/7384270/visual-studio-2010-setup-project-64-bit-create-registry-key-issue) –

Trả lời

24

Bạn có thể sử dụng RegistryKey.OpenBaseKey để giải quyết vấn đề này:

var baseReg = RegistryKey.OpenBaseKey(RegistryHive.LocalMachine, RegistryView.Registry64); 
var reg = baseReg.CreateSubKey("Software\\Test"); 
+5

chỉ trong .NET 4+ – Kevin

+0

Tôi đã tìm kiếm một ví dụ về cách sử dụng RegistryView.Registry64 và vô tình tìm thấy nó ở đây. Không có tài liệu M $ nào có ví dụ, họ chỉ nói sử dụng nó. Ứng dụng CPU bất kỳ của tôi đã đọc cài đặt wow6432uninstall khi tôi yêu cầu nó đọc cài đặt thường xuyên. Đây là giải pháp – sdjuan

+2

Đừng quên vứt bỏ baseReg! sử dụng (var baseReg = ...) {..} –

7

Theo WOW64, một số khóa đăng ký nhất định được chuyển hướng (PHẦN MỀM). Khi ứng dụng 32 bit hoặc 64 bit thực hiện cuộc gọi đăng ký cho khóa được chuyển hướng, trình chuyển hướng đăng ký chặn cuộc gọi và ánh xạ tới vị trí đăng ký vật lý tương ứng của khóa. Để biết thêm thông tin, hãy xem Registry Redirector.

Bạn có thể sử dụng RegistryView Enumeration trên RegistryKey.OpenBaseKey Method để mở chế độ xem 32 bit một cách rõ ràng và truy cập trực tiếp HKLM \ Software \.

+0

chỉ trong khung .net 4+, ứng dụng .net 3.5 là gì ? – Kevin

+2

@Kevin Trước .net 4 bạn phải gọi API gốc [RegOpenKeyEx] (https://msdn.microsoft.com/en-us/library/ms724897 (VS.85) .aspx) chuyển một trong các [KEY_WOW64_32KEY hoặc KEY_WOW64_64KEY] (https://msdn.microsoft.com/en-us/library/windows/desktop/aa384129 (v = vs.85) .aspx) cờ khi thích hợp. –

10

Tôi không biết cách giải quyết nó bằng tệp .reg. Nhưng chỉ trong một tệp BAT, như sau:

Bạn phải thêm /reg:64 vào cuối dòng lệnh. ví dụ:

REG ADD "HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Authentication\LogonUI\Background" /v "OEMBackground" /t REG_DWORD /d 0x00000001 /f /reg:64 

Nguồn: Wow6432Node and how to Deploy Registry settings to 64 bit systems via Sccm

+0

Rất tuyệt! chính xác những gì tôi đang tìm kiếm, Cảm ơn. – Ron

0

Dưới đây là đoạn code làm việc tôi đã phát triển cho cả đọc và viết ONLY Đăng ký 32 bit. Nó hoạt động trong cả ứng dụng 32 bit và 64 bit. Cuộc gọi 'đọc' cập nhật sổ đăng ký nếu giá trị không được đặt, nhưng nó rất rõ ràng làm thế nào để loại bỏ điều đó. Nó yêu cầu .Net 4.0 và sử dụng các phương thức OpenBaseKey/OpenSubKey.

Tôi hiện đang sử dụng nó để cho phép dịch vụ nền 64 bit và ứng dụng khay 32 bit truy cập cùng một khóa registry liền mạch.

using Microsoft.Win32; 

namespace SimpleSettings 
{ 
public class Settings 
{ 
    private static string RegistrySubKey = @"SOFTWARE\BlahCompany\BlahApp"; 

    public static void write(string setting, string value) 
    { 
     using (RegistryKey registryView = RegistryKey.OpenBaseKey(RegistryHive.LocalMachine, RegistryView.Registry32)) 
     using (RegistryKey registryCreate = registryView.CreateSubKey(RegistrySubKey)) 
     using (RegistryKey registryKey = registryView.OpenSubKey(RegistrySubKey, true)) 
     { 
      registryKey.SetValue(setting, value, RegistryValueKind.String); 
     }   
    } 
    public static string read(string setting, string def) 
    { 
     string output = string.Empty; 
     using (RegistryKey registryView = RegistryKey.OpenBaseKey(RegistryHive.LocalMachine, RegistryView.Registry32)) 
     using (RegistryKey registryCreate = registryView.CreateSubKey(RegistrySubKey)) 
     using (RegistryKey registryKey = registryView.OpenSubKey(RegistrySubKey, false)) 
     { 
      // Read the registry, but if it is blank, update the registry and return the default. 
      output = (string)registryKey.GetValue(setting, string.Empty); 
      if (string.IsNullOrWhiteSpace(output)) 
      { 
       output = def; 
       write(setting, def); 
      } 
     } 
     return output; 
    } 
} 
} 

Cách sử dụng: Đặt điều này trong tập tin lớp riêng của nó (.cs) và gọi nó là như vậy:

using SimpleSettings; 
string mysetting = Settings.read("SETTINGNAME","DEFAULTVALUE");