Изолировать размещенный сервис (svchost.exe) в своем собственном процессе

Как уже сейчас знают многие суперпользователи, svchost.exe используется Microsoft для размещения нескольких служб Windows в одном процессе, по одному процессу на группу служб.

В Windows 7 (и позже?) Можно щелкнуть правой кнопкой мыши по определенному процессу svchost.exe в диспетчере задач и выбрать "Перейти к службам", чтобы увидеть службы, запущенные "внутри". Во всех версиях Windows также можно использовать Process Explorer.

Однако это не позволяет увидеть, например, какой конкретный сервис закрепляет ЦП на 100% или использует 700 МБ памяти. Можно вручную остановить службы в той же группе и использовать процесс исключения, но это утомительно, особенно если проблема возникает только периодически.

Вероятно, у Microsoft есть веская причина группировать такие службы (возможно, сокращая накладные расходы на процесс), но есть ли способ заставить отдельный сервис работать изолированно в своем собственном svchost.exe?

2 ответа

Решение

Нет, правильный способ - запустить эту команду:

sc configwuauserv type= own

это настраивает запуск Центра обновления Windows в своем собственном процессе. Чтобы вернуть это, запустите

sc config wuauserv type= share

из командной строки с правами администратора. Это меняет значение настройки type, Если тип 0x20 это групповой процесс, если значение 0x10 это собственный процесс.

Начиная с Windows 10 Creators Update (версия 1703, сборка 15063), Windows делает это самостоятельно, если у вас достаточно оперативной памяти.

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

В следующем примере изолируется Центр обновления Windows (wuauserv) служба, которая, как известно, плохо себя ведет и использует чрезмерные ресурсы. Метод был протестирован только на Windows 7.

  1. Запустите regedit.exe (редактор реестра) и перейдите к

    HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Svchost
    

    Этот ключ содержит подраздел для каждой группы, содержащий настройки группы, а также значение REG_MULTI_SZ для каждой группы, в которой перечислены службы в группе.

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

  3. Создайте значение REG_MULTI_SZ, названное в честь новой группы, содержащее только одну строку с именем службы; и удалите имя службы из существующей группы REG_MULTI_SZ.

  4. Затем перейдите к целевому подразделу службы под HKLM\SYSTEM\CurrentControlSet\services, В этом примере:

     HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\wuauserv
    
  5. Изменить ImagePath значение и измените имя группы после -k на имя новой группы.

  6. Перезапустите целевую службу (например, с помощью вкладки "Службы" в диспетчере задач или с помощью services.msc), и она должна появиться в отдельном процессе svchost.exe.

В следующий раз, когда Центр обновления Windows будет запущен, его использование ресурсов будет сразу же видно в диспетчере задач, и его даже можно будет убить с помощью "Завершить процесс" (хотя не рекомендуется для более важных служб).

Если служба не запускается, просмотрите шаги, описанные выше, и попробуйте снова, или попробуйте отменить изменения, одновременно вызывая предупреждение в верхней части.:-)

Другие вопросы по тегам