2012-05-21 21 views
6

Mam aplikację, która wykonuje pewne centralne generowanie plików na podstawie żądań użytkownika. To, co chcę móc z nim zrobić po utworzeniu plików, to umieszczenie ich w kolejce wydruku tego użytkownika (w tej organizacji znajduje się centralna kolejka drukowania, więc użytkownicy są odpowiedzialni za drukowanie własnych dokumentów), aby mogli następnie być wydrukowane, gdy użytkownik jest gotowy.Dodawanie zadań do konkretnego użytkownika PrintQueue

Korzystając z zespołów System.Printing w .NET, mogę dodać zadanie do mojej własnej kolejki wydruku, więc jestem odpowiedni dla tej części. Mój kod wydruku wygląda tak:

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

Więc mam centralnie utworzone dokumenty, wiem, który użytkownik jest odpowiedzialny za ich tworzenie i mogę wysłać je do drukarki.

Potrzebuję teraz sposobu, aby wysłać je do drukarki z użytkownikiem, który je utworzył, jako jego użytkownik. Czy istnieje sposób, aby to zrobić w kolejce drukowania? Wiem, że jest on czytelny z właściwości PrintSystemJobInfo.Submitter, ale to jest tylko do odczytu. Jeśli nie, czy muszę to zrobić przez podszywanie się pod inne osoby, a jeśli tak, to czy jest coś, co mogę zrobić, aby uniknąć konieczności przechowywania hasła haseł użytkowników i oprogramowania, które zawodzi za każdym razem, gdy użytkownik zmieni swoje hasło? Wydaje się, że byłby to naprawdę niezgrabny sposób działania, ale ponieważ ta aktywność nie jest obecnie wykonywana interaktywnie, jakie mam inne opcje?

+0

Czy chciałbyś więc zaktualizować swoje pytanie? –

Odpowiedz

3

Robię coś podobnego. Podszywanie się nie jest takie złe, jeśli proces ma wystarczające uprawnienia, aby uzyskać wymagany poziom personifikacji (np. Podszywanie się pod inną osobę lub delegowanie kontra identyfikacja).

Oto, co zrobić, aby podszyć:

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

Uwaga: to jest odpowiedzialność tejże metody wywołującego oczyścić że tokena uchwytem.

Rozwiązuję nazwy UPN z zapytania LDAP na podstawie adresu e-mail użytkownika (zazwyczaj są one takie same, ale często nie są takie same).

Ale mam pewne problemy z tablicą bajtów, przez którą przechodzę. Próbowałem File.ReadAllBytes, ale to powoduje, że drukarka wypluwa bełkot. Czy jest jakieś specjalne kodowanie, które musi się zdarzyć w GenerateBufferFromFile?

** Aktualizacja **

Wygląda na to, istnieje kilka problemów wokół pracy z JobStream bezpośrednio:

Is PrintSystemJobInfo.JobStream broken?

więc jestem po prostu zamiar napisać do pliku, chociaż miał nadzieję uniknąć tego.

Byłbym zainteresowany usłyszeniem odpowiedzi na to pytanie, ale w międzyczasie podjąłem inne podejście, ponieważ nie mogłem znaleźć użytecznego sposobu buforowania zadań drukowania na serwerze przy użyciu narzędzi, które miałem dostępne (w tym .net 2.0, nie jestem pewien, czy rzeczy System.Drinting pomogłyby tutaj), więc rozwiązałem problem, instalując lokalną aplikację, która znajdowała się w tle, pobierałem dokumenty do drukowania i drukowałem je z komputera użytkownika, unikając jakichkolwiek uprawnień problemy.
Powiązane problemy