這是第335次被問到這個問題,我找不到答案。 我試圖通過WinSpool api從ASP.net C#應用程序直接發送原始數據到打印機。WinSpool OpenPrinter訪問被拒絕
我的代碼只是here的副本。
錯誤放在這裏
if(OpenPrinter(szPrinterName.Normalize(), out hPrinter, IntPtr.Zero))
它工作正常的本地打印機但對於共享網絡打印機的OpenPrinter
(的GetLastError
實際結果)結果總是5 - Access Denied
。
我已經試過
- 不同的值
PRINTER_DEFAULTS
與DesiredAccess
- 授予管理員權限的不同組合,以用戶
- 設置打印機like this
我必須指出,我只是想打印,不改變打印機配置或需要管理權限的東西。
我可以使用打印機選項頁面和嵌入在其中的測試工具從服務器打印到此共享打印機。所以打印機工作。如何通過API訪問它?
更新:看起來像這樣的代碼工作正常,如果從Windows應用程序或控制檯應用程序調用。那麼爲什麼在Web應用程序中拒絕訪問?
更新2:問題可能是由安裝在主機PC上的打印機和與虛擬PC共享的事實引起的(或在製作:打印機被安裝在域和共享,以便在DMZ PC)和不存在適當的將虛擬PC的用戶(或域外用戶)授予本打印機權限的方法
更新3:這裏還有一個事實。如果我從瀏覽器中的虛擬瀏覽器瀏覽主機(如此\\host_pc\C$
),我會收到通知輸入用戶名和密碼以訪問主機PC。如果我選中「保存密碼」後,整個「訪問被拒絕」問題將消失,直到我在主機上更改密碼。
你似乎已經回答了你自己的問題。它不起作用,因爲試圖打印的用戶沒有打印權限。您無法授予權限,因爲用戶不在域上,但打印機是。還剩下什麼? – arx
您爲應用程序池使用什麼身份?以及哪個用戶的意思是「給予用戶管理員權限」 –
我的不好。我忘記說我試圖改變應用程序池標識給自己。在我的帳戶下,我可以從控制檯打印,但不能從Web應用程序打印。管理員權限都沒有幫助。 –