2011-02-09 3 views
7

로그인 화면과 제어판 애플릿에서 숨겨진 특별한 사용자 계정을 만들어야하는 응용 프로그램을 작성 중입니다.HKEY_LOCAL_MACHINE Software에서 레지스트리에 쓸 수 없음

HKEY_LOCAL_MACHINE \ 소프트웨어 마이크로 소프트 \ \ 윈도우 NT \ CurrentVersion을 \ Winlogon을 \ SpecialAccounts \ UserList에

: 아래의 레지스트리 키에 사용자 이름과 0의 DWORD 값을 쓰고, 나는이 목표를 달성 할 수 있어요

문제는 UAC가 설치된 Windows 7에서 내가 시도한 것과 상관없이 위의 키에 프로그래밍 방식으로 값을 쓸 수 없다는 것입니다.

관리자 권한으로 실행하지 않는 한 특정 키를 쓰는 것이 Windows 7 (UAC 사용)에서 허용되지 않습니다. 응용 프로그램 매니페스트를 추가했습니다. requestedExecutionLevel level="requireAdministrator" uiAccess="false", 내 프로그램이 실행될 때 UAC 프롬프트를 수락하고 내 계정은 Administrators의 구성원이지만 위의 레지스트리 키에 쓸 수 없습니다.

더해야 할 일이 무엇입니까? 모든 응용 프로그램 구성에서 키와 값을 HKEY_LOCAL_MACHINE\SOFTWARE 아래에 쓰는 방법은 무엇입니까?

추가 정보 ... 내 프로그램이 실행될 때 오류가 발생하지 않고 값을 쓰는 것으로 보입니다. 내 추측은 Windows가 내가 작성하고있는 위치를 가상화하고 있다는 것입니다. 이 특별한 사용자 계정을 숨기려면 가상 위치가 아닌 실제 위치에 기록해야합니다.

+0

레지스트리. 멀웨어에 의해 작성된 숨겨진 계정은 예를 들어 좋지 않습니다. – asawyer

+0

그러나 이것은 내가 언급 한 특정 키뿐만 아니라 HKEY_LOCAL_MACHINE \ SOFTWARE 아래의 모든 것에 적용됩니다. 아, 그리고 regedit을 사용하여 계정을 숨길 수도 있고 컴퓨터 관리/사용자를 사용하여 계정을 볼 수도 있습니다. – sysrpl

+0

죄송합니다. 커프 코멘트에 불과했습니다. 내가 너에게 좋은 대답을했다면 나는 다른 상자를 사용했을거야. 나는 또한 여기에 acutally 무슨 일이 일어나고 있는지에 관심이 많다. – asawyer

답변

12

아마도 프로그램은 64 비트 운영 체제에서 32 비트 프로그램으로 실행됩니까? 이 경우 HKEY_LOCAL_MACHINE\SOFTWARE 하위 키 Wow6432Node에서 만든 값을 검색하는 것이 좋습니다.

이러한 종류의 가상화에 대한 자세한 내용은 here을 참조하십시오. 일부 API에서는 KEY_WOW64_32KEY flag을 사용하여 가상화없이 전체 레지스트리로 작업 할 수 있습니다.

+0

맞아, 나는 이미 값이 Wow6432Node 아래서 쓰여지고 있음을 알아 냈다. 문제는 윈도우에 코드를 숨기는 사용자가 해당 위치에서 키를 볼 수 없다는 것입니다. http://social.answers.microsoft.com/Forums/en-SG/w7security/thread/e4d1c727-a0b3-4ce8-b95e-7f113b576ee6 및 http://community.kaseya.com/xsp/f/21/p를 참조하십시오. /223/646.aspx ... 첫 번째 링크는 설치 쉴드 (setup shield)에 의한 개인적인 수정을 통해 해결 된 것으로 표시되었으므로 공개적으로 재배포하지 않습니다. – sysrpl

+0

@ sysrpl :'RegCreateKeyEx' 또는'RegOpenKeyEx'에서 추가로'KEY_WOW64_32KEY' 플래그를 사용하면 문제를 쉽게 해결할 수 있습니다. 그런 다음 'HKEY' 핸들을 사용하여 레지스트리의 모든 부분에 액세스 할 수 있습니다. 트릭을 아무 문제없이 사용합니다. 필요한 경우이를 보여주는 작은 C 예를 게시 할 수 있습니다. – Oleg

+0

@sysrpl : 설치 과정에서 레지스트리 키를 생성해야합니까? – Oleg

0

이것은 Vista에서 추가 한 리디렉션과 관련이 있습니다. 만약 당신이 기대했던 가치를 되 찾는다면 당신이 당신의 코드에서 그 레지스트리 값을 읽으려고하면 나는 궁금 할 것이다. RegMon을 실행하여 리다이렉션이 당신을 강요 할 수있는 곳을 볼 수 있는지 알아볼 수도 있습니다.

1

쓰기 값 그들은 아마 당신이해야 할 노력하고 정확하게 방지하기 위해 노력하고있다

string user = Environment.UserDomainName + "\\" + Environment.UserName; 

RegistrySecurity rs = new RegistrySecurity(); 

rs.AddAccessRule(new RegistryAccessRule(user, 
    RegistryRights.WriteKey | RegistryRights.ChangePermissions, 
    InheritanceFlags.None, PropagationFlags.None, AccessControlType.Deny)); 

RegistryKey rk = null; 
try 
{ 
    rk = Registry.CurrentUser.CreateSubKey("SOFTWARE\\TEST", 
            RegistryKeyPermissionCheck.Default, rs); 
    rk.SetValue("NAME", "IROSH); 
    rk.SetValue("FROM", "SRI LANKA"); 
} 
0
RegistryKey rk = Registry.LocalMachine.OpenSubKey(@"SOFTWARE\Microsoft\Windows\CurrentVersion\Run",true); 
rk.SetValue("Name", "Value"); 
+2

코드에 대한 설명을 작성하여보다 나은 답변 작성 –

관련 문제