2012-05-21 11 views
6

Tengo una aplicación que genera algunos archivos centrales en función de las solicitudes de los usuarios. Lo que quiero hacer con él una vez que se crean los archivos es colocarlos en la cola de impresión de ese usuario (en esta organización hay una cola de impresión central para que los usuarios sean los responsables de imprimir sus propios documentos) para que luego puedan ser impreso cuando el usuario está listo.Agregar trabajos a la PrintQueue de un usuario específico

Al usar los ensamblajes System.Printing en .net, puedo agregar un trabajo a mi propia cola de impresión, por lo que estoy de acuerdo con esa parte. Mi código de impresión se ve así:

private void RunPrintJob(string myFileName) 
    { 
     PrintServer ps = new PrintServer(@"\\printatron"); 
     PrintQueue queue = new PrintQueue(ps, "psandqueues"); 
     try 
     { 
      PrintSystemJobInfo pj = queue.AddJob(myFileName); 
      Stream myStream = pj.JobStream; 
      Byte[] myByteBuffer = GenerateBufferFromFile(myFileName);    myStream.Write(myByteBuffer, 0, myByteBuffer.Length); 
      myStream.Close(); 
     } 
     catch (Exception ed) 
     { 
      Debug.WriteLine(ed.Message); 
      if (ed.InnerException != null) 
      { 
       Debug.WriteLine(" -> " + ed.InnerException); 
      } 
      result = false; 
     } 
     queue.Commit(); 
    } 

Así que tengo mis documentos creados centralmente, sé qué usuario fue el responsable de su creación y les puedo enviar a la impresora.

Lo que necesito ahora es una forma de enviarlos a la impresora con el usuario que los creó establecidos como su usuario. ¿Hay alguna manera de hacer esto a través de la cola de impresión? Sé que es legible desde la propiedad PrintSystemJobInfo.Submitter, pero es de solo lectura. Si no es así, ¿tengo que hacerlo mediante suplantación? Si es así, en este último caso, ¿hay algo que pueda hacer para evitar tener que almacenar una serie de contraseñas de usuario y hacer que el software falle cada vez que el usuario cambie su contraseña? Parece que sería una forma de operar realmente torpe, pero como esta actividad actualmente no se realiza interactivamente, ¿qué otras opciones tengo?

+0

Me interesaría escuchar una respuesta a esto, pero mientras tanto adopté un enfoque diferente ya que no pude encontrar una forma útil de poner trabajos de impresión en el servidor con las herramientas que tenía disponibles (incluyendo .net 2.0, no estoy seguro de si el material de System.Printing hubiera ayudado aquí), así que resolví el problema en su lugar configurando una aplicación local que se encontraba en segundo plano, documentos recuperados para imprimir e imprimirlos desde la máquina del usuario, evitando cualquier permiso problemas. – glenatron

+0

Entonces, ¿le gustaría actualizar su pregunta? –

Respuesta

3

Estoy haciendo algo similar. La suplantación no es tan mala, si el proceso tiene permisos suficientes para obtener el nivel de suplantación que necesita (por ejemplo, suplantación o delegación frente a identificación).

Aquí es lo que hago para hacerse pasar por:

public static bool GetImpersonationToken(string UPN, out IntPtr dupToken) 
    { 
     dupToken = IntPtr.Zero; 
     WindowsImpersonationContext impersonationContext = null; 

     bool result = false; 
     try 
     { 
      WindowsIdentity wid = new WindowsIdentity(UPN); 
      impersonationContext = wid.Impersonate(); 
      result = DuplicateToken(wid.Token, 2, ref dupToken) != 0; 
     } 
     finally 
     { 
      if (impersonationContext != null) 
       impersonationContext.Undo(); 
     } 

     return result; 
    } 

Nota: es responsabilidad del método de llamada a limpiar ese identificadores de testigos.

Resuelvo el UPN a partir de una consulta LDAP basada en el correo electrónico de un usuario (generalmente son lo mismo, pero a menudo no lo son).

Pero estoy teniendo algunos problemas con la matriz de bytes que estoy pasando. Intenté File.ReadAllBytes, pero eso causa que la impresora escupiera galimatías. ¿Hay alguna codificación especial que deba suceder en GenerateBufferFromFile?

** Actualización **

Parece que hay un montón de cuestiones en torno a trabajar con el JobStream directamente:

Is PrintSystemJobInfo.JobStream broken?

Así que sólo voy a escribir en el archivo, aunque estaba esperando evitar eso.

Cuestiones relacionadas