Автоочистка и перезагрузка службы печати принт-сервера / Хабр

Что делать, если «спулер» сильно грузит процессор

Многие пользователи разных версий «Виндовс» часто жалуются на то, что процесс «spooler» сильно грузит процессор. Проблема станет более острой, когда загрузка начинает доходить за отметку в 80 процентов. Это действительно нетипичная ситуация и такой загрузки быть не должно. Рассмотрим возможные причины и их быстрое самостоятельное решение.

  • Большая очередь из заданий на печать или файлы очень большого размера. Просто очищаем список заданий и разбиваем большой файл на несколько частей соответственно.
  • В перечне принтеров много моделей, которые вообще или очень редко используются. Их лучше удалить, так как службе печати приходится постоянно их «мониторить», что вызывает дополнительную нагрузку.
  • Устаревший или «битый» драйвер сам может негативно воздействовать и потреблять много ресурсов. В такой случае переустановка неизбежна.

Переустановка всей службы отдельно от операционной системы невозможна. Для возобновления ее корректной работы Вы можете только попытаться выполнить выше перечисленные действия.

Какая причина была у Вас?

  • 4 голоса — 67% из всех
  • 1 голос — 17% из всех
  • Много заданий в очереди печати 17%, 1 голос1 голос — 17% из всех
  • Просто была остановлена служба 0%, 0 0 — 0% из всех
  • 0 — 0% из всех

Автоочистка и перезагрузка службы печати принт-сервера

Короткий но полезный скрипт для админов. Имеется принтсервер с 34 принтерами, и у него происходят застревания в очереди печати, обычно это происходит когда принтер отдела отправлен в ремонт, а другой отдел хочет им отправить документ на не существующий принтер. Загрузка процессора поднимается и может достигнуть 100%.

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

Автоочистка и перезагрузка службы печати принт-сервера / Хабр

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

для того чтобы снять нагрузку с процессора нужно очистить задания печати в каталоге C:WindowsSystem32spoolPRINTERS просто удаляются все файлы в каталоге при остановленной службе:

Get-Service *spool* | Stop-Service -Force -Verbose
Start-Sleep -Seconds 5
$path = "C:WindowsSystem32spoolPRINTERS"
Get-ChildItem $path -File | Remove-Item -Force -Verbose
Get-Service Spooler | Start-Service -Verbose

Для административного оповещения предварительно сохраняем — кто, какой документ, какого размера и куда печатал. Заодно пример как создавать объекты.

# получаем список заданий со всех принтеров в системе на этот момент
$temp = Get-Printer | Get-PrintJob

# создаем пустой список объектов
$Jobs = @()

# перебирем все объекты заданий печати чтобы сформировать полноценный объект
foreach ( $p in $temp ) {
# ниже применяется свойство [ordered] позволяющее зафиксировать порядок в свойствах
# объекта обычно пошик создает свойства в произвольном порядке
# этого указателя нет в старом пошике, поэтому если получаете ошибку просто 
# удалите ее она нужна больше для людей - когда ведешь вывод в консоль
# в данном случае она нужна чтобы зафиксировать порядок колонок в html письма
$props = [ordered]@{    ID = $p.Id
                            PrinterName = $p.PrinterName
                            UserName = $p.UserName
                            DocumentName = $p.DocumentName
                            DataType = $p.Datatype
                            SubmittedTime = $p.SubmittedTime
                            Size = $p.Size
                            JobTime = $p.JobTime
                            PagesPrinted = $p.PagesPrinted
                            TotalPages = $p.TotalPages
                            Status = $p.Status
                }
# создаем еденичный объект с значениями из переменной $props
$obj = New-Object -TypeName PSObject -Property $props

# добавляем в список объекта
$Jobs  = $obj
}

# на выходе имеем полноценные объекты
$Jobs

При работе желательно создавать объекты.

Мы хотим иметь диагностическое инфо на момент перезагрузки спулера для этих целей добавим список процессов с загрузкой по процессору и памяти:

# дергаем запущенные процессы
$temp = Get-Process | sort -Property cpu -Descending

# объявляем пустой список объектов
$proc = @()

foreach ( $p in $temp ) {
# заполняем свойства будущего объекта
$props = [ordered]@{    Name=$p.ProcessName
                        CPU_total_in_seconds=$p.CPU
                        PhysicallMemory_in_Mb=$p.WS/1mb
                        ProcessID=$p.Id
                }
# создаем объект из свойств
$obj = New-Object -TypeName PSObject -Property $props

# добавляем его в список объектов
$proc  = $obj
}

$proc

Для принятия решения что пора перегружать спулер, берутся отсчеты от процессора и если они превысили порог в течение 5 секунд то считается что пора перегружаться. Данная схема не оптимальна, например при установке обновлений может держаться такая загрузка, но для оперативной работы, и ежедневной деятельности показала себя достаточной, поэтому и оставляю ее как есть:

# счетчик загрузки, если загрузка больше чем 95 то инкремент
$cfi = 0
for( $i=1; $i -le 5; $i   ) {
Start-Sleep -Seconds 1
# подгружаем загрузку процессора
$load = Get-WmiObject win32_Processor | select -Property LoadPercentage
Write-Host "CPU load $load" -ForegroundColor Green

if ($($load.LoadPercentage) -gt 95) { 
$cfi = $cfi   1
Write-Host "indicator is $cfi" -ForegroundColor Green
}
}

Скрипт нужно добавить в шедулер на запуск каждые 5-10 минут.

Для отправки письма мы используем с небольшими изменениями метод описанный здесь.

Отправка почты вынесена в отдельную функцию, т.к. она используется в других местах, вам нужно поменять адрес почтового сервера ‘SMTPServer’=’Exchange.domain.ru’ на ваш сервер вот в этом месте:

$params = @{'To'=$MailAddress
           'From'='bot@domain.local'
           'Subject'="$Subject $Date"
           'Body'=$MailBody
           'BodyAsHTML'=$True
           'SMTPServer'='Exchange.domain.ru'
           }
Send-MailMessage @params -Encoding $encoding

И заменить адрес

admin@domain.ru

на адрес на который должно уходить административное оповещение вот здесь:

Send-ToAdmin -MailAddress 'admin@domain.ru' -Style $Style -Subject 'Сервер печати - процессор загружен на 100%' -Body $Body -Header1 $header

В первоначальной редакции скрипт умел извлекать DLL загруженные в память для каждого процесса для того чтобы выловить «глючный» драйвер. в данной редакции убран т.к. генерирует слишком большое количество инфо, был реализован через

ListDll

, но генерировал очень большой список.

Полный код скрипта:

<#
смотрит за спулером, чистит очередь и перегружает службу
дополнение отправка уведомления на почту
#>
$StyleYellowSimple = @'
<style>
body { background-color:#ffffff;
       font-family:Tahoma;
       font-size:12pt; }
td, th { border:1px solid black;
         border-collapse:collapse; }
th { color:white;
     background-color:black; }
     table, tr, td, th { padding: 2px; margin: 0px }
table { font-family: "Lucida Sans Unicode", "Lucida Grande", Sans-Serif;
        font-size: 14px;
        border-radius: 10px;
        border-spacing: 0;
        text-align: center; }
th { background: #BCEBDD;
     color: white;
     text-shadow: 0 1px 1px #2D2020;
     padding: 10px 20px; }
th, td { border-style: solid;
         border-width: 0 1px 1px 0;
         border-color: white; }
th:first-child, td:first-child { text-align: left; }
th:first-child { border-top-left-radius: 10px; }
th:last-child { border-top-right-radius: 10px;
                border-right: none; }
td { padding: 10px 20px;
     background: #F8E391; }
tr:last-child td:first-child { border-radius: 0 0 0 10px; }
tr:last-child td:last-child { border-radius: 0 0 10px 0; }
tr td:last-child { border-right: none; }
</style>
'@

<#
    отправляет письмо на указанный адрес с оповещением.
    для использования в других частях скриптов
#>
function Send-ToAdmin
{
Param ( [string]$MailAddress = 'admin@domain.ru',
        [string]$Subject = 'Test message',
        [string]$Header1,
        [string]$Body,
        [string]$Style
    )
BEGIN {}
PROCESS {
    
    Write-Verbose 'definiting CSS'

<#    Switch ($Style)
    {
        'YellowSimple' { $head = $StyleYellowSimple; break }
        'BlueSimple' { $head = $StyleBlueSimple; break }
        'DataTable' {$head = $StyleResposTable; break }
        default { $head = $StyleYellowSimple; break }
    }#>
    $head = $StyleYellowSimple
    $encoding = [System.Text.Encoding]::UTF8
    
    $Date = Get-Date
    $MailBody = ConvertTo-HTML -head $head -PostContent $Body -PreContent "<h1>$Subject. Date:$Date</h1><br><h3>$Header1</h3>" | Out-String
    
    Write-Verbose "Sending e-mail. Address: $MailAddress"

    $params = @{'To'=$MailAddress
               'From'='bot@domain.local'
               'Subject'="$Subject $Date"
               'Body'=$MailBody
               'BodyAsHTML'=$True
               'SMTPServer'='Exchange.domain.ru'
               }

    Send-MailMessage @params -Encoding $encoding
}
END{}
}

$cfi = 0
for( $i=1; $i -le 5; $i   ) {
    Start-Sleep -Seconds 1
    $load = Get-WmiObject win32_Processor | select -Property LoadPercentage

    Write-Host "CPU load $load" -ForegroundColor Green

    if ($($load.LoadPercentage) -gt 95) { 
        $cfi = $cfi   1
        Write-Host "indicator is $cfi" -ForegroundColor Green
    }
}

if ($cfi -gt 2) {
    # дергаем процессы для инфо
    $temp = Get-Process | sort -Property cpu -Descending

    $proc = @()
    foreach ( $p in $temp ) {
        $props = [ordered]@{    Name=$p.ProcessName
                                CPU_total_in_seconds=$p.CPU
                                PhysicallMemory_in_Mb=$p.WS/1mb
                                ProcessID=$p.Id                                                           
                        }

        $obj = New-Object -TypeName PSObject -Property $props
 
        $proc  = $obj
    }

    $temp = Get-Printer | Get-PrintJob
    
    $Jobs = @()
    foreach ( $p in $temp ) {
        $props = [ordered]@{    ID = $p.Id
                                PrinterName=$p.PrinterName
                                UserName=$p.UserName
                                DocumentName=$p.DocumentName
                                DataType=$p.Datatype
                                SubmittedTime=$p.SubmittedTime
                                Size=$p.Size
                                JobTime=$p.JobTime
                                PagesPrinted=$p.PagesPrinted
                                TotalPages=$p.TotalPages
                                Status=$p.Status
                        }

        $obj = New-Object -TypeName PSObject -Property $props
 
        $Jobs  = $obj
    }

    # перегружаем спулер тут
    Write-Host "Перегружаем спулер" -ForegroundColor Green
     
    Get-Service *spool* | Stop-Service -Force -Verbose
    Start-Sleep -Seconds 5
    $path = "C:WindowsSystem32spoolPRINTERS"
    Get-ChildItem $path -File | Remove-Item -Force -Verbose
    Get-Service Spooler | Start-Service -Verbose

    $frag1 = $proc | ConvertTo-Html -As table -Fragment -PreContent '<h2>Процессы в памяти перед перезагрузкой спулера</h2>' | Out-String
    $frag2 = $Jobs | ConvertTo-Html -As table -Fragment -PreContent '<h2>Задания печати из всех очередей всех принтеров</h2><br>если есть список то скорее всего задание зависло (принтер отключен)' | Out-String

    $Body = '<br><br>служба сервера была перезагружена т.к. процессор был слишком сильно нагружен<br><br>'
    $Body = $Body   $frag2   '<br><br>'
    $Body = $Body   $frag1   '<br><br>---------------------------------------------------------------------------<br>дополнительная отладочная информация<br><H2>список загруженных библиотек в памяти на момент зависания по каждому процессу</H2>'

    $Date = Get-Date 
    $header = "$Date сервер печати"

    $Style = 'YellowSimple'
    Send-ToAdmin -MailAddress 'admin@domain.ru' -Style $Style -Subject 'Сервер печати - процессор загружен на 100%' -Body $Body -Header1 $header
}

Скрипт нужно добавить в шедулер на запуск каждые 5-10 минут.

:/>  Не могу получить доступ к редактору реестра в Windows 10 [FIX]

Ссылка на альтернативный скрипт

Вирус spoolsv.exe

Этот процесс является нормальной частью Windows, но различное вредоносное ПО маскируется под spoolsv.eve, чтобы избежать раскрытия. Чтобы убедиться в подлинности вашего процесса, кликните по нему правой кнопкой мыши и выберите Открыть расположение файла.

Система должна открыть Проводник по адресу C:WindowsSystem32. Кликните по файлу spoolsv.eve и затем нажмите Свойства.

Перейдите на вкладку Подробно и проверьте, совпадают ли все подписи с теми, что на скриншоте. Если так, тогда spoolsv.exe не является вирусом и причина повышенной нагрузки на процессор или другого аномального поведения скрыта в другом месте.

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

Все способы запустить службу диспетчера печати, если она останавливается

Основном причиной отказа принтера работать по своему прямому назначению является самовольное отключение службы диспетчера печати. Произойти такая неприятность может в любой из версий Windows XP, 7, 8.1, 10. Главной задачей пользователя в такой ситуации становиться поиск решения, чтобы включить ее обратно.

В этой инструкции мы объясним на примерах, почему выключается «Spooler». Рассмотрим варианты решения через перезагрузку персонального компьютера, настройку запуска службы, проверку системы на вредоносные программы, исправление встроенными средствами самой Виндовс, переустановку всего пакета драйверов и самого принтера. Все это гарантировано поможет перезапустить печать заново.

Высокая нагрузка и нестабильность драйверов в терминальной среде.

Нестабильная работа драйверов и, соответственно, перегрузка ими диспетчера очереди печати (по русски – «спулера») вызывала (и будет вызывать, если не чего не делать), остановку всего процесса печати на сервере, а иногда и остановку (зависание) ОС сервера в целом.

До выхода Windows Server 2008, штатных средств по оптимизации нагрузки спулера в ОС Windows Server не было.

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

С выходом Windows Server 2008 и Windows 7 появилась возможность изоляции драйверов принтера. Данная возможность позволяет драйверу принтера подгружать задачи не в Spoolsv.exe, а специальный под-процесс PrintIsolationHost.exe.

При такой конструкции, зависание драйвера одного принтера, не вешает всю очередь печати, поскольку встает только один под-процесс PrintIsolationHost.exe, а сам процесс спулера spoolsv.exe остается работоспособным.

Теперь пару слов о настройке. Диспетчер печати по умолчанию выполняет драйверы печати в изолированном процессе. Изменить можно при помощи групповой политики, параметр «Выполнять драйверы принтеров в изолированных процессах» .

Также важен еще один параметр групповой политики это – «Переопределить параметр совместимости выполнения драйвера печати«

Для того чтобы включить изоляцию драйверов принтеров, нужно использовать редактор локальной групповой политики (gpedit.msc):

Откройте gpedit.msc и последовательно перейдите:

Запуск средства устранения неполадок принтера

Прежде чем перейти к более сложным способам решения, рекомендуется начать поиск неисправностей запуском утилиты, способной автоматически решить большинство проблем.

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

Откройте вкладку Устранения неполадок командой ms-settings:troubleshoot из окна «Выполнить» (Win R).

Дождитесь завершения начального сканирования, а затем нажмите «Применить это исправление», если средство определило вариант восстановления.

После успешного применения исправления перезагрузите компьютер и проверьте, возникает ли ошибка, повторив то действие, при котором она возникала. Если продолжаете сталкиваться с ошибкой, из-за которой не произведен вызов функции Startdocprinter или инструмент не нашел никаких проблем с конфигурацией принтера, перейдите к следующему методу.

Как очистить очередь печати принтера (windows)

Проблема: документы не удаляются из очереди, причем не помогает ни отключение принтера, ни перезагрузка компьютера.

В этом случае используем жесткий метод очистки, описанный ниже.

Необходимо открыть командную строку, запущенную от имени администратора, и выполнить следующие команды:

net stop spooler
del%systemroot%system32spoolprinters*.shd
del%systemroot%system32spoolprinters*.spl
net start spooler

Для ленивых Cmd файл в архиве zipremove_printer_jobs.zip217 Байт. (Запускать от имени Администратора)

После всех манипуляций может получиться так, что на терминальных серверах принтеры все равно через какое то время перестают работать.

Причины этих проблем разделим следующим образом.

  • Неидентичные версии драйверов на клиентской машине и на терминальном сервере.
  • Нестабильность драйверов в терминальной среде.
  • Высокая нагрузка на службу «диспетчер очереди печати»
  • Отсутствие работоспособных драйверов для терминальных серверов.

Настройка запуска

Первым делом стоит перепроверить настройки службы и тех, от которых она зависит. По инструкции, описанной в самом первом пункте статьи, заходим в свойства службы. На вкладке «Общие» в разделе «Тип запуска» указываем «Автоматически» без «Отложенный запуск».

Переходим на вкладку «Зависимости» и смотрим, какие службы там указаны. Их работу и настройки также нужно перепроверить, а при необходимости правильно сконфигурировать. Удаленный вызов процедур (RPC) легко найти в том же списке окна служб.

Не лишним будет настроить поведение службы в случае сбоев. Это делается на закладке «Восстановление». Выставляем режим «Перезапуск» для первого и второго сбоя.

Немного теории

Очередь печати – это файлы с расширениями

  • .SHD (содержит настройки задания печати)
  • .SPL (содержит, собственно, данные, которые нужно напечатать).

По умолчанию эти файлы находятся в каталоге %systemroot%System32spoolPRINTERS. “По умолчанию” как-бы намекает на то, что этот путь можно изменить. И нам для начала этот путь нужно было узнать, чтобы убедиться в том, что файлы очереди печати лежат здесь (наверное, бывало по другому).

Этот путь хранится в реестре, по адресу HKEY_LOCAL_MACHINESYSTEMCurrentControlSetControlPrintPrinters, ключ DefaultSpoolDirectory:

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

Поэтому вырисовывается алгоритм:

  1. Остановить службу печати

  2. Определить путь к файлам очереди печати

  3. Удалить эти файлы

  4. Запустить очередь печати

Всё очень просто. Задача осложняется тем, что мы хотим это всё делать на удалённом компьютере.

Очередь печати принтера на windows 10: методы очистки и решение ошибок

При попытке распечатать какой-либо документ, пользователь Windows 10 может столкнуться с ситуацией, когда отправляя файл и нажимая кнопку «Печатать», ничего не происходит. Документ направляется в очередь печати, принтер исправный и работает, но процесс печати не запускается.

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

Для того, чтобы посмотреть очередь печати на Виндовс 10, стоит выполнить следующее:

  • Переходим по ветке C:WINDOWSSystem32spoolPRINTERS или же в поисковой строке вводим windir%System32spoolPRINTERS. Эту же команду можно ввести в окне «Выполнить».
  • Откроется папка с файлами. Это и есть очередь печати.
  • Если какой-то файл нужно снять с печати, то необходимо его выбрать, определив по дате отправления принтеру, и удалить.

Почистить папку очереди печати любого принтера от файлов на Windows 10 можно несколькими способами.

Очищать список документов, оправленных на печать, можно через Панель управления. Для этого выполняем следующее:

  • Жмем «Пуск» и выбираем «Панель управления».
  • Выбираем «Оборудование и звук», «Устройства и принтеры».
  • Нажимаем правой кнопкой мыши на иконке принтера и из выпадающего меню выбираем «Посмотреть очередь печати».
  • Появиться новое окно. Вверху нажимаем «Принтеры», «Очистить очередь печати».
  • Удаленный перечень документов придётся создавать заново. Однако файлы будут напечатаны корректно.
:/>  Эмулятор Windows XP

Если первый способ не сработал, то удалять документы, отправленные на печать, нужно с помощью Диспетчера печати. Однако это будет принудительная остановка работы принтера. Для её выполнения нужно проделать следующие шаги:

  • Нажимаем «Ctrl Alt Del» или «Ctrl Shift Esc», чтобы вызвать Диспетчер задач.
  • Откроется небольшое окно. Переходим во вкладку «Службы».
  • В списке находим «Диспетчер печати» или «Spooler». Нажимаем на службе правой кнопкой мыши и выбираем «Остановить».
  • Далее вновь переходим по адресу C:WINDOWSSystem32spoolPRINTERS. Откроется новое окно. Выбираем «Принтеры», «Остановить очередь печати» (действия официального способа остановки печати).

Очистить очередь печати в Windows 10 можно с помощью командной строки. Для этого выполняем следующие действия:

  • Вводим в поисковой строке команду cmd. Нажимаем на выдаче правой кнопкой мыши и выбираем «Запуск с правами Администратора».
  • Откроется консоль. По очередности вводим:
  • net stop spooler – команда, которая приостанавливает службу печати;
  • del %systemroot%system32spoolprinters*.shd – удаление файлов с расширением shd из папки очереди печати;
  • del %systemroot%system32spoolprinters*.spl – удаление файлов с расширением spl из той же директории;
  • net start spooler – запуск службы печати.

После выполнения этих команд стоит выполнить перезагрузку Windows 10.

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

Метод 1. Перезапуск службы очередь печати

  • Открываем «Диспетчер задач», переходим во вкладку «Службы» и выбираем «Диспетчер печати». Открываем эту службу и кликаем «Перезапустить».
  • Далее удаляем файлы из папки C:WindowsSystem32spoolPRINTERS.
  • Запускаем «Диспетчер печати».

Метод 2. Удаление временной папки

  • Перезагружаем компьютер и принтер.
  • Переходим по адресу C:WindowsSystem32spoolPRINTERS. Папку PRINTERS нужно очистить любим удобным способом, но только не удалять.
  • После очистки нужно вновь перезагрузить Windows 10 и отправить любой файл на печать.

Метод 3. Автоматически очистить очередь печати с помощью пакетного файла

Очистить очередь печати в Windows 10 можно с помощью пакетного файла. Для этого нужно открыть текстовый документ. Желательно Блокнот. Далее вставляем в него такой текст: rundll32 printui.dll,PrintUIEntry /Xg /n “Имя_локального_принтера” /f “D:results.txt”.

Сохраняем файл с любым названием и расширением .bat. Запускаем с правами Администратора.

Очистить и перезапустить диспетчер очереди печати в командной строке

Если нужно удалить все из очереди печати и перезапустить сам диспетчер очереди печати – нужно выполнить несколько команд в командной строке.

1. Откройте командную строку от имени администратора: один из способов – нажать на меню “Пуск” правой клавишей мыши и выбрать из открывшегося меню “Командная строка (администратор)”.

2. Введите команду net stop spooler и нажмите клавишу Enter, после ее выполнения введите команду DEL /F /S /Q %systemroot%System32spoolPRINTERS* и нажмите клавишу Enter, после выполнения этой команды введите net start spooler и нажмите клавишу Enter.

Данный способ можно выполнить и по другому: зайдите в “Службы” (напишите “Службы” в поиске), откройте службу “Диспетчер печати” => нажмите на “Остановить” => не закрывая саму службу откройте в проводнике %windir%System32spoolPRINTERS => удалите все файлы из открывшейся папки => запустите службу “Диспетчер печати”.

Очистка папки spool

В стандартном режиме мы не сможем почистить эту папку, так как служба «Диспетчер печати» её использует и у нас просто не будет доступа удалить содержимое. Поэтому, перезагружаем компьютер и загружаемся в безопасном режиме с помощью F8 в Windows 8 и XP, а в Windows 8 с помощью тех способов которые описывались здесь.

Войдя в безопасный режим переходим на диск “С:” –> Windows –> System32 –> Spool. В этой папке нас интересует содержимое следующее:

C:WindowsSystem32spoolprtprocsw32x86 – удаляем все содержимое, кроме файла winprint.dll, так как его удаление может повлечь за собой появление новых проблем связанных с печатью (в x64 папку называется соответственно)

C:WindowsSystem32SpoolDriversw32x86 – чистим папку от все файлов ранее установленных драйверов (в системах x64 путь Driversx64 ).

Очистив папку Spool, перезагружаемся в нормальном режиме и устанавливаем заново драйвера и принтер на компьютер. После чего, радуемся возобновлению работы принтера. Кстати, не забудьте после установки ещё раз перезагрузится для корректной работы устройства.

Не печатает принтер. Очистка spoolerа

Очистка реестра от старых принтеров

Итак, нашу очистку мы начнем  с системного реестра.

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

Так же, перед выполнением последующих рекомендаций,  отключите принтер от компьютера.

В окне «Выполнить» прорисуем команду regedit, которая вызовет окно реестра.

Первым шагом будет проверка компонентов от которых зависит служба  spooler, для этого переходим к  ветке  HKEY_LOCAL_MACHINESYSTEMCurrentControlSetServicesSpooler, где для параметра DependOnService, должно быть указано значение RPCSS.

Далее, удаляем все печатающие устройства которые есть в системе. Переходим по ветке HKEY_LOCAL_MACHINESystemCurrentControlSetControlPrintPrinters, где нажав на стрелочку появится весь список принтеров. Для их удаления мы можем воспользоваться клавишей «Delet»

Вторым пунктом, является очистка от всех драйверов. Развернув ветку KEY_LOCAL_MACHINESystemCurrentControlSetControlPrintEnvironmentsWindowsNTx86DriversVersion-3 ( в х64 битных операционных системах нужно открыть …EnvironmentsWindows NTx64DriversVersion-3) удаляем весь перечень драйверов установленных в системе.

В ветке HKEY_LOCAL_MACHINESYSTEMCurrentControlSetControlPrintMonitors, список записей должен выглядеть следующим образом.

  • BJ Language Monitor
  • Local Port
  • PJL Language Monitor
  • Standard TCP/IP Port
  • USB Monitor

Все остальное удаляем.

На этом работа с реестра окончена, теперь переходим к очистке папки Spool

Перезапуск или отмена печати как отдельных документов так и всех сразу

Вы можете очистить очередь печати, перезапустить или убрать из печати определенный документ в настройках самого принтера.

1. Зайдите в меню “Пуск”, откройте “Параметры” => Устройства => с левой стороны выберите “Принтеры и сканеры” => с правой стороны нажмите левой клавишей мыши на принтер в котором нужно отменить или перезапустить печать => после нажатия на принтер, ниже него появятся дополнительные варианты действий, выберите “Очередь” (вы также можете найти на панели задач значок принтера, нажать на него правой клавишей мыши и еще раз нажать на название самого принтера, чтобы открыть диспетчер очереди печати).

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

3. Если и после перезапуска печать документа не началась – вы можете его отменить, нажав на него правой клавишей мыши и выбрав из меню “Отменить”. Подтвердите отмену печати данного документа, нажав на “Да”. После чего документ исчезнет из очереди печати.

4. Если вы хотите убрать из очереди печати все документы – зайдите слева вверху в “Принтер” и выберите “Очистить очередь печати”. Подтвердите удаление всех документов из очереди печати, нажав на “Да”.

Переустановка всех портов принтера

Наиболее эффективным способом является простая переустановка всех портов. Это исправление считается эффективным в версиях Windows 7, 8 и 10. Для исправления сначала удалим все порты, а затем переустановим драйвера этого печатающего устройства.

Откройте «Диспетчер устройств» командой devmgmt.msc из окна «Выполнить» (Win R).

Прокрутите список установленных устройств и разверните вкладку «Очереди печати». Затем щелкните правой кнопкой мыши на каждом драйвере и нажмите кнопку «Удалить».

После удаления всех драйверов разверните вкладку контроллеров USB. Удалите каждый порт USB, к которому может быть подключено печатающее устройство, правым щелчком мыши.

После перезагрузите ПК. При следующем запуске Windows автоматически установит набор универсальных драйверов и портов.

Примечание: Если сбой при вызове функции Startdocprinter не возникает, то можно оставить универсальные драйвера или установите оригинальные (совместимые), загруженные с сайта производителя.

Переходим к практике

Чтобы не загромождать статью, я не буду приводить кучу проверок (на то, что компьютер доступен, что у нас есть доступ к WMI и т.д.).

:/>  RDP - удаленное подключение к windows 7. пошаговая инструкция ...

Итак, для начала нам нужно узнать путь к очереди печати, т.е. посмотреть значение реестра удалённого компьютера. Для этого используем .NET класс RegistryKey.

Для того, чтобы подключиться к реестру удалённого компьютера используем метод OpenRemoteBaseKey, передав ему в качестве параметров имя компьютера и раздел реестра:

$ServerKey = [Microsoft.Win32.RegistryKey]::OpenRemoteBaseKey( [Microsoft.Win32.RegistryHive]::LocalMachine, $ComputerName)

$Key = $ServerKey.OpenSubKey(‘SYSTEMCurrentControlSetControlPrintPrinters’)

Переменная $Key содержит весь подраздел Printers (на скриншоте выше). Нам из этого раздела нужно только одно значение:

$DefaultSpoolDirectory = $Key.GetValue(‘DefaultSpoolDirectory’)

Переменная $DefaultSpoolDirectory содержит тот самый путь к файлам очереди печати:

PS C:> $DefaultSpoolDirectoryC:WINDOWSSystem32spoolPRINTERS

Отлично! Вот только появляется новая проблема: это локальный путь – по этому пути к удалённому компьютеру мы не доберёмся. Нужно преобразовать его в UNC-путь, т.е. из пути

C:WINDOWSsystem32spoolPRINTERS

получить путь

\ComputerNameC$WINDOWSsystem32spoolPRINTERS

Это можно сделать простой манипуляцией со строкой:

$RemoteDefaultSpoolDirectory = ‘\’ $ComputerName ” $DefaultSpoolDirectory[0] ‘$’ $DefaultSpoolDirectory.Substring(2)

Т.е. просто дописываем в строку (наш локальный путь) недостающие символы.

Теперь всё готово, можем останавливать службу и очищать очередь печати.

Останавливаем службу печати:

# Получаем службу$Service = Get-WmiObject Win32_Service @PSBoundParameters # Останавливаем службу$Service.StopService()

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

$Service = Get-WmiObject Win32_Service ` -Filter «name = ‘spooler’» ` -ComputerName $ComputerName

После остановки службы можно очищать очередь печати, но как известно аппетит приходит во время еды, и мне захотелось ещё посмотреть на то, сколько мусора там собралось:

# Если в очереди печати что-то естьif ($ContentSpoolDirecrory = Get-ChildItem $RemoteDefaultSpoolDirectory -Force){ # Считаем размер каталога с очередью печати $FolderSize = ($ContentSpoolDirecrory | Measure-Object -Property Length -Sum).Sum / 1Mb # Выводим «`nВ {0} находится {1} файл(а/ов), общим объёмом {2:

Вообще общепризнанным “best practice” не рекомендуется выводить простой текст в выводе скрипта, но так как это не было целью работы, и мне уже было лень с этим возиться, поэтому я просто воспользовался оператором –f.

Осталось только запустить службу:

$Service.StartService()

Если нужно перезапустить (остановить/запустить) другую службу, действия будут аналогичными, при необходимости можно имя службы и удалённого ПК засунуть в параметры, и запускать/останавливать/перезапускать любые службы на любых компьютерах

Подтверждаем неисправность

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

  1. Открываем окно быстрого запуска команд комбинацией Windows R.
  2. Вводим команду «services.msc».
  3. Ждем открытия списка служб.
  4. Находим в перечне «Диспетчер очереди печати» и открываем двойным щелчком мыши.

Теперь необходимо удостовериться, что она остановлена и не работает. Смотрим на соответствующие надписи в окне свойств, как это указано на рисунке ниже. При необходимости изменяем на нужные и принудительно запускаем, чтобы «оживить» работу принтеров.

Способ 1: свойства принтера

Взаимодействие с печатающим устройством в операционной системе Windows 10 происходит с помощью стандартного приложения «Устройства и принтеры». В него встроено множество полезных утилит и инструментов. Один из них и отвечает за формирование и работу с очередью элементов. Удалить их оттуда не составит труда:

  1. Найдите значок принтера на панели задач, кликните на нем правой кнопкой мыши и выберите в списке используемое устройство.


Откроется окно параметров. Здесь вы сразу увидите перечень всех документов. Если требуется удалить только один, нажмите на нем ПКМ и выберите «Отменить».

В случае когда файлов много и по отдельности очищать их не совсем удобно, разверните вкладку «Принтер» и активируйте команду «Очистить очередь печати».

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

    Перейдите в «Пуск» и откройте «Параметры», нажав на кнопку в виде шестеренки.

Отобразится перечень параметров Windows. Здесь вас интересует раздел «Устройства».


На панели слева перейдите в категорию «Принтеры и сканеры».

Теперь вы попадаете в окно с параметрами. Работа в нем происходит точно так же, как это было показано в предыдущей инструкции.

Как видите, первый способ достаточно прост в исполнении и не требует много времени, очищение происходит буквально за несколько действий. Однако иногда случается так, что записи просто не удаляются. Тогда рекомендуем обратить внимание на следующее руководство.

Способ 2 — удалите файлы очереди печати вручную.

Шаг 1:Введите services.msc в поле поиска Пуск / панель задач, а затем нажмите клавишу Enter .

Шаг 2:Найдите службу «Диспетчер печати». Кликните на ней правой кнопкой мыши и выберите опцию «Остановить», чтобы остановить службу.

Шаг 3:Откройте проводник и перейдите в следующую папку:

В указанном выше пути замените букву «C» на имя диска, на котором установлена ​​Windows 10.

Примечание: Если появится диалоговое окно с сообщением «У вас нет прав доступа к этой папке», нажмите кнопку «Продолжить», чтобы получить постоянный доступ к папке PRINTERS.

Шаг 4:Выберите все файлы в папке PRINTERS и затем удалите их.

Шаг 5:В окне «Службы» снова, кликните правой кнопкой мыши на службе Диспетчер печати, а затем запустите службу выбрав опцию «Запустить».

Способ 2: ручная очистка очереди печати

За корректную работу принтера отвечает служба «Диспетчер печати». Благодаря ей создается очередь, документы отправляются в распечатку, а также происходят дополнительные операции. Различные системные либо программные сбои в самом устройстве провоцируют зависание всего алгоритма, из-за чего временные файлы никуда не деваются и только мешают дальнейшему функционированию оборудования. При возникновении подобных проблем вам нужно вручную заняться их удалением, а сделать это можно следующим образом:

    Откройте «Пуск» в строке поиска напечатайте «Командная строка», кликните на появившемся результате правой кнопкой мыши и запустите приложение от имени администратора.


В первую очередь останавливаем саму службу «Диспетчер печати». За это отвечает команда net stop spooler . Введите ее и нажмите на клавишу Enter.

После успешной остановки вам пригодится команда del /s /f /q C:WindowsSystem32spoolPRINTERS*.* — она отвечает за удаление всех временных файлов.

По завершении процесса деинсталляции требуется вручную проверить папку хранения этих данных. Не закрывайте «Командную строку», откройте Проводник и найдите все временные элементы по пути C:WindowsSystem32spoolPRINTERS


Выделите все их, кликните правой кнопкой мыши и выберите пункт «Удалить».

После этого вернитесь в «Командную строку» и запустите службу печати командой net start spooler

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

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

Отблагодарите автора, поделитесь статьей в социальных сетях.

Чем вызвано сообщение об ошибке вызова startdocprinter

Сообщение об ошибке Startdocprinter может отобразится по ряду причин:

Сбой очереди печати. Проблема возникает из-за прерывания, когда диспетчер печати подготовил к отправке файл на принтер. Есть несколько причин, которые препятствуют выводу на печать. В этом случае самый простой способ решения — запустить средство устранения неполадок.

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

Проблема управления доступом. Эта ошибка также возникает из-за проблемы с тем, каким образом операционная система распознает список управления доступом службы. Решается запуском утилиты cacls.exe из окна командной строки.

Неправильные приглашения принтера. Вызов функции может быть не произведен из-за несогласованных портов принтера. Решить ее можно путем переустановки каждого порта.

Оставьте комментарий

Adblock
detector