2009-10-27 7 views
3

5 분마다 레지스트리를 업데이트해야하는 서비스가 있습니다 (gpo에 대응). 코드는 일반 응용 프로그램에서 제대로 실행되지만 Windows 서비스에 넣을 때 변경되지 않습니다. 나는 서비스를 로컬 시스템 계정을 사용하고 있으며 예외C# Windows 서비스에서 레지스트리를 변경해야합니다.

아래의 코드는 일반 콘솔 응용 프로그램에서 작동하지만 서비스에 던지는되지 않습니다

RegistryKey key = Registry.CurrentUser.OpenSubKey("Control Panel\\Desktop", true); 
     if (key != null) 
     { 
      key.SetValue("ScreenSaverIsSecure", "0", RegistryValueKind.String); 
      key.SetValue("ScreenSaveActive", "0", RegistryValueKind.String); 
      key.SetValue("ScreenSaveTimeOut", "0", RegistryValueKind.String); 
      key.SetValue("SCRNSAVE.EXE", "", RegistryValueKind.String); 
     } 


     key = Registry.CurrentUser.OpenSubKey(@"Software\Policies\Microsoft\Windows\Control Panel\Desktop", true); 
     if (key != null) 
     { 
      key.SetValue("ScreenSaverIsSecure", "0", RegistryValueKind.String); 
      key.SetValue("ScreenSaveActive", "0", RegistryValueKind.String); 
      key.SetValue("ScreenSaveTimeOut", "0", RegistryValueKind.String); 
      key.SetValue("SCRNSAVE.EXE", "", RegistryValueKind.String); 
     } 
     System.Diagnostics.Process.Start(@"c:\windows\System32\RUNDLL32.EXE", "user32.dll, UpdatePerUserSystemParameters"); 

어떤 아이디어를?

편집 : 답변에 대한

감사합니다. 나는 왜 "CurrentUser"가 나의 관심을 도망 갔는지 모르겠다. 그 점을 지적 해 주셔서 감사합니다.

여전히 현재 사용자에 대해 그룹 정책이 적용되고 있다는 문제가 있습니다. 지금은 시작시로드되고 활성 상태로 유지되는 앱을 만드는 것을 고려 중입니다. 다른 제안 사항도 환영합니다.

편집 : 윌의 의견에 관해서는

, 내가는 Win32 API의 UpdatePerUserSystemParameters 함수 서명을 찾을 수 없습니다입니다. 그것은 매개 변수없이 호출 될 수 있음을 의미합니까?

[System.Runtime.InteropServices.DllImport("user32.dll")] 
    private static extern bool UpdatePerUserSystemParameters(); 

답변

5

this page 참조 :

을 LocalSystem 계정의 컨텍스트에서 실행되는 서비스는 t를 상속받습니다. SCM의 보안 컨텍스트 ... 여기에는 몇 가지 의미가 있습니다.

레지스트리 키 HKEY_CURRENT_USER는 현재 사용자가 아닌 기본 사용자와 연결되어 있습니다. 다른 사용자의 프로필에 액세스하려면 사용자를 가장하고 HKEY_CURRENT_USER에 액세스하십시오.

2

레지스트리는 항상 재미 있지만, 당신이 "로컬 시스템"사용자의 사용자 레지스트리 설정을 편집하는 것을 의미하지 않는다? 따라서 실제 사용자가 "로컬 시스템"으로 로그인하지 않으면 (내가 심각하게 의심 스럽습니다) 아무 것도 보지 않을 것입니다 ...

컴퓨터 전체 설정을 편집해야한다고 생각합니다. active 사용자.

1

레지스트리 조작 코드를 try-catch 블록에 넣어보십시오. 서비스는 예외를 먹는 보조 스레드에서 실행됩니다.

3

Currentuser은 서비스에 포함되기를 기대합니까?

2

실제로 로그인이있는 다른 계정으로 서비스를 실행하십시오.

로컬 시스템 계정은 사용자가 아닌, 따라서 더 Registry.CurrentUser 키 (아무 로그인 = 아니오 현재 사용자 = 아니오 현재 사용자 키가 없습니다.이 서비스의 외부 작동하는 경우

+0

실제로 로컬 시스템/로컬 서비스/네트워크 서비스 계정에 HKCU 항목이 있습니다. HK_USERS를 확인하십시오. –

2

, 그것은 할 수있다 .? 권한 문제가 될 당신은 예외를지고 당신이 key.SetValue()를 사용하려고 할 때 레지스트리에 대한 쓰기 액세스 권한이있는 계정으로 실행되는 서비스입니다

관련 문제