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