2012-06-07 24 views
9

tôi đã cố gắng để viết một khóa registry và giá trị tương ứng của nó phải đăng kiểm như thế này:Tại sao sổ đăng ký được viết ở vị trí khác với mong đợi?

const string subKey = @"SOFTWARE\Apple\Banana\"; 
const string regKey = "pip"; 

var rk = Registry.LocalMachine.OpenSubKey(subKey); 
if (rk == null) 
    rk = Registry.LocalMachine.CreateSubKey(subKey); 

var rv = rk.GetValue(regKey); 
if (rv == null) 
    rk.SetValue(regKey, "XXX"); 

return rv.ToString(); 

Bây giờ vấn đề là tôi khi tôi nhìn vào vị trí bằng tay (thông qua regedit) Tôi không thể nhìn thấy thư mục SOFTWARE\Apple\Banana trong HKLM .

Nhưng khi tôi chạy lại mã ở trên và gỡ lỗi, tôi có thể thấy rằng cả hai Registry.LocalMachine.OpenSubKey(subKey)rk.GetValue(regKey) đều mang lại giá trị được lưu trước đó. Tuy nhiên, tôi không thấy các giá trị ở vị trí đã cho qua regedit. Vì vậy, về tìm kiếm trên registry, tôi có thể thấy các phím và các giá trị ở trên tại các địa điểm sau:

  1. HKEY_CURRENT_USER\Software\Classes\VirtualStore\MACHINE\SOFTWARE\Apple\Banana

  2. HKEY_USERS\S-1-5-21-44266131-1313801407-2392705078-1000\Software\Classes\VirtualStore\MACHINE\SOFTWARE\Apple\Banana

Dưới cả đó các giá trị vẫn còn chính xác như tôi đã lưu. Vì vậy, tôi nhận ra điều này là từ nơi ứng dụng của tôi đọc giá trị mặc dù trong mã của tôi, tôi gọi nó là từ HKLM\SOFTWARE\Apple\Banana\ ..

  1. Tại sao điều này xảy ra? Có liên quan đến vấn đề quyền truy cập không?

  2. Hành vi này có được mong đợi không? Trong ý nghĩa, giá trị này rất quan trọng đối với tôi, vì vậy tôi chỉ biết nếu có một số rủi ro liên quan đến việc tự động di chuyển!

  3. Có một cách thích hợp bằng văn bản cho registry để nó vẫn ở vị trí chính xác của nó ..

tài khoản của tôi là quản trị viên một, và tôi đang sử dụng 32 cửa sổ chút 7.

Chỉnh sửa: Như tôi đã biết, mục đăng ký được lưu trữ trong vị trí người dùng hiện tại chứ không phải là HKLM. Và khi tôi truy vấn giá trị reg từ một tài khoản khác, tôi không nhận được giá trị. Nói tóm lại, không có điểm trong đầu tiên của tất cả các lưu nó vào HKLM :(

+0

Trả lời nhận xét của bạn "nhưng điều này có nghĩa là người dùng trong tương lai truy vấn cùng một vị trí trong hklm sẽ không nhận được giá trị nằm trong vị trí người dùng hiện tại? Ok tôi sẽ kiểm tra nó" - có. HLM trong sổ đăng ký và tệp chương trình và thư mục ProgramData chỉ nên được ghi vào khi thiết lập. Chỉ quản trị viên mới có thể viết ở đó nếu không (và chỉ với độ cao nếu UAC được bật). –

+0

@DannyVarod Tôi không nhận được câu đầu tiên của bạn. Dù sao khi tôi thử nghiệm, tôi đã biết rằng ảo hóa không giúp bạn nếu bạn muốn có cùng giá trị đăng ký cho tất cả người dùng. – nawfal

+0

Có nhiều vị trí khác nhau trong Windows 6+ có nghĩa là chỉ giữ dữ liệu thiết lập và có các vị trí khác có nghĩa là giữ dữ liệu có thể định cấu hình hoặc dữ liệu thay đổi trong thời gian chạy. Trong quá trình thiết lập, người dùng được cấp quyền ghi vào các vị trí thiết lập (bởi quản trị viên qua UAC). Trong thời gian chạy cửa sổ ngăn truy cập vào các vị trí này trừ khi người dùng là quản trị viên. (Không phải quản trị viên không nên ảnh hưởng đến những người dùng khác.) –

Trả lời

5

Có hành vi đúng và điều này xảy ra vì bạn không có đủ đặc quyền để ghi trực tiếp vào hòm HKLM. Nó được gọi là ảo hóa và xảy ra cho hệ thống tập tin là tốt, nó đã là một hành vi trong hệ điều hành kể từ Vista.

Bạn nên tiếp tục như bạn đang cố gắng đọc và đọc từ cùng một khóa HKLM bạn đang ghi, Windows sẽ chuyển hướng rõ ràng cho bạn.

Cài đặt trước có kindly provided liên kết MSDN mà bạn nên đọc kỹ. Lưu ý rằng khi bạn truy cập khóa dưới HKLM, bạn cũng nên bao gồm quyền bạn muốn, ngay cả khi bạn đang chạy với tư cách quản trị viên (vì khóa không tự động được mở bằng quyền quản trị, bạn phải yêu cầu):

key = key.OpenSubKey(keyname, RegistryKeyPermissionCheck.ReadWriteSubTree, RegistryRights.FullControl); 
+0

nhưng điều này không có nghĩa là người dùng trong tương lai sẽ truy vấn cùng một vị trí trong hklm sẽ không nhận được giá trị nằm ở vị trí người dùng hiện tại? Ok, tôi sẽ thử nghiệm nó .. – nawfal

+0

cảm ơn cho các mẹo bổ sung – nawfal

+0

Tôi đang gặp vấn đề tương tự, nhưng tôi đang cố gắng để lưu một khóa kích hoạt để đăng ký. Tôi muốn chìa khóa là giống nhau cho tất cả người dùng, liệu sự lộn xộn ảo hóa này có xảy ra không? – Alan

4
  1. This is Registry Virtualization (msdn)

    Registry ảo hóa là một công nghệ tương thích ứng dụng cho phép hoạt động đăng ký ghi rằng có tác động toàn cầu là chuyển hướng Chuyển hướng này minh bạch tới ứng dụng đọc hoặc ghi vào sổ đăng ký. Nó được hỗ trợ bắt đầu bằng Windows Vista.

    Tổng quan về ảo hóa

    Trước Windows Vista, các ứng dụng là thường do quản trị viên điều hành. Kết quả là, các ứng dụng có thể truy cập miễn phí các tệp hệ thống và khóa đăng ký. Nếu các ứng dụng này được điều hành bởi người dùng chuẩn, chúng sẽ thất bại do không đủ quyền truy cập .Windows Vista và các phiên bản sau của Windows cải thiện khả năng tương thích ứng dụng cho các ứng dụng này bằng cách tự động chuyển hướng các hoạt động này. Ví dụ: các hoạt động đăng ký cho cửa hàng toàn cầu (HKEY_LOCAL_MACHINE \ Software) được chuyển hướng đến một vị trí trên mỗi người dùng trong hồ sơ của người dùng được gọi là cửa hàng ảo (HKEY_USERS \ _Classes \ VirtualStore \ Machine \ Software).

  2. Có đúng như mong đợi.

  3. Hoặc sống với Ảo hóa nếu bạn muốn ghi vào vị trí ảnh hưởng toàn cầu hoặc sử dụng nhiều vị trí được bản địa hóa hơn nếu bạn không muốn. Dù bằng cách nào nó vô hình với người đọc, vì vậy đừng lo lắng về nó.

+0

+1, bạn đã bao gồm liên kết :) – slugster

+0

@slugster - Tôi nghĩ rằng điều quan trọng là phải đặt liên kết đến văn bản được trích dẫn hoặc mẫu/blog của người khác. –

+0

nhưng điều này không có nghĩa là người dùng trong tương lai truy vấn cùng một vị trí trong hklm sẽ không nhận được giá trị nằm trong vị trí người dùng hiện tại? Ok tôi sẽ kiểm tra nó anyway .. – nawfal

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