Изменение системного часового пояса завершается успешно один раз, а затем больше не изменяется - PullRequest
3 голосов
/ 31 марта 2010

Я использую 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 ошибка (указанная привилегия делает не существует. ).

Ответы [ 2 ]

1 голос
/ 31 марта 2010

Попробуйте использовать LsaAddAccountRights вместо LookupPrivilegeValue и AdjustTokenPrivileges для установки SE_TIME_ZONE_NAME. Смотрите также эту тему .

0 голосов
/ 01 апреля 2010

Поработав некоторое время с этим, я исправил проблему, но я не совсем уверен, на каком этапе ее удалось устранить. Я добавил дополнительное предложение, чтобы проверить ОС, чтобы проверить, нужно ли корректировать токен процесса для включения SE_TIME_ZONE_NAME. Теперь он делает это только на пост-XP OS.

Я также изменил способ хранения значения реестра TZI в моей структуре. Я понял, что в документе TIME_ZONE_INFORMATION MSDN содержится структура, используемая для версии реестра (REG_TZI_FORMAT). Простое чтение двоичного значения прямо в структуру устраняет немного кода.

Я также гарантировал, что ОБА DaylightName и StandardName были заполнены.

Наконец, я позвонил RegFlushKey(HKEY_LOCAL_MACHINE) сразу после SetTimeZoneInformation. После выполнения этих шагов часовой пояс меняется, как и ожидалось.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...