2014-02-24 141 views
3

這是第335次被問到這個問題,我找不到答案。 我試圖通過WinSpool api從ASP.net C#應用程序直接發送原始數據到打印機。WinSpool OpenPrinter訪問被拒絕

我的代碼只是here的副本。

錯誤放在這裏

if(OpenPrinter(szPrinterName.Normalize(), out hPrinter, IntPtr.Zero)) 

它工作正常的本地打印機但對於共享網絡打印機的OpenPrinter(的GetLastError實際結果)結果總是5 - Access Denied

我已經試過

  • 不同的值PRINTER_DEFAULTSDesiredAccess
  • 授予管理員權限的不同組合,以用戶
  • 設置打印機like this

我必須指出,我只是想打印,不改變打印機配置或需要管理權限的東西。

我可以使用打印機選項頁面和嵌入在其中的測試工具從服務器打印到此共享打印機。所以打印機工作。如何通過API訪問它?


更新:看起來像這樣的代碼工作正常,如果從Windows應用程序或控制檯應用程序調用。那麼爲什麼在Web應用程序中拒絕訪問?


更新2:問題可能是由安裝在主機PC上的打印機和與虛擬PC共享的事實引起的(或在製作:打印機被安裝在域和共享,以便在DMZ PC)和不存在適當的將虛擬PC的用戶(或域外用戶)授予本打印機權限的方法


更新3:這裏還有一個事實。如果我從瀏覽器中的虛擬瀏覽器瀏覽主機(如此\\host_pc\C$),我會收到通知輸入用戶名和密碼以訪問主機PC。如果我選中「保存密碼」後,整個「訪問被拒絕」問題將消失,直到我在主機上更改密碼。

+3

你似乎已經回答了你自己的問題。它不起作用,因爲試圖打印的用戶沒有打印權限。您無法授予權限,因爲用戶不在域上,但打印機是。還剩下什麼? – arx

+0

您爲應用程序池使用什麼身份?以及哪個用戶的意思是「給予用戶管理員權限」 –

+0

我的不好。我忘記說我試圖改變應用程序池標識給自己。在我的帳戶下,我可以從控制檯打印,但不能從Web應用程序打印。管理員權限都沒有幫助。 –

回答

2

默認情況下,在IIS下運行的ASP.Net網站在低權限本地用戶帳戶IIS_APPPOOL\mysite下運行。爲了讓您允許客戶端訪問網站中的域資源,您需要將IIS運行於其下的用戶(稱爲應用程序池標識)更改爲具有正確權限的域用戶(網絡打印機和IIS本身)。

最簡單的解決方案(可能更安全)是將IIS APPPool更改爲使用內置的NetworkService帳戶。該帳戶會自動添加到您的域名MyDomain \ MyHostName $,因此您可以使用它授予打印機權限(或其他任何需要的)。

要更改應用程序池標識,只需打開IIS管理器,選擇正確的應用程序池,然後點擊「高級設置」,然後查找設置「標識」。

此處瞭解詳情: http://www.iis.net/learn/manage/configuring-security/application-pool-identities

+0

複製我試圖改變身份。沒有效果。但我認爲我應該嘗試使用NetworkService帳戶,因爲它在任何機器上默認存在。感謝您的提示。 –

+0

有一件事可能會幫助您調試,如果您通過Windows任務計劃程序將您的控制檯應用程序設置爲使用NetworkService帳戶運行。如果同一個帳戶上的相同代碼在NetworkService的任務下正常工作,但在IIS下使用NetworkService失敗,則可排除權限問題並專注於IIS配置。 –