2012-05-21 6 views
6

Possiedo un'applicazione che genera una generazione di file centrale in base alle richieste dell'utente. Quello che voglio essere in grado di fare con esso una volta che i file sono creati è metterli nella coda di stampa di quell'utente (in questa organizzazione c'è una coda di stampa centrale in modo che gli utenti siano responsabili della stampa dei propri documenti) in modo che possano essere stampato fuori quando l'utente è pronto.Aggiunta di lavori a un utente specifico PrintQueue

Utilizzando gli assembly System.Printing in .net Sono in grado di aggiungere un lavoro alla mia coda di stampa, quindi sono su quella parte. Il mio codice di stampa simile a questo:

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(); 
    } 

Così ho i miei documenti creati in posizione centrale, lo so che l'utente è stato responsabile per la loro creazione e posso inviare alla stampante.

Quello che mi serve ora è un modo per inviarli alla stampante con l'utente che li ha creati impostati come loro utente. C'è un modo per farlo attraverso la coda di stampa? So che è leggibile dalla proprietà PrintSystemJobInfo.Submitter, ma è di sola lettura. In caso contrario, devo farlo attraverso la rappresentazione e, in tal caso, in quest'ultimo caso, c'è qualcosa che posso fare per evitare di memorizzare una serie di password utente e il software fallire ogni volta che l'utente cambia la password? Sembra che sarebbe un modo davvero maldestro di operare, ma poiché questa attività non viene attualmente eseguita in modo interattivo, quali altre opzioni ho?

+0

Sarei interessato a ricevere una risposta a questo, ma nel frattempo ho adottato un approccio diverso alla fine, poiché non sono riuscito a trovare un modo utile per inviare i lavori di stampa sul server con gli strumenti che avevo a disposizione (incluso .net 2.0, non sono sicuro che la documentazione di System.Printing avrebbe aiutato qui, quindi ho risolto il problema impostando un'applicazione locale che si trovava in background, recuperando i documenti per la stampa e stampandoli dalla macchina dell'utente, evitando qualsiasi autorizzazione i problemi. – glenatron

+0

Allora, vorresti aggiornare la tua domanda? –

risposta

3

Sto facendo qualcosa di simile. La rappresentazione non è male, se il processo dispone di autorizzazioni sufficienti per ottenere il livello di impersonificazione di cui hai bisogno (ad esempio rappresentazione o delega o identificazione).

Ecco quello che faccio per impersonare:

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: è responsabilità del metodo chiamante per ripulire quel manico token.

Risolvo l'UPN da una query LDAP basata sull'e-mail di un utente (di solito sono uguali, ma spesso non lo sono).

Ma sto riscontrando alcuni problemi con l'array di byte che sto passando. Ho provato File.ReadAllBytes, ma questo fa sì che la stampante sputi fuori parole senza senso. C'è qualche codifica speciale che deve accadere in GenerateBufferFromFile?

** Aggiornamento **

Sembra che ci sono un sacco di questioni intorno a lavorare con il JobStream direttamente:

Is PrintSystemJobInfo.JobStream broken?

quindi sto solo andando a scrivere il file, anche se io speravo di evitarlo.