2014-09-21 5 views
1

키 소유자를 가져 오기 위해이 함수를 호출하려고합니다. 읽기 권한없이 레지스트리 키 핸들을 얻는 방법

[DllImport("Advapi32.dll", CharSet = CharSet.Auto)] 
public extern static int SetSecurityInfo(IntPtr hKeySrc, SE_OBJECT_TYPE lpSubKey, SECURITY_INFORMATION securityInfo, IntPtr psidOwner, IntPtr psidGroup, IntPtr pDacl, IntPtr pSacl); 

그러나,이 함수를 호출하기 위해, 내가 먼저 키 (IntPtr입니다 hKeysrc)에 대한 핸들이 필요합니다. 전에 이러한 함수를 사용하여 핸들을 가져옵니다.

RegistryKey key = root.OpenSubKey(keyName); 

private static IntPtr GetRegistryKeyHandle(RegistryKey registryKey) 
    { 
     IntPtr ret = IntPtr.Zero; 
     try 
     { 
      Type registryKeyType = typeof(RegistryKey); 

      System.Reflection.FieldInfo fieldInfo = 
      registryKeyType.GetField("hkey", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance); 

      SafeHandle handle = (SafeHandle) fieldInfo.GetValue(registryKey); 
      ret = handle.DangerousGetHandle(); 
     } 
     catch (Exception ex) 
     { 
      LogError("GetRegistryKeyHandle ERROR:" + ex.ToString()); 
     } 
     return ret; 
    } 

하지만 이제는 타겟팅하는 키에만 시스템 계정에 대한 권한이 있습니다!

키에 대한 regedit에서 사용 권한을 열려고하면 오류가 발생합니다. 현재 사용 권한 설정을 볼 수있는 권한이 없지만 사용 권한을 변경할 수 있습니다.

키에 대한 읽기 권한이 없습니다. 그럼 내가 처리하는 데 사용되는 방법은 무단 오류로 실패합니다.

이 경우 키를 어떻게 처리 할 수 ​​있습니까? 사실, regedit이이를 수행 할 수 있습니다. 그래서 API가 그것을 할 수 있다고 생각합니다. 하지만 어떤 API를 호출해야할지 모르겠습니다.

+0

의 키를 사용, 당신은 SeTakeOwnershipPrivilege를 사용하도록 설정 한 다음 WRITE_OWNER 액세스 키를 열어야합니다. 액세스 모드를 선택할 수있는 .NET API가 있는지 모르겠지만 필요한 경우 RegOpenKeyEx를 호출하거나 호출 할 수 있어야합니다. –

+0

또는 백업 및 복원 권한을 활성화하면 Windows에 현재 사용 권한을 무시하도록 지시하므로 키를 열 때 특별한 작업을 수행 할 필요가 없습니다. –

+0

@HarryJohnston, 다시 보내 주셔서 감사합니다. 나는 그것을 시도 할 것이다. – Linyes

답변

0

@ HarryJohnston이 올바른 해결책을 얻었습니다.

  1. 는 SeTakeOwnershipPrivilege
  2. 를 열고이 좋은 방법을 이렇게하려면 WRITE_OWNER 액세스
관련 문제