출처 : 김명신의 즐거운 하루 블로그
Vista 에서 수행되는 어플리케이션은 기본적으로 표준사용자 권한으로 수행됩니다.
설사 사용자가 Administrators 그룹에 포함된 계정을 이용하여 로그인을 수행하였더라도, 프로그램은 표준 사용자 권한을 가지고 수행되게 됩니다.((이와 관련된 자세한 사항은 다음에 이야기 하겠습니다) 이러한 특성 때문에 예전에는 제한없이 사용가능 했던 리소스들에 대해서 접근이 불가능하거나 그 동작 방식이 변경된 경우가 있습니다.
구체적으로 예를 들어보면,
C:\windows 나 c:\windows\system32 폴더의 권한 설정을 보면 표준사용저는 write 권한이 없습니다. 이것은 Program Files 폴더에 대해서도 마찬가지 입니다. 레지스트리는 어떨까요? HKEY_LOCAL_MACHINE 에도 내용을 읽을 수는 있지만 수정, 삭제, 추가 등의 동작은 제한됩니다. 앞서 Vista Note -1 에서 환경설정 파일을 어디에 저장할 것인가에 대한 내용을 다루었던 것을 기억하시나요? 만일 여러분이 Program Files 밑에 프로그램을 배포하고, 그 위치에 환경설정 파일을 저장하도록 작성해 두면 어떨까요? 이 경우에는 수정이나 저장 권한이 없으므로 실패해야 합니다.
하지만 Vista가 단순히 그렇게만 출시되었다면 어떤일이 일어날까요? 아마도 엄청나게 많은 프로그램들이 제대로 수행되지 않을 것입니다. 우리는 흔히 Program Files 밑에 프로그램을 설치하고 프로그램과 동일한 폴더에 환경설정 파일을 저장하죠. 또한 HKEY_LOCAL_MACHINE 아래에 프로그램 수행에 필요한 정보를 저장하기 합니다.
그래서 Vista에서는 이전 version의 윈도우에서 정상적으로 동작하던 어플리케이션이, Vista에서도 잘 동작할 수 있도록 몇가지 장치들을 강구해 두었습니다. 그 중에 하나가 Virtualization 입니다.
Virtualization이란, 여러분이 Program Files 이하에 파일을 저장하려고 시도하면, 실제 물리적으로 Program Files 이하에 파일을 저장하지 않고, c:\users\< 사용자이름>\AppData\Local\VirtualStore\Program Files 로 redirection 시켜 버립니다.
이는 Windows 폴더에 대해서도 마찬가지 입니다. 프로그램에서 Windows 폴더에 무엇인가를 저장하려고 시도하면, c:\users\< 사용자이름>\AppData\Local\VirtualStore\Window에 파일을 저장하게 됩니다.
아래와 같이 TextBox control 1개와 Button Control 2개를 form에 배치하고 각각의 이벤트 핸들러를 다음과 같이 정의해 봅시다.

private
void SaveBtn_Click(object sender, EventArgs e)
{
SaveFileDialog saveDlg = new
SaveFileDialog();
saveDlg.Filter = “txt files (*.txt)|*.txt|All files (*.*)|*.*”;
saveDlg.FilterIndex = 2;
if (saveDlg.ShowDialog() == DialogResult.OK)
{
using (StreamWriter sw = new
StreamWriter(saveDlg.FileName))
{
sw.Write(textBox1.Text);
}
}
}
private
void LoadBtn_Click(object sender, EventArgs e)
{
OpenFileDialog openDlg = new
OpenFileDialog();
openDlg.Filter = “txt files (*.txt)|*.txt|All files (*.*)|*.*”;
openDlg.FilterIndex = 2;
if (openDlg.ShowDialog() == DialogResult.OK)
{
using (StreamReader sr = new
StreamReader(openDlg.FileName))
{
string readLine;
textBox1.Clear();
while ((readLine = sr.ReadLine()) != null)
{
textBox1.Text += readLine;
}
}
}
}
TextBox control에 “test”를 입력하고, Save 버튼을 클릭한 후, “C:\Program Files” 이하에 test.txt 라는 이름으로 파일을 저장해 봅시다. 그런 다음 command prompt를 열고 c:\program files 이하를 살펴보면,
c:\Program Files>dir test.txt
C 드라이브의 볼륨에는 이름이 없습니다.
볼륨 일련 번호: 0DC0-D7A5
c:\Program Files 디렉터리
파일을 찾을 수 없습니다.
이제 virtualization folder로 이동해서 program files 이하를 살펴봅시다.
C:\Users\myungkim.FAREAST\AppData\Local\VirtualStore\Program Files>dir
C 드라이브의 볼륨에는 이름이 없습니다.
볼륨 일련 번호: 0DC0-D7A5
C:\Users\myungkim.FAREAST\AppData\Local\VirtualStore\Program Files 디렉터리
2006-12-19 오후 04:06
.
2006-12-19 오후 04:06 ..
2006-12-13 오후 07:19 Microsoft SDKs
2006-12-19 오후 04:20 4 test.txt
1개 파일 4 바이트
3개 디렉터리 7,047,626,752 바이트 남음
위 결과를 보면, test.txt가 c:\Program Files가 아닌 VirtualStore 이하의 Program Files 이하에 저장된 것을 확인할 수 있습니다.
이제는 TextBox의 내용을 지우고, Load 버튼을 클릭한 후, c:\Program Files 로 이동해 봅시다. 그러면 VirtualStore 이하에 있던 text.txt 파일이 존재함을 알 수 있습니다. 물론 파일을 선택하여 열어보면, 저장한 내용이 포함되어 있습니다.
몇가지 더 test를 수행해 볼 수 있습니다. 만일 물리적으로 C:\Program Files 이하에 동일 이름의 파일이 존재한다면, File Dialog에 나타난 파일은 어느 파일일까요? VirtualStore 이하에 있는 test.txt 파일일까요 ? C:\Program Files 이하에 있는 파일 일까요? 이러한 동작을 확인해 보기 위해서 CMD shell을 관리자 권한으로 수행한 후, c:\Program Files로 이동해서 다음과 같이 입력해 봅시다.
c:\Program Files>copy con test.txt
test2
^Z
1개 파일이 복사되었습니다.
이제 프로그램에서 Load를 선택하여 C:\Program Files를 이동한 후, tet.txt를 선택하여 그 내용을 확인해 봅시다. “test” 인가요 “test2″ 인가요? 답은 VirtualStore에 있는 파일이 열립니다. 한가지 더 test해보고 싶으시죠? VirtualStore 이하에 파일이 존재하지 않는다면 어떻게 될까요?
C:\Users\myungkim.FAREAST\AppData\Local\VirtualStore\Program Files>del test.txt
이렇게 되면 c:\Program Files 이하에 존재하는 test.txt 파일이 열립니다. 즉 test2 라는 내용이 표시되겠죠. 정리하면 다음과 같습니다.
VirtualStore\Program Files C:\Program Files 어느쪽 파일이 열릴까?
X X 파일 없음
O X VirtualStore\Program Files
X O C:\Program Files
O O VirtualStore\Program Files
즉, 항상 VirtualStore가 우선적으로 검토되고, 만일 적절한 파일을 발견하지 못한 경우에 한해서만, 물리적인 저장 위치인 C:\Program Files 를 access한다고 정리하시면 됩니다.
Registry의 경우는 어떨까요? 핵심적인 메커니즘은 파일과 유사합니다. Registry Virtualization은 HKEY_LOCAL_MACHINE\Software 이하만을 가상화 합니다. 즉 HKEY_LOCAL_MACHINE\Software\AppKey1 에 접근을 시도하면 실제로는 HKEY_USERS\_Classes\VirtualStore\Machine\Software\AppKey1 에 접근하게 됩니다.
Registry Virtualization에 대한 보다 자세한 내용은 Registry Virtualization 를 참고하십시오.
마지막으로 이러한 virtualization 기능은 다음 version의 windows 출시나 혹은 그 이전에라도 제거될 수 있다는 것입니다. 실제로 64bit Vista에서는 이러한 virtualization 기능이 전혀 동작하지 않습니다. 따라서 virtualization 기능에 대해서 전혀 기억하지 못하더라도 다음 한가지만은 기억해야 합니다.
Program Files나 windows 혹은 windows/system 폴더 그리고 HKEY_LOCAL_MACHINE\Software 등에는 파일 혹은 정보를 수정,삭제,저장할 수 없으므로 프로그램을 수정해서 다른 위치에 이러한 정보를 저장하도록 고쳐야 한다는 것입니다.
이 것이 제가 Vista Note -1 에서 환경설정 파일에 대한 내용을 미리 말씀 드린 이유이기도 합니다
Development