2012-05-21 48 views
6

我有一個應用程序根據用戶請求執行一些中央文件生成。一旦文件被創建,我想要做的就是將它們放在用戶的打印隊列中(在這個組織中有一箇中央打印隊列,用戶負責打印他們自己的文檔),以便他們可以當用戶準備好時打印出來。將作業添加到特定用戶的PrintQueue

通過在.net中使用System.Printing程序集,我可以將作業添加到我自己的打印隊列中,所以我聽起來很有用。我打印的代碼如下所示:

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

所以,我有我的中心創建的文檔,我知道哪些用戶是負責他們的創作,我可以將它們發送到打印機。

我現在需要的是一種將它們發送到打印機的方式,創建它們的用戶設置爲其用戶。有沒有辦法通過打印隊列來做到這一點?我知道它可以從PrintSystemJobInfo.Submitter屬性讀取,但是它是隻讀的。如果沒有,我是否必須通過冒充來實現,如果是這樣,在後一種情況下,我可以做些什麼來避免存儲一堆用戶密碼,並且每次用戶更改密碼時軟件都會失敗?這似乎是一種非常笨拙的操作方式,但是由於此活動目前不是以交互方式執行,我還有其他選擇嗎?

+0

我有興趣聽到這個答案,但同時我採取了不同的方法最終,因爲我找不到一種有用的方式來使用我有可用的工具在服務器上打印作業(包括.net 2.0,不知道是否System.Printing的東西在這裏有所幫助),所以我解決了這個問題,而是通過設置一個坐在後臺的本地應用程序,獲取打印的文檔並從用戶的機器打印出來,避免了任何權限問題。 – glenatron

+0

那麼你想更新你的問題呢? –

回答

3

我正在做類似的事情。如果進程具有足夠的權限來獲取所需的模擬級別(例如模擬或委派vs標識),模擬並不算太差。

這是我做的模仿:

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

注:這是調用方法的清理該令牌手柄責任。

我從基於用戶電子郵件的LDAP查詢解析UPN(通常它們是相同的,但通常不足)。

但我有一些問題,我傳入的字節數組。我試圖File.ReadAllBytes,但這會導致打印機吐出亂碼。 GenerateBufferFromFile中是否需要執行特殊編碼?

** **更新

看起來大約有直接與作業流工作一堆問題:

Is PrintSystemJobInfo.JobStream broken?

所以我只是要寫入文件,雖然我希望避免這種情況。