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