2012-06-07 19 views
9

Próbowałem napisać podklucz rejestru i jego odpowiednią wartość do rejestru tak:Dlaczego rejestr jest zapisany w innym miejscu niż oczekiwano?

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(); 

Teraz problemem jest to, że kiedy patrzę w miejscu ręcznie (poprzez regedit) Nie widzę folder SOFTWARE\Apple\Banana w HKLM .

Ale po ponownym uruchomieniu powyższego kodu i debugowaniu, widzę, że zarówno Registry.LocalMachine.OpenSubKey(subKey) i rk.GetValue(regKey) daje wcześniej zapisane wartości. Jednak nie widzę wartości w danej lokalizacji za pośrednictwem regedit. Więc na przeszukiwanie rejestru, widzę powyższe klucze i wartości w następujących miejscach:

  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

pod obiema których wartości pozostają dokładnie tak, jak zapisane. Więc zdaję sobie sprawę, to skąd moja aplikacja odczytuje wartość chociaż w moim kodu I zadzwonić z HKLM\SOFTWARE\Apple\Banana\ ..

  1. Dlaczego tak się dzieje? Czy jest to związane z problemem praw dostępu?

  2. Czy to oczekiwane zachowanie? W tym sensie ta wartość jest dla mnie bardzo ważna, więc wiem tylko, czy istnieje ryzyko związane z automatyczną relokacją!

  3. Czy istnieje właściwy sposób zapisu do rejestru tak, że pozostaje w jego dokładną lokalizację ..

Moje konto administratora, a ja jestem przy 32-bitowych Windows 7.

Edycja: Jak się dowiedziałem, wpis rejestru jest przechowywany w bieżącej lokalizacji użytkowników, a nie w HKLM. A kiedy wyszukuję wartość reg z innego konta, nie otrzymuję wartości. W skrócie, w żadnym momencie przede wszystkim oszczędność go do HKLM :(

+0

Odpowiedź na twój komentarz "ale czy to nie oznacza, że ​​przyszły użytkownik zapytany o tę samą lokalizację w hklm nie otrzyma wartości, która znajduje się w bieżącej lokalizacji użytkownika? Ok I tak go przetestuję" - tak. HLM w katalogach rejestru i plików programów i katalogów programu należy zapisywać tylko podczas konfiguracji. Tylko administratorzy mogą zapisywać tam w inny sposób (i tylko z podniesieniem jeśli UAC jest włączony). –

+0

@DannyVarod Nie dostałem twojego pierwszego zdania. W każdym razie, kiedy testowałem, dowiedziałem się, że wirtualizacja nie pomoże, jeśli chcesz uzyskać tę samą wartość rejestru dla wszystkich użytkowników. – nawfal

+0

Istnieją różne lokalizacje w systemie Windows 6+, które są przeznaczone tylko do przechowywania danych konfiguracji i są inne lokalizacje, które są przeznaczone do przechowywania konfigurowalnych danych lub danych, które zmieniają się podczas działania. Podczas instalacji użytkownicy otrzymują pozwolenie na zapis do lokalizacji instalacji (przez administratora za pośrednictwem UAC). W czasie działania systemu okna uniemożliwiają dostęp do tych lokalizacji, chyba że użytkownik jest administratorem. (Non admins nie powinno wpływać na innych użytkowników.) –

Odpowiedz

5

Tak, to jest prawidłowe zachowanie i dzieje się tak, ponieważ nie masz wystarczających uprawnień, by pisać bezpośrednio do gałęzi HKLM. Nazywa się to wirtualizacją i dzieje się również w systemie plików, było to zachowanie w systemie operacyjnym od czasów Vista.

Powinieneś kontynuować, tak jak i próbować odczytać również z tego samego klucza HKLM, do którego piszesz, system Windows przekieruje za Ciebie.

Preet ma kindly provided łącze MSDN, które należy dokładnie przeczytać.

Zauważ, że gdy masz dostęp do klucza pod HKLM powinien również obejmować uprawnienia chcesz, nawet jeśli są uruchomione jako administrator (bo klucz nie jest automatycznie otwierany z uprawnieniami administratora, trzeba go poprosić):

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

, ale nie oznacza to, że przyszły użytkownik będzie tej samej lokalizacji w hklm nie otrzymasz wartości, która znajduje się w aktualnej lokalizacji użytkowników? OK I tak go przetestuję. – nawfal

+0

dzięki za dodatkową wskazówkę – nawfal

+0

Mam ten sam problem, ale próbuję zapisać klucz aktywacyjny do rejestru. Chcę, aby klucz był taki sam dla wszystkich użytkowników, czy ten bałagan wirtualizacyjny się skończy? – Alan

4
  1. This is Registry Virtualization (msdn)

    Registry wirtualizacja jest technologią kompatybilność aplikacji który umożliwia operacje zapisu rejestru, które mają wpływ na globalną być przekierowany do lokalizacji poszczególnych użytkowników To przekierowanie jest niewidoczne dla aplikacji odczytywanych z rejestru lub zapisujących go w rejestrze Obsługiwane jest , począwszy od systemu Windows Vista:

    Omówienie wirtualizacji

    W wersjach wcześniejszych niż Windows Vista aplikacje były zwykle uruchamiane przez administratorów pod numerem . W rezultacie aplikacje mogły swobodnie uzyskiwać dostęp do plików systemowych i kluczy rejestru. Jeśli aplikacje te byłyby obsługiwane przez standardowego użytkownika, nie powiodłyby się z powodu niewystarczających uprawnień dostępu do danych: .System Windows Vista i nowsze wersje systemu Windows poprawiają zgodność aplikacji dla tych aplikacji automatycznie, przekierowując te operacje. Na przykład operacje rejestru do globalnego sklepu (HKEY_LOCAL_MACHINE \ Software) są przekierowywane do lokalizacji na użytkownika w profilu użytkownika znanym jako sklep wirtualny (HKEY_USERS \ _Classes \ VirtualStore \ Machine \ Software).

  2. Tak, dokładnie tak, jak być powinno.

  3. Możesz używać technologii Virtualization, jeśli chcesz pisać w globalnie zmieniającej się lokalizacji lub użyć większej liczby zlokalizowanych lokalizacji, jeśli tego nie chcesz. Tak czy inaczej jest niewidoczny dla czytelnika, więc nie martw się o to.

+0

+1, podałeś link :) – slugster

+0

@slugster - Myślę, że ważne jest umieszczenie linków do cytowanych tekstów lub innych przykładów/blogów. –

+0

, ale czy to nie oznacza, że ​​przyszły użytkownik wysyłający zapytanie do tej samej lokalizacji w hklm nie otrzyma wartości, która znajduje się w bieżącej lokalizacji użytkownika? OK I tak go przetestuję. – nawfal

Powiązane problemy