2011-11-21 31 views
9

Tôi stumped trên một cửa sổ 7 vấn đề đăng ký và trong khi câu hỏi và câu trả lời khác nhau giúp tôi có một số cách có, nothings tôi đã nhìn thấy địa chỉ vấn đề cụ thể của tôi. Tôi không biết nếu các phiên bản cửa sổ khác ảnh hưởng đến vấn đề này, nhưng tất cả chúng ta đều có máy win7x64.Tại sao tôi không thể đọc chính xác giá trị đăng ký 32 bit trong HKCU trên máy 64 bit?

Chúng tôi có nhiều công cụ trong công việc, một số C++, một số C#, một số python (2.6), v.v. Chúng tôi cũng chạy một công cụ 32 và 64 bit. Trong quá khứ, chúng tôi đã lưu trữ thông tin đăng ký một cách vui vẻ trong HKLM. Chúng tôi đã làm việc để chuyển nội dung vào HKCU. Chúng tôi đã có rất nhiều cuộc thảo luận về việc có nên thực hiện điều này hay không, ảnh hưởng đến UAC, v.v. Chúng tôi thực sự muốn thử và thực hiện bước này. Điều đó nói rằng:

Chúng tôi đang gặp sự cố khi đọc/ghi các khóa đăng ký trong HKCU/software/CompanyABC/App. Chúng tôi có một ứng dụng thiết lập viết trong python mà viết ra các khóa registry đến vị trí trên bằng cách sử dụng _winreg. Có hay không chúng tôi chỉ định KEY_WRITE | KEY_WOW64_32KEY hoặc chỉ KEY_WRITE, các giá trị nhận được writte thành HKCU/Software/WOW6432Node/companyABC/app. Khỏe.

Sau đó, tôi có một ứng dụng C# cố đọc các giá trị này. Sử dụng Microsoft.Win32.Registry, tôi mở khoá con ('HKCU/Software/CompanyABC/app') và tôi không thấy giá trị của mình. Hóa ra tôi thấy hành vi sau:

  • Khi đọc/ghi khóa đăng ký từ HKLM, tất cả những thứ này chỉ hoạt động. Ứng dụng python sẽ ghi vào HKLM/Softare/Wow6432Node/CompanyABC/app và mã C# sẽ đọc từ vị trí đó. Tất cả điều này cũng có ý nghĩa đúng đắn, với cách chúng tôi đang xây dựng các ứng dụng C# của chúng tôi và viết các giá trị đăng ký qua python
  • Đọc/ghi các giá trị đăng ký từ HKCU, tôi nhận được hành vi khác. Các hàm _winreg sẽ ghi vào HKCU/Sofrware/Wow6432Node/CompanyABC/app, nhưng ứng dụng C# sẽ đọc từ HKCU/Software/CompanyABC/app. Ứng dụng C# được xây dựng dưới dạng ứng dụng x86 (không phải CPU nào và không phải là x64) nên tôi cho rằng ứng dụng sẽ được chuyển hướng đến wow6432Node đúng cách, nhưng dường như không.

sau khi điều tra, có vẻ như HKCU/Phần mềm khác nhau. This bài viết dường như chỉ ra rằng khu vực này là "được chia sẻ" và không được chuyển hướng. Nếu đó là trường hợp, thì tôi không thể hiểu tại sao ứng dụng python của chúng tôi (một lần nữa, bằng cách sử dụng _winreg) được ghi vào một vị trí trong HKCU sử dụng Wow6432Node - có vẻ như nó nên viết nó mà không có chuyển hướng đó. Tôi cho rằng nó có thể là một lỗi trong _winreg.

Tôi thực sự muốn tránh bị hack trên WOW6432Node một cách rõ ràng trong các công cụ của chúng tôi, nhưng đó là nơi tôi đang ở ngày hôm nay. Bất cứ ai có thể giải thích cho tôi làm thế nào tôi có thể thực hiện đăng ký truy cập từ 32 và 64 bit quy trình vào HKCU làm việc một cách chính xác mà không cần phải nghỉ mát để đường dẫn mã cứng vào hive 32bit?

+0

Khi tôi lần đầu tiên chuyển sang Windows Vista, toàn bộ hệ thống ảo hóa đăng ký (trên đầu các vấn đề 32/64-bit) khiến tôi quyết định không bao giờ sử dụng lại đăng ký. Tôi hiểu điều này có thể không thực hiện được, nhưng nếu bạn * có thể * chuyển sang mục khác (ví dụ: tệp cấu hình), tôi thực sự khuyên bạn nên làm như vậy. –

+0

Không thể tái tạo điều này. Đối với tôi, Python 2.6.6 (32 và 64 bit) trên Windows 7 64 bit đọc/ghi đến/từ HKCU/Software/companyABC/app như mong đợi (không phải HKCU/Software/WOW6432Node/companyABC/app). – cgohlke

+0

Cảm ơn cgohlke. Tôi sẽ xem xét lại những gì đang xảy ra ở đây. Tôi đánh giá cao sự theo dõi. – Mark

Trả lời

4

Tôi hiểu ý kiến ​​về vấn đề này đã biến mất, đối với bất kỳ ai khác gặp phải câu hỏi này, bạn có thể sử dụng Microsoft.Win32.OpenBaseKey để chỉ định xem có mở phần 64 hoặc 32 bit của sổ đăng ký không khi chạy trên Máy 64 bit ngay cả khi quá trình của bạn đang chạy dưới dạng quy trình 32 bit.

Nếu bạn luôn muốn truy cập các phím trong phần NON-WOW6432Node của sổ đăng ký, thì bạn có thể thiết lập một cách an toàn tham số Xem của OpenBaseKey thành RegistryView .Registry64. Điều này sẽ hoạt động chính xác trên cả hai hệ điều hành 64 và 32 bit.

Các vấn đề liên quan