2010-03-31 3 views
3

Windows XP SP3 상자에서 WinAPI를 사용하여 표준 시간대를 설정하고 있습니다. HKLM\Software\Microsoft\WindowsNT\Time Zones\<time zone name> 키에서 시간대 정보를 읽은 다음 시간대를 지정된 시간대로 설정하고 있습니다.시스템 시간대 변경이 한 번 성공하면 더 이상 변경되지 않습니다.

시간대 키 아래의 키를 열거하고 TZI 값을 잡고 SetTimeZoneInformation에 전달할 TIME_ZONE_INFORMATION 구조체에 채 웁니다. 모두 첫 번째 패스에서 작동하는 것 같습니다. 표준 시간대가 변경되면 오류가 반환되지 않습니다.

두 번째로이 작업을 수행하면 (동일한 사용자, 새 세션, userinit 이전의 로그인시) 호출은 성공하지만 시스템이 표준 시간대 변경을 반영하지 않습니다. 파일의 시계 또는 시간 스탬프가 새 표준 시간대로 업데이트되지 않습니다. 탐색 할 때 : HKLM\System\CurrentControlSet\Control\TimeZoneInformation 내 새로운 표준 시간대 정보가 있습니다.

내 시간대 설정에있을 때 이상한 일이 일어나고 몇 : 내 TIME_ZONE_INFORMATION 구조체에 내가 구조체가있다 알았어 야를 저장하는 레지스트리에서 TZI 이진 값을 구문 분석 할 때 또한

  • DaylightDate.wDayStandardDate.wDay 필드가 항상 0
  • 로 설정 나는 SetTimeZoneInformation 전화 직후 GetTimeZoneInformation 통화를 시도했으나 전화 통화가 1300 오류 (안 호출자에게 할당 된 참조 된 모든 권한 또는 그룹.)
,691,363 실패210

WM_BROADCAST 메시지를 보내려면 탐색기에서 무슨 일이 일어나는지 확인해야합니다.

TIME_ZONE_INFORMATION 구조체에 대해 바이트 배열을 구문 분석한다고 생각하십니까? 아니면 내가 중요한 다른 것을 놓치고 있는가?

편집 :

찾을 왜 이런 일을 알리는 문서 : here. 권한은 마이크로 소프트 documentation

내가 현재 프로세스
토큰에 대한 SE_TIME_ZONE_NAME 권한을 가능하게하고있어 ... ... Vista에서 감사 MSDN의 문서를 소개되었다. 내가
SE_TIME_ZONE_NAME에 대한
LookupPriviledgeValue를 호출 할 때 그러나 나는 1313 오류가 (A 지정된 권한이 이 존재하지 않습니다.) 얻을.

답변

0

잠시 뒤죽박죽으로이 문제를 해결했지만 어떤 단계를 고쳐야하는지 잘 모르겠습니다. SE_TIME_ZONE_NAME을 사용하도록 프로세스 토큰을 조정할지 여부를 확인하기 위해 OS를 검사하는 추가 절을 추가했습니다. 이제는 post-XP OS에서만이 작업을 수행합니다.

또한 TZI 레지스트리 값이 내 구조체에 저장된 방식을 변경했습니다. 나는 TIME_ZONE_INFORMATION MSDN 문서에 레지스트리 버전 (REG_TZI_FORMAT)에 사용되는 구조체가 들어 있다는 것을 알고있었습니다. struct로 바로 이진 값을 읽는 것은 약간의 코드를 제거했습니다.

나는 DaylightName과 StandardName 둘 다 채워지는 것을 보증했다.

마지막으로 나는 호출 후 RegFlushKey(HKEY_LOCAL_MACHINE)을 호출했습니다. 이 단계를 수행하면 시간대가 예상대로 변경됩니다.

1

LookupPrivilegeValue 및 AdjustTokenPrivileges 대신 LsaAddAccountRights를 사용하여 SE_TIME_ZONE_NAME을 (를) 설정하십시오. this topic을 참조하십시오.

+0

감사합니다. 그러나 AdjustTokenPriviledge가 올바르게 작동하고 있다고 생각합니다. SE_TIME_ZONE_NAME이 (가) XP에 없기 때문에 질문을 편집했습니다. –

관련 문제