Permitir que usuários não administradores descubram o spooler de impressão

1

Atualmente, tenho um problema em que a fila de impressão está ficando presa em um servidor de impressão central (Windows Server 2008). Usar a função "Limpar todos os documentos" não limpa e fica preso também. Preciso que usuários não administradores possam limpar a fila de impressão de suas estações de trabalho.

Eu tentei usar o seguinte programa winforms que eu criei e permite que um usuário pare o spooler de impressão, exclua os arquivos de impressora na pasta "C: \ Windows \ System32 \ spool \ PRINTERS" e inicie o spooler de impressão, mas isso a funcionalidade requer que o programa seja executado como administrador, como posso permitir que meus usuários normais executem este programa sem conceder privilégios de administrador?

Ou há outra maneira de permitir que o usuário normal limpe a fila de impressão no servidor?

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
    
por Reafidy 09.11.2011 / 01:51

2 respostas

1

você pode criar uma tarefa agendada que está configurada para ser executada como admin e dar a usuários normais o direito de iniciá-la. mais ou menos como o setuid funciona no unix.

no entanto, isso não é necessário para o seu problema. você pode alterar as permissões no serviço de spooler de impressão para que usuários normais possam iniciá-lo e interrompê-lo. mas essa é uma pergunta melhor para o serverfault.

    
por 09.11.2011 / 02:53
1

Execute o comando delete com o verbo "runas":

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

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

Você também pode simplesmente fazer seu aplicativo exigir a elevação em geral, modificando seu manifesto:

link

    
por 09.11.2011 / 01:59