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

13

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

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

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

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

Сёрен Лёвборг
источник

Ответы:

16

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

sc configwuauserv type= own

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

sc config wuauserv type= share

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

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

magicandre1981
источник
1

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

В следующем примере изолируется wuauservслужба Windows Update ( ), которая, как известно, ведет себя неправильно и использует чрезмерные ресурсы. Метод был протестирован только на 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 будет запущен, его использование ресурсов будет сразу видно в диспетчере задач, и его даже можно будет убить с помощью «Завершить процесс» (хотя не рекомендуется для более важных служб).

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

Сёрен Лёвборг
источник