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

В настоящее время у меня есть проблема, из-за которой очередь печати застревает на центральном сервере печати (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

2 ответа

Решение

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

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

Выполните команду удаления с глаголом "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

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