9

나는 다음과 같이 레지스트리에 레지스트리 하위 키 및 해당 값을 기록하려고 :레지스트리가 예상보다 다른 위치에 기록되는 이유는 무엇입니까?

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

이제 문제는 내가 내가 HKLM 폴더 SOFTWARE\Apple\Banana을 볼 수 없습니다 (regedit를 통해) 직접 위치에서 볼 때이다 .

위의 코드를 다시 실행하고 디버그 할 때 Registry.LocalMachine.OpenSubKey(subKey)rk.GetValue(regKey)이 모두 이전에 저장된 값을 산출한다는 것을 알 수 있습니다. 그러나 regedit을 통해 주어진 위치의 값을 볼 수 없습니다. 레지스트리를 검색에 그래서, 나는 다음 위치에 위의 키와 값을 볼 수 있습니다 : 나는 구원으로 값이 정확하게 유지하는 모두에서

  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

합니다. 그래서

  1. 왜 이런 일이 ..이 내 응용 프로그램 내 코드에서 내가 HKLM\SOFTWARE\Apple\Banana\에서 호출했지만 값을 읽고 곳에서 실감? 액세스 권한 문제와 관련이 있습니까?

  2. 이 예상되는 동작입니까? 이 점에서 필자는이 값이 매우 중요하므로 자동 재배치와 관련된 위험이 있는지를 아는 것입니다!

  3. 그것의 정확한 위치에 남아 있도록 레지스트리에 쓰기의 적절한 방법이 있나요

    ..

내 계정 관리자이며, 나는 32 비트 윈도우 7

을 사용하고 있습니다 편집 : 내가 알기로, 레지스트리 항목은 HKLM보다는 현재 사용자 위치에 저장됩니다. 다른 계정에서 reg 값을 쿼리 할 때 값을 얻지 못합니다. 모든 HKLM에 저장 :(

+0

댓글에 대한 회신 "그러나 이것은 hklm에서 동일한 위치를 쿼리하는 미래의 사용자가 현재 사용자 위치에있는 값을 얻지 못함을 의미하지 않습니까? 그렇습니다. 어쨌든 테스트 할 것입니다."- 예. 레지스트리의 HLM과 Program Files 및 ProgramData 디렉터리는 설치 중에 만 기록해야합니다. 관리자 만이 다른 곳에서 글을 쓸 수 있습니다 (UAC가 활성화 된 경우 고도가있는 경우에만 가능). –

+0

@DannyVarod 첫 번째 문장을 얻지 못했습니다. 어쨌든 내가 테스트했을 때 모든 사용자가 동일한 레지스트리 값을 원한다면 가상화가 도움이되지 않는다는 사실을 알게되었습니다. – nawfal

+0

Windows 6 이상에서는 설정 데이터 만 저장하도록되어 있으며 다른 위치가 있습니다 런타임에 변경되는 구성 가능한 데이터 또는 데이터를 보유하기위한 것입니다. 설치하는 동안 사용자는 설치 위치에 쓸 수있는 권한이 부여됩니다 (UAC를 통한 관리자 별). 런타임 창에서 사용자가 admin이 아니면 이러한 위치에 대한 액세스가 차단됩니다. (비 관리자는 다른 사용자에게 영향을 미치지 않아야합니다.) –

답변

5

예이 동작은 HKLM 하이브에 직접 쓸 수있는 권한이 없기 때문에 발생합니다. 가상화라고하며 파일 시스템에서도 마찬가지입니다. Vista 이후 OS에서의 행동이었습니다.

계속 하시면서 글을 쓰고있는 것과 같은 HKLM 키를 읽으셔야합니다. 그러면 Windows가 투명하게 리디렉션됩니다.

Preet는 kindly provided 철저하게 읽어야하는 MSDN 링크가 있습니다.

당신은 또한 당신이 관리자 권한으로 실행하는 경우에도, 당신이 원하는 권한을 포함해야한다 HKLM 아래 키에 액세스 할 때 (키가 자동으로 관리자 권한으로 열린되지 않기 때문에를, 당신이 그것을 요청해야)한다는

참고 :

+0

을 참조하십시오. 그러나 미래의 사용자가 hklm에서 동일한 위치가 현재 사용자 위치에있는 값을 얻지 못합니까? 좋습니다. 어쨌든 테스트 할 것입니다. – nawfal

+0

추가 팁을 보내 주셔서 감사합니다. – nawfal

+0

동일한 문제가 발생하지만 레지스트리에 활성화 키를 저장하려고합니다. 모든 사용자가 동일한 키를 원한다면 가상화가 엉망이 될 것입니까? – Alan

4
  1. This is Registry Virtualization (msdn)

    레지스트리 가상화의 첫 번째 짧은, 어떤 점에서 리디렉션 될 글로벌 영향을 미칠 레지스트리 쓰기 작업을 가능하게하는 응용 프로그램 호환성 기술 입니다 이 리다이렉션은 레지스트리에서 읽고 쓰는 응용 프로그램에게는 투명하며 Windows Vista부터는 를 지원합니다.가상화 개요

    Windows Vista 이전에는 일반적으로 응용 프로그램이 관리자가 실행 한 이었습니다. 결과적으로 응용 프로그램은 시스템 파일과 레지스트리 키에 자유롭게 액세스 할 수 있습니다. 이 응용 프로그램 이 표준 사용자에 의해 실행 된 경우 액세스 권한이 부족하여 실패합니다.Windows Vista 이상 버전의 Windows는 응용 프로그램 호환성을 개선하여 이러한 작업을 자동으로 로 리디렉션합니다. 예를 들어 글로벌 저장소 (HKEY_LOCAL_MACHINE \ Software)에 대한 레지스트리 작업은 가상 저장소 (HKEY_USERS \ _Classes \ VirtualStore \ Machine \ Software)이라는 사용자 프로필 내의 사용자 단위 위치로 리디렉션됩니다.

  2. 예 정확하게 있어야합니다.

  3. 전체적으로 영향을주는 위치에 글을 쓰고 싶다면 가상화와 함께 살거나 원하지 않으면 더 많은 현지화 된 위치를 사용하십시오. 어느 쪽이든 독자에게는 보이지 않으므로 걱정하지 마십시오.

+0

+1, 링크를 포함 시켰습니다 :) – slugster

+0

@slugster - 인용 된 텍스트 나 다른 사람들의 샘플/블로그에 링크를 두는 것이 중요하다고 생각합니다. –

+0

그러나 이것은 hklm에서 동일한 위치를 쿼리하는 미래의 사용자가 현재 사용자 위치에있는 값을 얻지 못한다는 것을 의미하지 않습니까? 좋아, 어쨌든 테스트 할 것입니다. – nawfal

관련 문제