Официальная возможность получить лицензионный софт бесплатно.
Giveaway of the Day
Это не реклама!

Щелкните для получения прогноза по Биробиджану


среда, 3 декабря 2014 г.

MS IE: Автоматическое определение параметров и GPO

Для старых версий Internet Explorer в оснастке групповых политик существовал раздел IE Maintenance. Но в более новых версиях контроллеров и для IE версий 10+ этого раздела нет, а сохранившиеся настройки не работают или работают частично.
Особую головную боль вызывает галочка "Автоматическое определение параметров", которая никак через политики не настраивается:




Довольно долго пришлось копаться, пока не выяснилось, что за нее отвечают параметры:

HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Internet Settings\Connections

DefaultConnectionSettings
SavedLegacySettings

Однако, эти параметры представляют собой значения типа reg_binary, то есть, некие числовые данные, причем очень длинные.


Первым (и довольно популярным, как ни странно) решением, которое мне попалось, было "скопируйте значения этих ключей с машины, где сделаны нужные настройки, и политикой добавляйте их в реестр на целевых машинах". Почти элегантно, если не считать того, что эти байтовые массивы действительно длинные и явно отвечают не только за одну эту галку.
Такая постановка вопроса смутила не меня одного и нашелся человек, который расковырял это дело и обнаружил, что управляет этой галкой один бит в одном байте этого массива. (дальше речь про DefaultConnectionSettings, а SavedLegacySettings не трогаем).
Этот человек сочинил скрипт, которым я и воспользовался.
Отвечает за галку бит со значением 0x8 в байте с номером 0x8 (нумерация с нуля!):


Для изменения этого бита воспользуемся старыми добрыми логическими функциями: И и ИЛИ.
Чтобы установить этот бит: байт(8) OR 8 (810=000010002)
Чтобы сбросить этот бит: байт(8) AND 247 (24710=111101112)
Осталось выдернуть этот байт из этого ключа, изменить его в зависимости от того, что нам нужно, и записать обратно. Этим занимается слегка модифицированная версия исходного скрипта на .vbs. Проверено, в GPO она отрабатывает нормально, хотя иногда требуется сделать gpupdate /force и перелогиниться под текущим пользователем больше одного раза.






Я сохранил большинство авторских комментариев и добавил пару своих.

RESET_IE_AUTOCONFIG.VBS
--
Option Explicit
On Error Resume Next
'Create a constant for the HKEY_CURRENT_USER object
Const HKCU = &H80000001
'Define variables
Dim strComputer
Dim strRegistryKey
Dim objRegistry
Dim strRegistryValue
DIm binValue
strComputer = "."
strRegistryKey = "Software\Microsoft\Windows\CurrentVersion\Internet Settings\Connections"
strRegistryValue = "DefaultConnectionSettings"
'Connect to the Registry
Set objRegistry = GetObject("winmgmts:\\" & strComputer & "\root\default:StdRegProv")
'Retrieve the current settings.
objRegistry.GetBinaryValue HKCU, strRegistryKey, strRegistryValue, binValue

'**********
'Change the 'Automatically detect settings' box to unticked
'**********
'bit value=8 (not related to byte #8!!!)
rem 255 xor 8 = 247
rem set: binValue(8) or 8
rem reset: binValue(8) and 247

binValue(8) = binValue(8) and 247
'Save the changes
objRegistry.SetBinaryValue HKCU, strRegistryKey, strRegistryValue, binValue
--

Разумеется, этот скрипт можно сделать более компактным и оптимальным, но смысл? Он действительно работает и довольно прост для адаптации под индивидуальные нужды. Три ключевых момента я выделил цветом: получаем значение, изменяем его в зависимости от, записываем значение обратно.

Настройка гарантированно работает как для IE8/xp, так и для IE11/win7/srv2008r2

9 комментариев:

  1. Статья классная, по крайней мере надеялся найти тут решение такой же проблемы, но скрипт не работает у меня почему-то((

    ОтветитьУдалить
    Ответы
    1. В чем именно выражается неработа скрипта? Бит не меняется или что?

      Удалить
  2. Выполни в powershell следующий код:
    $abc = (Get-ItemProperty 'HKCU:\HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Internet Settings\Connections\').DefaultConnectionSettings
    $abc[8]=1
    Set-ItemProperty 'HKCU:\HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Internet Settings\Connections\' 'DefaultConnectionSettings' $abc

    ОтветитьУдалить
    Ответы
    1. Хорошая мысль. Но почему "=1", нам ведь нужно 0b1000, а не 0b01?
      В твоем варианте бит однозначно сбрасывается, но при этом портятся значения остальных битов, если значение байта было не 9.

      Удалить
    2. Тогда более точный вариант такой
      $DefaultConnectionSettings = (Get-ItemProperty 'HKCU:\HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Internet Settings\Connections\').DefaultConnectionSettings
      if ($DefaultConnectionSettings) {
      if((1 -band ($DefaultConnectionSettings[8] -shr 3)) -ne 0){
      $DefaultConnectionSettings[8] = $DefaultConnectionSettings[8] -bxor 8
      Set-ItemProperty 'HKCU:\HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Internet Settings\Connections\' 'DefaultConnectionSettings' $DefaultConnectionSettings
      }
      }

      Удалить
    3. а если не любить мозг сдвигами, а просто:

      if(8 -band ($DefaultConnectionSettings[8]))

      1. зачем выполнять сдвиг, когда можно AND-ить сразу с восьмёркой?
      2. ненулевое значение считается истиной, поэтому "-ne 0" не требуется: если этот бит установлен, то после AND-a у получится 8, 8<>0, условие выполнено.

      Удалить
    4. ) Хорошая оптимизация. Спасибо за обратную связь.

      Удалить
    5. Всегда пожалуйста. Я начинал изучать программирование на "ямахах" MSX-1, продолжил на БК/ДВК, а там с памятью негусто, поэтому до сих пор сохранил привычку не писать неоптимальный код :-)
      И если какое-то значение является константой, я и буду его использовать как константу, а не вычислять заведомо известный результат.
      (понятно, что на современных процессорах и объемах памяти это не критично, но стараюсь не расслабляться, чтобы не превратиться в индуса :-D )

      Удалить
  3. Этот комментарий был удален автором.

    ОтветитьУдалить

Пожалуйста, воздержитесь от грубостей и персональных нападок.
Я не против матерщины, но она должна быть уместной и использоваться для выражения эмоций, а не в качестве основного средства выражения мыслей.