Я использую WinAPI для установки часового пояса в Windows XP SP3 box. Я читаю информацию о часовом поясе с помощью клавиши HKLM\Software\Microsoft\WindowsNT\Time Zones\<time zone name>
, а затем устанавливаю часовой пояс на указанный часовой пояс.
Я перечисляю ключи в ключе часовых поясов, беру значение TZI
и помещаю его в структуру TIME_ZONE_INFORMATION
для передачи в SetTimeZoneInformation . Кажется, все работает на первом проходе. Часовой пояс изменяется, ошибки не возвращаются.
Во второй раз, когда я выполняю эту операцию (тот же пользователь, новый сеанс, при входе в систему до userinit), вызов завершается успешно, но система не отражает изменение часового пояса. Ни часы, ни отметки времени в файлах не обновляются до нового часового пояса. Когда я перехожу к:
HKLM\System\CurrentControlSet\Control\TimeZoneInformation
присутствует информация о моем новом часовом поясе.
Пара странных вещей происходит, когда я устанавливаю свой часовой пояс:
- Кроме того, когда я анализирую двоичное значение TZI из реестра, чтобы сохранить его в моей структуре
TIME_ZONE_INFORMATION
, я замечаю, что для поля DaylightDate.wDay
и StandardDate.wDay
всегда установлено значение 0
- Я пытался вызвать GetTimeZoneInformation сразу после того, как я позвонил
SetTimeZoneInformation
, но вызов не удался с ошибкой 1300 (не все привилегии или группы, на которые есть ссылки, были назначены вызывающей стороне.)
Я также обязательно отправляю сообщение WM_BROADCAST
, чтобы Explorer знал, что происходит.
Думаете, это разбор байтового массива в структуру TIME_ZONE_INFORMATION
? Или я упускаю что-то еще важное?
EDIT:
Нашел документ, подтверждающий, почему это происходит: здесь . Привилегия была введена в Vista ... спасибо MSDN документы ...
Согласно документации Microsoft
Я включаю SE_TIME_ZONE_NAME
привилегия для текущих процессов
маркер. Но когда я пытаюсь позвонить
LookupPriviledgeValue для
SE_TIME_ZONE_NAME Я получаю 1313
ошибка (указанная привилегия делает
не существует. ).