Назад | Перейти на главную страницу

Разрешение пользователям без прав администратора отклеивать диспетчер очереди печати

В настоящее время у меня возникает проблема, когда очередь печати застревает на центральном сервере печати (Windows Server 2008). Использование функции «Очистить все документы» не очищает его и тоже застревает. Мне нужны пользователи без прав администратора, чтобы иметь возможность очищать очередь печати со своих рабочих станций.

Я попытался использовать следующую программу winforms, которую я создал, и позволяет пользователю останавливать диспетчер очереди печати, удалять файлы принтера в папке «C: \ Windows \ System32 \ spool \ PRINTERS», а затем запускать диспетчер очереди печати, но для этой функции требуется программу, которую нужно запускать от имени администратора, как я могу позволить обычным пользователям выполнять эту программу, не давая им прав администратора?

Или есть другой способ разрешить обычному пользователю очищать очередь печати на сервере?

Imports System.ServiceProcess
Public Class Form1
    Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
        ClearJammedPrinter()
    End Sub
    Public Sub ClearJammedPrinter()
        Dim tspTimeOut As TimeSpan = New TimeSpan(0, 0, 5)
        Dim controllerStatus As ServiceControllerStatus = ServiceController1.Status

        Try

            If ServiceController1.Status <> ServiceProcess.ServiceControllerStatus.Stopped Then
                ServiceController1.Stop()
            End If

            Try
                ServiceController1.WaitForStatus(ServiceProcess.ServiceControllerStatus.Stopped, tspTimeOut)
            Catch
                Throw New Exception("The controller could not be stopped")
            End Try

            Dim strSpoolerFolder As String = "C:\Windows\System32\spool\PRINTERS"

            Dim s As String
            For Each s In System.IO.Directory.GetFiles(strSpoolerFolder)
                System.IO.File.Delete(s)
            Next s

        Catch ex As Exception
            MsgBox(ex.Message)
        Finally
            Try

                Select Case controllerStatus
                    Case ServiceControllerStatus.Running
                        If ServiceController1.Status <> ServiceControllerStatus.Running Then ServiceController1.Start()
                    Case ServiceControllerStatus.Stopped
                        If ServiceController1.Status <> ServiceControllerStatus.Stopped Then ServiceController1.Stop()
                End Select

                ServiceController1.WaitForStatus(controllerStatus, tspTimeOut)
            Catch
                MsgBox(String.Format("{0}{1}", "The print spooler service could not be returned to its original setting and is currently: ", ServiceController1.Status))
            End Try
        End Try
    End Sub
End Class

Выполните команду удаления с глаголом runas:

var p = new Process();
p.StartInfo.Verb = "runas";
p.StartInfo.FileName = "cmd.exe";

//add your delete command, etc. as args to the process

Вы также можете просто заставить ваше приложение требовать повышения прав, изменив его манифест:

https://stackoverflow.com/questions/1215443/show-uac-prompt-when-launching-an-app

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

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