Эффективная очистка реестра

Опубликовано: 10 Апреля, 2023

В этой статье будет показано, как написать сценарий очистки или изменения реестра для всех профилей пользователей на данном компьютере, например, для проверки на наличие вирусов. Мы также увидим, как этот подход можно использовать вместе со сценарием запуска компьютера в объекте групповой политики компьютера для изменения всех профилей пользователей в домене, на сайте или в подразделении. Да, мы действительно можем изменить настройки реестра пользователей, используя сценарий запуска компьютера…


В некоторых случаях от вас могут потребовать удалить, добавить или изменить какую-то часть реестра — сразу для всех пользователей на компьютере. В большинстве случаев мы бы предпочли использовать объект групповой политики (GPO) для пользователей, чтобы добавить или изменить заданное значение, но когда дело доходит до удаления значений, нам иногда приходится использовать сценарии (к сожалению, можно сказать). Кроме того, иногда мы хотим выполнить задачу очистки в одном процессе, не дожидаясь, пока все пользователи войдут в систему. В этой статье будет показано, как это сделать довольно простым способом.


Мы увидим, как можно выполнить изменение реестра, используя очень эффективный сценарий реестра, и объединить его с объектом групповой политики на уровне машины (запуск или завершение работы) вместо использования объекта групповой политики для объекта пользователя (вход в систему или выход из системы). ).


Зачем мне это делать?


Итак, почему это умный подход? Ну, может быть, вы хотите сделать «очистку» ночью, вы можете убедиться, что определенное значение будет изменено (удалено, добавлено или изменено) к следующему утру — обычно ключи «Выполнить» или «ВыполнитьОдин раз» в пользовательская часть реестра после вирусной атаки — так что в сочетании с процедурой Wake-On-Lan (WOL) вы можете быть готовы вернуться домой в кратчайшие сроки!


В других случаях у пользователя могут отсутствовать необходимые привилегии для выполнения задачи очистки или модификации. Раздел реестра, который вы хотите изменить, может быть защищен разрешением безопасности, что делает невозможным использование пользовательского объекта групповой политики (поскольку он будет выполняться в контексте пользователя). Самое замечательное то, что сценарии запуска компьютера выполняются в контексте системной учетной записи — это может быть очень полезно иметь в виду во многих ситуациях!


Предупреждение!
Код, представленный в этой статье, создан только для целей тестирования — вы используете его в производственной среде на свой страх и риск. Включенный код немного упрощен, чтобы его было легче понять и прочитать. Убедитесь, что вы подтвердили функциональность скрипта в своей тестовой среде, прежде чем внедрять его в производство. Вы можете включить дополнительную обработку ошибок, ведение журнала и дополнительные функции — изменяйте по своему усмотрению!


Я не говорю, что код не работает, просто убедитесь, что вы понимаете, что выполнение выполняется на ваш страх и риск.


Фон


Прежде чем мы слишком углубимся в код, необходимо совершенно ясно кое-что о реестре.


Очень часто люди думают, что часть реестра HKEY_USERS — это место, где вы можете увидеть все локальные профили на данном компьютере. Однако, это не так. В HKEY_USERS перечислены профили, которые в данный момент загружены на машину, так сказать профили, активные в памяти. Как только пользователь войдет в систему, в этой части реестра будет видна запись.


Изображение 24874
фигура 1


Как показано на рис. 1, обычно вы можете увидеть несколько загруженных профилей, даже если в консоль вошел только один пользователь. Когда пользователь выходит из системы, куст реестра выгружается и больше не отображается в разделе HKEY_USERS. Вот краткое объяснение загруженных ульев:


« .DEFAULT » — это профиль пользователя по умолчанию — НЕ то, что будут видеть все пользователи (например, общедоступный профиль или профиль всех пользователей), и НЕ профиль реестра, который копируется для всех новых пользователей на компьютере (это распространенное недоразумение). Однако это стандартный профиль, который используется даже тогда, когда никто не вошел в систему — отсюда и профиль запуска (загружается еще до того, как вы доберетесь до рабочего стола). Установив значения в этом профиле, вы можете изменить такие параметры, как фон рабочего стола во время экрана входа в систему (Ctrl+Alt+Delete), начальные настройки Num/Caps Lock и т. д.


« S-1-5-18 » — идентификатор безопасности «системы» (SID).
« S-1-5-19 » — это SID «LocalService».
« S-1-5-20 » — это SID «NetworkService».


Профиль или SID, начинающийся с « S-1-5-21- » и заканчивающийся на « -500 », является SID встроенной учетной записи администратора. «Настоящие» и активные профили пользователей — это все остальные записи в части реестра HKEY_USERS. В примерах сценариев, включенных в эту статью, указанные выше профили НЕ затрагиваются — затрагиваются только «обычные» пользователи — вы можете легко изменить это, удалив несколько строк в коде.


Загрузить мой улей…


Итак, что, если я хочу изменить профиль пользователя, который в данный момент не вошел в систему? Ну, у нас есть как минимум два варианта:


1 — для ручной загрузки улья в Regedit
2 — для создания скрипта, динамически загружающего куст.


Сначала рассмотрим первый вариант. Если вы откроете Regedit («Пуск» > «Выполнить» > «Regedit») и перейдите к записи HKEY_USERS (вы должны щелкнуть или отметить ее), затем перейдите в меню «Файл», теперь вы сможете выбрать « Загрузить куст… » (см. рис. 2). )


Изображение 24875
фигура 2


На этом этапе нам предлагается ввести путь к файлу NTUSER.DAT (см. рис. 3).


Изображение 24876
Рисунок 3


Файл NTUSER.DAT находится в папке профиля пользователя. Выше мы видим файл NTUSER.DAT пользователя test2. Этот файл находится прямо под папкой «C:Documents and Settings est2» — в Windows Vista профили пользователей обычно хранятся в папке «C:Users».


Если вы не видите файл NTUSER.DAT, как на рисунке 3, вам следует перейти в «Инструменты»> «Параметры папки» и выбрать « Показать скрытые файлы и папки ».


При временной загрузке улья нам нужно дать ему имя — выбирайте сами. На рис. 4 и в примерах сценария мы используем имя: ' TmpLoadHive '.


Изображение 24877
Рисунок 4


Нажмите OK, и иерархия улья должна стать видимой и расширяемой, как показано на рис. 5.


Изображение 24878
Рисунок 5


На рис. 5 «TmpLoadHive» расширен, чтобы показать структуру загруженного пользовательского куста — он должен выглядеть точно так же, как и любой другой пользовательский реестр. Он идентичен тому, что пользователь будет иметь в своем HKEY_CURRENT_USER (HKCU) при входе в систему.


Когда закончите, не забудьте снова выгрузить пользовательский куст, отметив куст «TmpLoadHive» и выбрав меню «Файл» > « Выгрузить куст…», как показано на рис. 6.


Важный!
Если вы не выгружаете кусты, вы не сможете снова загрузить этот куст до перезагрузки, потому что вы не можете загрузить уже загруженный куст (это также относится к вошедшим в систему пользователям, включая пользователей с быстрым переключением пользователей). Это также приведет к сбою сценария при загрузке улья.


Изображение 24879
Рисунок 6


Эта процедура была бы очень раздражающей, если бы вам приходилось делать это для всех профилей пользователей на всех компьютерах в вашем домене, верно? К счастью, у нас есть другой метод, использующий нашего старого доброго друга REG.EXE.


Старый друг спешит на помощь


Команда REG.EXE имеет два очень полезных параметра: LOAD и UNLOAD. Они делают то же самое, что мы делали вручную выше. Нам просто нужно указать временное имя куста и полный путь к файлу NTUSER.DAT, который мы хотим загрузить в память.


Хотите пример скрипта? Хорошо, чтобы установить фон для профиля пользователя по умолчанию, мы можем запустить следующий код:



Приведенный выше код сначала ЗАГРУЗИТ куст для профиля пользователя по умолчанию во временный куст с именем «DefU» в части «HKEY_USERS» базы данных реестра. Затем он установит значение реестра для фона рабочего стола для профиля пользователя по умолчанию, то есть профиля, который автоматически копируется при создании новых пользователей (при их первом входе в систему). Наконец, он РАЗГРУЗИТ временный улей.


Итак, как я могу найти файлы Ntuser.dat в скрипте?


Когда мы хотим загрузить куст для всех пользователей на данной машине, мы хотели бы найти все профили пользователей на этой машине как можно проще и безопаснее. Конечно, мы могли бы просто «просматривать» папки под «Документами и настройками» — или «Пользователи» в Vista/Windows Server 2008 в коде — но у нас есть лучший подход, который является более точным.


В следующем значении реестра:



вы найдете правильный путь к папке профиля для всех локальных пользователей. XXX — это SID пользователя, поэтому, перебрав все эти ключи, мы получим полные пути ко всем локальным файлам NTUSER.DAT.
Я написал функцию VB Script, которая перечисляет папки профилей пользователей на данном компьютере (в одной строке, разделенной вертикальной чертой «|») — локальные или удаленные. Функции исключают профили Systemprofile, LocalService, NetworkService и учетной записи локального администратора — в большинстве случаев они не требуются при очистке, но при необходимости операторы ElseIf можно легко исключить. Функция называется «GetUserProfileDirsFromRegistry», и ее можно найти прямо здесь.


А как насчет перемещаемых профилей, спросите вы? Что ж, файлы NTUSER.DAT — это все, что нам нужно, поэтому, если вы хотите изменить перемещаемые профили пользователей, вместо этого просто напишите сценарий, который «просматривает» сетевое местоположение перемещаемого профиля, которое у вас есть…


Удалить это значение или ключ…


Что ж, теперь мы знаем, как загрузить (или «монтировать») пользовательский куст в скрипте, теперь нам просто нужно что-то изменить в этом кусте. Вероятно, вы могли бы придумать сотни интересных вещей, но я решил использовать только две функции — обе они предназначены для удаления данных из загруженного куста реестра. Вот объяснение:


После вирусной атаки вам, возможно, придется выполнить очистку клавиши «Выполнить»:
для всех локальных пользователей. Возможно, какое-то вредоносное ПО создало запись, от которой вам нужно избавиться — для этой цели я создал подпрограмму DeleteSingleValueFromTmpLoadHive. Эта процедура может удалить одно значение в реестре.


Вы также можете удалить весь раздел реестра, включая подразделы и значения, например. , для этой цели я включил подпрограмму DeleteKeyAndSubsFromTmpLoadHive.


Золотая комбинация


При объединении того, что мы узнали здесь, и выполнении некоторых старых добрых сценариев VBS у нас есть сценарий, который выполняет следующие задачи:



  1. Найдите все папки профиля на локальном компьютере, прочитав значения реестра, упомянутые выше.
  2. Игнорировать встроенные профили, связанные с ОС, включая учетную запись локального администратора.
  3. Загрузите куст реестра из файлов NTUSER.DAT в расположенные папки профиля.
  4. Удалить раздел реестра, включая все подразделы, значения и т. д. для каждого «смонтированного» профиля пользователя *
  5. Удалите одно значение реестра для каждого «подключенного» профиля пользователя **
    * «<USER HIVE>SoftwareWindowsecurity.com» (и все вложенные ключи/значения)
    ** «<USER HIVE>SoftwareMicrosoftWindowsCurrentVersionRunVirusExecutable»

Сценарий НЕ запрашивает подтверждение, когда он завершен, и любые ошибки будут подавлены (с помощью обработки «При ошибке возобновить дальше»). Конечно, это поведение можно изменить в соответствии с вашими потребностями. Поскольку это не совсем статья о сценариях, я не могу слишком углубляться в код, но если вы немного знакомы со сценариями, вы сможете получить довольно хорошее представление о том, что они делают.


Полный пример кода можно посмотреть и скачать здесь! Он был протестирован на Microsoft Windows XP, Microsoft Windows Server 2003 и Microsoft Windows Vista.


СИСТЕМА здесь!


В этот момент мы можем «поразить» одну машину, локальный компьютер, с которого мы выполняем скрипт, или, если быть более точным, все пользовательские ульи на нем. Однако есть серьезное ограничение: пользователи в целом (надеюсь) НЕ являются локальными администраторами, и поэтому они не смогут изменять реестр для других пользователей! Это означает, что мы хотели бы либо запустить сценарий от имени локального администратора вручную для всех машин в домене, либо сделать что-то чрезвычайно эффективное: использовать групповую политику на уровне машины и настроить сценарий запуска компьютера. Чтобы узнать больше о сценарии запуска компьютера, см. раздел «Внешние ссылки».


Прелесть сценария запуска компьютера заключается в том, что, во-первых, он работает в контексте Local System, очень мощной учетной записи (поэтому вы можете делать практически все), а во-вторых, его можно настроить для выполнения на тысячах компьютеров. в течение нескольких минут, разместив объект групповой политики на уровне домена, сайта или организационной единицы (OU) Active Directory!


Имейте в виду, что первая загрузка нового объекта групповой политики компьютера может «не сработать», в этом случае вам придется перезагрузить компьютер (и, возможно, выполнить команду GPUPDATE /FORCE, чтобы быть уверенным). Кроме того, дайте сценарию время для выполнения перед входом в систему — обе эти упомянутые «проблемы» могут возникнуть из-за того, как эти политики загружаются во время загрузки системы. В этой статье я больше не буду рассматривать эти «функции» групповой политики.


Если у вас есть функция Wake-On-LAN (WOL) в сети, вы можете загружать компьютеры в ночное время, чтобы выполнить некоторую «очистку», а затем выключить компьютеры. Таким образом, комбинируя сценарии, WOL и групповую политику, мы можем выполнить очень эффективную работу по очистке за короткое время — или какую-то другую работу, которую мы могли бы захотеть выполнить, не делая слишком много работы: воображение — это единственный предел!


Вывод


Мы увидели, как комбинировать сценарии и сценарии запуска компьютера в групповой политике для очень эффективного выполнения задания по очистке. Теперь мы можем обновлять профили пользователей, даже если они в данный момент не загружены в память, даже не входя в систему(ы).


Этот подход может быть доработан для изменения других частей профилей, например, файлов и папок, для всех пользователей данного компьютера. Не стесняйтесь присылать мне любые отзывы и идеи, которые у вас могут быть по этому поводу.


внешние ссылки
Как запустить сценарий входа один раз, когда новый пользователь входит в систему в Windows Server 2003
Назначение сценариев запуска компьютера