2012-11-12 2 views
0

Windows 8 x64에서 C# .net 3.5 Windows 서비스를 개발 중입니다.서비스로 실행할 때 HKEY_Classes_root의 키가 누락되었습니다.

특정 패키지 ID가 HKEY_CLASSES_ROOT \ ActivatableClasses \ Package 노드 아래에 있는지 확인해야합니다. 이 작품을 좋아 true를 돌려줍니다 콘솔 응용 프로그램에서이 코드를 실행하면

코드

internal static bool IsPackageInstalled 
    { 
     get 
     { 
      try 
      { 
       var packageKey = Registry.ClassesRoot.OpenSubKey(@"ActivatableClasses\Package"); 
       if (packageKey != null) 
       { 
        return packageKey.GetSubKeyNames().Any(key => key.StartsWith(MyPackageName, StringComparison.InvariantCultureIgnoreCase)); 
       }                 
      } 
      catch (Exception ex) 
      { 


      } 

      return false; 
     } 
    } 

입니다.

하지만 Windows 서비스에서 코드를 실행하면 오류가 발생합니다. 나는 그것을 디버깅하려하고 서브 키 이름 목록에 2 개의 키만있는 반면 실제로는 21 개의 서브 키가 있다는 것을 알았다.

이 문제의 원인은 무엇입니까?

UPDATE : 문제는 서비스가 다른 사용자에서 실행되며, 서비스가 레지스트리를 쿼리 할 때 따라서 만 HKEY_CURRENT_USER 아래에 나타나는 모든 패키지는 나타나지 않을 것입니다.

서비스가 다른 사용자 레지스트리를 확인하는 방법이 있습니까 (사용자가 현재 로그인되어 있지 않은 경우에도)?

HKEY_LOCAL_MACHINE\Software\Classes 
HKEY_CURRENT_USER\Software\Classes 

그것은 가장 가능성이 당신은 사용자 부분 아래에있는 원하는 값이다 :

+0

'HKEY_LOCAL_MACHINE \ Software \ Classes'에 여분의 키가 보입니까? 'HKEY_Classes_Root'는 로컬 머신과 사용자 클래스의 조합입니다. –

+0

응용 프로그램을 컴파일 할 아키텍처는 무엇입니까? x86 또는 x64? – Arran

+0

이들은 Windows Store 앱 키입니다. 보안을 통해 해킹을 막을 수 있다고 가정합니다. 해당 서비스에 대해 다른 사용자 계정으로 시도하십시오. –

답변

0

HKEY_CLASSES_ROOT 키는 실제로 두 개의 다른 키를 amalgamates 가상 키입니다. 서비스는 콘솔 응용 프로그램과 같은 일반 사용자의 컨텍스트에서 실행되지 않습니다. 레지스트리 키에 대한 자세한 내용은

는 여기를 참조하십시오

http://msdn.microsoft.com/en-us/library/windows/desktop/ms724475(v=vs.85).aspx

당신은 그러나이 값을 가지고 특정 사용자로 실행할 수있는 서비스를 설정할 수 있습니다.

0

내 가정은 사용 권한과 관련이 있다고 가정합니다. 레지스트리의 다른 영역에는 다른 사용 권한이 있습니다. 문제 해결 단계로 결과가 변경되는지 확인하기 위해 내 서비스를 다른 사용자로 실행 해 봅니다. 그렇다면 가장 (impersonation)을 조사하고 싶을 수 있습니다.

관련 문제