Powershell не удалось открыть службу на компьютере
«Ошибка 1058: Служба не может быть запущена либо потому, что она отключена, либо потому, что с ней не связаны включенные устройства».
«Произошла системная ошибка 1058. Невозможно запустить службу».
Преимущественно ошибка 1058 высвечивается по из-за непредвиденного прекращения работы службы. Причиной такому поведению становится либо внутренний конфликт, либо некорректные изменения настроек. Важно помнить, что практически все службы взаимозависимы, изменение параметров работы одной из них, может вызвать целый ряд сбоев в других сервисах. Часто фигурирующая служба «Обновления Windows» требует доступ к другим сервисам: «Модуль запуска процессов DCOM сервера», «Сопоставитель конечных точек RPC». Неправильная работа любого из них приведет к появлению ошибки в связанных с ними процессах. Решением будет проверка всех зависимостей службы, в которой появляется ошибка 1058, а также анализ настроек основного сервиса.
1) Проверить зависимости
Первым и самым эффективным способом исправления будет ручной поиск проблемных служб.
Совет! Та служба, которая стала виновником проблемы, тоже может быть неактивна из-за другого сервиса. Если ее не удается запустить, стоит так же само перейти на вкладку «Зависимости» и проверить, что каждая из перечисленных здесь работает правильно.
2) Запустить через PowerShell или редактор реестра
Альтернативные способы запуска тоже могут сработать, особенно в случаях, когда все зависимости проверены и они работают нормально.
Как включить службу через реестр:
- Жмем клавиши Win + R и в строку выполнить вставляем regedit, затем кликаем по кнопке «Ок».
- Открываем каталоги в следующем порядке HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services.
- Находим название службы из списка и изменяем значение для нее на 2.
- Дважды кликаем по DependOnService и записываем кодовые имена зависимых служб.
- Открываем каждый из указанных там ключей и устанавливаем ему значение 2.
- Перезагружаем компьютер.
Чтобы через PowerShell запустить службу, достаточно ввести команду net start имя_службы, где имя_службы – название сервиса.
По опыту, должно помочь включение службы, от которой зависит проблемный сервис, связанный с ошибкой 1058. Иногда удается обойти проблему изменим подход, например, выбрав реестр. На сегодня это все, что мы можем предложить по данной ошибке.
Так как команда для получения статуса службы называется Get-Service, догадаться о том, как пишутся другие команды не составит труда. На худой конец мы можем спросить у PowerShell обо всех командах, так или иначе относящихся к работе со службами. Обратите внимание, что мы использовали параметр –noun для получения всех команд, связанных со службами.
Взглянем на эти команды внимательнее.
STOP-SERVICE
Чтобы остановить службу, мы должны уточнить ее имя.
Однако в конвейер ничего не будет передано. Некоторые командлеты, такие как Stop-Service, созданы таким образом, что по умолчанию они не записывают объект в конвейер. Мы же заставим это сделать, использовав параметр –Passthru.
Если служба не запущена, то командлет ничего не выведет, равно как и не выдаст никакой ошибки. Поэтому иногда лучше передать объект в Stop-Service (естественно использовав при этом параметр –whatif).
Параметр –WhatIf был добавлен для того, чтобы мы посмотрели, что будет, если командлет будет запущен. Когда я удостоверюсь, что это именно та служба, которая меня интересует, я просто удалю -Whatif и остановлю службу.
Как я уже упомянул выше, если служба уже остановлена, то командлет ничего не сделает. И использование Stop-Service в этом случае никому не навредит. Однако я все же предпочитают более цивилизованный подход, а именно:
Если служба запущена, то объект передается в конвейер и отправляется в Stop-Service. Ниже приведен вариант с остановкой нескольких служб.
Некоторые службы не захотят останавливаться – в силу наличия зависимых служб – что мы и видим на скриншоте ниже.
В таком случае используем параметр –Force. В большинстве случаев это работает, но без “защиты от дурака”. Помните, что команда также остановит зависимые службы.
START-SERVICE
Запуск службы осуществляется аналогичным образом. Он поддерживает параметр –Whatif, и вам придется использовать –Passthru, чтобы увидеть объекты.
И снова: если служба уже запущена, командлет ничего не сделает. Однако вы можете попытаться запустить службу и получите такую ошибку.
Причиной тому в большинстве случаев является выключенные службы. Как конфигурировать настройки службы, я расскажу в следующей статье.
Если вы хотите запустить службы и все службы, зависимые от нее, используйте следующее выражение:
Мы должны явно получить зависимые службы, потому что Start-Service не запустит автоматически их.
RESTART-SERVICE
Вы удивитесь, но перезапуск службы работает также как два предыдущих примера. Используйте –Passthru, если хотите убедиться, что служба запущена.
Так как мы осуществляем остановку службы, нам может понадобиться параметр –Force.
ПРИОСТАНОВКА И ВОЗОБНОВЛЕНИЕ РАБОТЫ
Работа некоторых служб может быть приостановлена на некоторое время, а затем возобновлена, и мы можем это сделать через PowerShell. Однако если служба не удовлетворяет требованиям, мы получим такие ошибки. (на примере показано, что мы пытались приостановить службу bits)
В чем же проблема? Смотрим на объект (используя Get-Service).
Если значение свойства CanPauseAndContinue равно True, значит мы можем приостанавливать и возобновлять работу службы. Найдем такие службы:
Как мы видим, не так много служб удовлетворяют этому требованию.
Готовы возобновить работу службы? Используйте следующее выражение:
Оба командлета также поддерживают –Whatif.
УДАЛЕННЫЕ СЛУЖБЫ
Как вы могли обратить внимание, все примере выше мы демонстрировали на локальном машине. И это неслучайно. К сожалению даже в PowerShell v3, ни у одного из этих командлетов нет параметра, который позволял бы управлять службой на удаленном компьютере. Get-Service, конечно, поддерживает параметр –Computername, но не более. Службу лицезреть вы сможете, а что-либо с ней сделать не получится. Нет, можно, конечно, если удаленный компьютер работает с PS v2 и включен PowerShell Remoting. Тогда мы можете использовать все выше приведенные команды, используя Invoke-Command для удаленного компьютера или PSSession. С другой стороны, проще управлять одной службой на нескольких серверах.
Управление службами на удаленных компьютерах не ограничивается вышеперечисленным, но это уже будет предмет рассмотрения последующих статей.
Все эти командлеты могут быть использованы в конвейерном выражении и зачастую это лучший вариант. Использование Get-Service для получения объектов и последующая передача их в подходящий командлет.
УСТАНАВЛИВАЕМ УДАЛЕННЫЙ СТАТУС
Итак, мы выяснили, что у командлета Stop-Service отсутствует такой полезный параметр как –Computername. Мы можете использовать эти команды в удаленной сессии, обратившись к командлету Invoke-Command, что уже само по себе продуктивно, если вы работаете со службой на нескольких компьютерах. Одно можно запускать, останавливать, перезапускать, ставить на паузу и запускать заново, используя Set-Service.
Эта команда поддерживает параметр –WhatIf. Вы также должны использовать –Passthru для передачи объектов в конвейер.
Валидными значениям для параметра –Status являются “запущена” (running), “остановлена” (stopped) и “на паузе” (paused). Помните, что у службы есть зависимые службы, мы не сможете изменять ее, что и продемонстрировано на скриншоте ниже.
К сожалению, у Set-Service отсутствует параметр –Force, поэтому придется вернуться к использованию PowerShell remoting и Invoke-Command. Если вы хотите перезапустить удаленную службу, используйте следующую команду:
Не забудьте использовать –Passthru, в противном случае вторая команда Set-Service ничего не осуществит.
Что по мне, так я предпочитаю работать сразу с несколькими службами, которые я не могу удаленно остановить, используя Set-Service, хотя их запуск проблем составляет. Я использую Invoke-Command. Но помните, что используя параметр –Computername PowerShell осуществляет подключение, используя RPC и DCOM, что может привести к проблемам с файрволом. Invoke-Command использует PowerShell remoting, который мы может быть еще не настроили или не включили.
УСТАНАВЛИВАЕМ ТИП АВТОЗАПУСКА СЛУЖБЫ
Set-Service полезнен, когда вы хотите включить или отключить службу, используя параметр –StartupType. Если Вы настроили службу, используя значения Automatic, Manual or Disabled. К сожалению, не существует варианта для Automatic (Delayed).
Однако, просто взглянув на объект, мы не сможем сказать, к какому типу автозагрузки он относится.
Как это сделать – одна из тем следующей статьи.
Помните, что изменение типа автозагрузки не повлияет на текущий статус службы.
Так что если вы хотите выключить и остановить (или включить и запустить) службу, передайте объект в подходящий командлет.
Технически, Set-Service позволяет вам изменить отображаемое имя службы и описание, но лично мне никогда не приходилось использовать в своей работе. Я использую Set-Service для включения и выключения служб. Если необходимо управлять службами удаленно, то я использую Invoke-Command.
Все, что я продемонстрировал в последних статьях, было связано с использованием специфических типов объектов службы, которые, как вы могли заметить, имеют некоторые ограничения. В следующей статье мы рассмотрим другие возможности по управлению службами, которые призваны обойти эти ограничения.
Во всяком случае, вы не должны паниковать. Как всегда, существуют различные решения для устранения неполадок, которые можно применить для исправления ошибки «Windows PowerShell прекратил работу».
Действия по исправлению ошибок Windows PowerShell перестали работать
- Инициируйте полное сканирование системы.
- Сделайте чистый процесс загрузки.
- Отключите и снова включите Windows PowerShell.
- Создайте новую учетную запись Microsoft.
1. Инициируйте полное сканирование системы
В некоторых ситуациях атака вредоносного ПО может быть причиной того, что Windows PowerShell не работает должным образом. Итак, первое, что нужно сделать, это запустить сканирование безопасности.
Скорее всего, вы заразились Poweliks , вредоносной программой, которая мешает PowerShell. Файл, связанный с этим вирусом: dllhost.exe * 32 или dllhst3g.exe * 32, и его обычно можно остановить из диспетчера задач.
Теперь в этом случае вам нужно использовать антивирусную или антивирусную программу, например Malwarebytes, и сканировать систему Windows 10 на наличие возможных зараженных файлов. Программа безопасности должна автоматически находить и удалять вредоносные программы.
Примечание : рекомендуется запускать сканирование безопасности из безопасного режима, то есть когда сторонние приложения и процессы отключаются платформой Windows 10. Вы можете перейти в безопасный режим:
- Нажмите горячие клавиши Win + R и в поле RUN введите msconfig и нажмите Enter.
- Из окна Конфигурация системы перейдите на вкладку Загрузка .
- В разделе «Загрузка» выберите Безопасная загрузка .
- Сохраните изменения и перезагрузите компьютер.
- Это все.
2. Инициируйте чистую загрузку
Вы можете увидеть, вызывает ли программный конфликт сбой в Windows PowerShell, инициировав чистую загрузку. Таким образом, вы можете запустить систему Windows 10 только с функциями по умолчанию.
Если ошибка Windows PowerShell перестала работать не отображается после выполнения чистой загрузки, это означает, что существует конфликт программного обеспечения, поэтому необходимо удалить программу, которая стоит за этой проблемой.
Вот как вы можете запустить процесс чистой загрузки:
- Нажмите горячие клавиши Win + R на клавиатуре, чтобы запустить окно RUN.
- Там введите msconfig и нажмите Enter.
- В Конфигурация системы перейдите на вкладку Общие.
- С этого момента в разделе Выборочный запуск снимите флажок «Загружать элементы запуска».
- Затем перейдите на вкладку Услуги .
- Установите флажок скрыть все службы Microsoft , а затем нажмите Отключить все .
- Теперь перейдите на вкладку Автозагрузка и нажмите ссылку открыть диспетчер задач .
- Из диспетчера задач отключите все автозагрузки программ.
- Сохраните ваши изменения и закройте эти окна.
- Перезагрузите систему Windows 10.
ТАКЖЕ ПРОЧИТАЙТЕ . Microsoft PowerShell все чаще используется для распространения вредоносного ПО.
3. Отключите и снова включите Windows PowerShell
ТАКЖЕ ЧИТАЙТЕ: 10 лучших программ для удаления для пользователей ПК
4. Создайте новую учетную запись Microsoft
Итак, попробуйте создать новую учетную запись, а затем убедитесь, что проблема все еще возникает или нет.Вот то, что вам нужно следовать:
Вы можете легко связаться с нами, используя поле для комментариев снизу или заполнив контактную форму, доступную на странице О нас.
Кроме того, если вы сталкивались с другими решениями для исправления этой ошибки, перечислите шаги по устранению неполадок в комментариях ниже, и мы соответствующим образом обновим это пошаговое руководство.
Для управления службами в Powershell есть восемь команд с помощью которых мы можем контролировать весь процесс работы сервисов и создавать новые. Что бы увидеть весь список команд созданных в PS для работы с сервисами нужно выполнить:
Мы увидим следующие командлеты:
- Get-Service - получение списка служб в Powershell.
- New-Service - создание нового сервиса.
- Restart-Service - перезапуск службы.
- Resume-Service - восстанавливает работу остановленного сервиса.
- Set-Service - изменение настроек.
- Start-Service - запуск службы в Powershell.
- Stop-Service - остановка.
- Suspend-Service - приостановка работы (пауза).
Учитывайте, что в виде команд делается не полное управление сервисами. Например удаление делается через WMI, которое тоже будут рассмотрены.
Навигация по посту
Получение списка служб
Узнать статус всех служб можно так:
Каждый результат выдаваемый командами в PS представляет собою объект. Этот объект содержит разные свойства и методы. Свойства - это например имя или статус. По умолчанию мы видим не все свойства. Что бы узнать какие еще свойства есть у команды нужно выполнить следующее:
Часть свойств реализована в виде ключей. Попробуем вывести сразу все свойства всех сервисов, но в таком случая вывод будет сложно читаемый:
Возможно вывести только имена, статус и тип запуска:
Или выведем информацию по одному сервису:
У сервисов есть короткое имя и отображаемое. Так мы выведем оба:
В именах мы можем использовать маски, а это значит что мы можем не знать полное название и использовать знак * в том месте, где не уверены в названии или написании:
Не желательно указывать отображаемое имя так как язык операционных систем может быть разным и если вы выполняете командлеты удаленно, вероятно будут ошибки:
- Cannot find any service with service name
- Cannot find any service with display name
- Не удается найти службу с отображаемым именем
Кроме этого есть два ключа, которые тоже поддерживают маски:
- Include - включают поиск по какой-то маске или точному соответствию.
- Exclude - исключает упоминание.
Можно сравнить разницу с прошлым примером:
У сервисов несколько статусов:
По каждому из них мы можем отфильтровать результат:
Кроме этого есть 3 типа запуска:
- Automatic - автоматический запуск вместе с системой.
- AutomaticDelayedStart - запуск после загрузки системы.
- Manual - ручной запуск.
- Disabled - отключенный.
Допустим, что у нас есть какая-то проблема в операционной системе и мы хотим проверить все сервисы, который автоматически запускаются при включении ОС. Для этого нам нужно использовать несколько условий, где статус не равен Running и тип запуска равен Automatic:
Службы могут быть зависимы от других и для проверки этих свойств есть два параметра:
- DependentServices - кто зависит от этого сервиса.
- RequiredServices - от кого зависит этот сервис.
Аналогично параметрам команды выше есть свойства DependentServices и ServicesDependedOn (RequiredServices). Они выводят одно и то же.
Есть несколько свойств, которые не выведены в параметры - это:
- CanPauseAndContinue - можно ли приостановить работу сервиса и возобновить.
- CanShutdown - может ли быть выключен.
- CanStop - может ли быть полностью остановлен.
Эти свойства так же можно увидеть в GUI. В командлете ниже я использую алиас gsv (короткое имя Get-Service):
Каждая команда PS, где присутствует параметр ComuterName, может быть выполнена удаленно. Для удаленного управления в Powershell нужны дополнительные настройки, которые уже описывались в предыдущей статье.
Имена всех компьютеров, с которых мы хотим получить имена сервисов, можно указать через запятую:
Остановка, перезапуск и запуск служб
Чтобы в Powershell запустить службу и остановить достаточно указать только имя. Причем можно указывать как короткое и отображаемое имя:
Можно выполнить получение, остановку и запуск в одну команду:
Во большинстве командлетах PS, которые делают изменения, можно увидеть два параметра. Первый - это WhatIf, который покажет результат выполнения командлета, но не попытается ее выполнить. Такие параметры удобно использовать при выполнении сложных задач типа кластеров. Второй параметр Confirm, который потребует подтверждение перед выполнением. Вместе эти параметры не работают:
В запуске и остановке так же можно использовать параметры фильтрации, которые вы видели при получении статусов выше. Будьте осторожны перед выполнением так как вы можете остановить все службы:
Если с сервисом работает другой сервис, то мы не завершим его работу и нужно указать дополнительный ключ Force:
Если он не стоит появится ошибка:
Как уже было описано выше сервисы могут быть зависимы от других и в таком случае запуск может не получится. На примере ниже я получил все родительские сервисы (от которых зависит Spooler) и запустил их, а затем запустил требуемый:
Перезапуск сервисов работает так же со всеми параметрами:
Удаленный запуск и остановка командлетами не предусмотрена, но это исправляется стандартными методами:
Восстановление и приостановка работ служб
Не каждую службу можно приостановить (Pause) и восстанавливть. Что бы увидеть все службы, у которых есть такая возможность, выполните:
Командой ниже мы получи, нажмем паузу и восстановим работу сервиса Winmgmt:
Ошибки, если мы попытаемся остановить службу у которых нет такой возможности:
В этих командах так же можно использовать параметры Include и Exclude, с масками.
На скрипте ниже показана проверка возможности приостановки сервиса, если у него есть такая возможность. Если ее нет, то сервис остановит свою работу:
Изменение с Set-Service
Командлетом ниже я изменил тип запуска сервиса с отключенного на автоматический:
В случае изменения сервисов нельзя использовать маски *.
В документации Microsoft говориться про возможность изменения на четыре режима со следующими названиями:
- Automatic
- AutomaticDelayedStart
- Disabled
- Manual
Во первых половина называется иначе и изменение не срабатывает. Возможно изменение не срабатывает из-за багов Windows Server 2019,может из-за зависимостей (в GUI все работает), но скорее всего дело в PS. При работе с WMI все срабатывает. Реальные варианты запуска такие:
Через эту команду можно так же выполнить запуск и остановку:
Все возможные значения:
Можно изменить описание сервиса:
Команды изменения можно выполнять удаленно:
Создание сервисов с New-Service
Для создания сервиса необходимо указать два параметра - это имя и путь до бинарного файла:
В PS 5.1 не предусмотрена команда удаления, она появилась в версии 6.1, которая устанавливается отдельно и может работать иначе. Для удаления сервисов, а так же частичного изменения, используется WMI. Указывайте все возможные параметры, что бы в последующем не лезть в WMI.
Параметры, которые в последующем нельзя будет изменить через PS:
- DisplayName - полное отображаемое имя.
- Credential - учетная запись, под которой будет происходить запуск.
- DependsOn - от кого будет зависеть.
При объявлении переменной $credential у нас запросятся учетные данные (логин/пароль). По умолчанию сервис работает под текущим аккаунтом. Я создавал сервис на доменном компьютере и пока я не ввел FQDN вид [email protected] я получал ошибку:
Кроме этого есть параметры, которые возможно изменить через команды выше:
- Description - описание.
- StartupType - тип запуска.
Получение с помощью WMI класса
За работу со службами в WMI отвечает класс win32_service. Преимущества такого подхода в том, что тут можно посмотреть и изменить все детали работы сервисов. Более подробно WMI в Powershell мы уже рассматривали.
Что бы получить список аналогичный Get-Service выполните:
В классе WMI можно увидеть больше свойств, которые можно использовать:
Одно из преимуществ использования в WMI это то, что мы можем увидеть идентификатор процесса под которым работает сервис. Если сервис остановлен, то его идентификатор 0. Так мы увидим идентификатор процесса с именем WinRM и получим всю информацию по процессу:
О том как работать с процессами в Powershell мы писали в прошлой статье.
С помощью WMI мы можем вернуть имя аккаунта, под которым запущена служба и ее описание. Используя параметр ComputerName это можно сделать удаленно на множестве компьютеров:
Изменение с помощью WMI класса
Для управления в WMI существую методы. Все методы класса можно получить так:
Удалим сервис, который создавался через New-Service:
Для изменения паролей нужно использовать следующую конструкцию. После выполнения команды сервис нужно перезапустить:
$null установлены у всех параметров, которые мы не хотим изменять. В нашем случае нужно изменить только логин и пароль и они указаны в переменных. Увидеть какие параметры не меняются с $null можно так:
Читайте также: