Для старых версий 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
Особую головную боль вызывает галочка "Автоматическое определение параметров", которая никак через политики не настраивается:
Довольно долго пришлось копаться, пока не выяснилось, что за нее отвечают параметры:
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
Статья классная, по крайней мере надеялся найти тут решение такой же проблемы, но скрипт не работает у меня почему-то((
ОтветитьУдалитьВ чем именно выражается неработа скрипта? Бит не меняется или что?
УдалитьВыполни в 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", нам ведь нужно 0b1000, а не 0b01?
УдалитьВ твоем варианте бит однозначно сбрасывается, но при этом портятся значения остальных битов, если значение байта было не 9.
Тогда более точный вариант такой
Удалить$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
}
}
а если не любить мозг сдвигами, а просто:
Удалитьif(8 -band ($DefaultConnectionSettings[8]))
1. зачем выполнять сдвиг, когда можно AND-ить сразу с восьмёркой?
2. ненулевое значение считается истиной, поэтому "-ne 0" не требуется: если этот бит установлен, то после AND-a у получится 8, 8<>0, условие выполнено.
) Хорошая оптимизация. Спасибо за обратную связь.
УдалитьВсегда пожалуйста. Я начинал изучать программирование на "ямахах" MSX-1, продолжил на БК/ДВК, а там с памятью негусто, поэтому до сих пор сохранил привычку не писать неоптимальный код :-)
УдалитьИ если какое-то значение является константой, я и буду его использовать как константу, а не вычислять заведомо известный результат.
(понятно, что на современных процессорах и объемах памяти это не критично, но стараюсь не расслабляться, чтобы не превратиться в индуса :-D )
Этот комментарий был удален автором.
ОтветитьУдалить