c# - Printing from windows service on windows 8 fails -


i have windows service application written in c# .net. application used generate report pdf printing document local software printer generates pdfs. works on windows xp , windows 7. unfortunately found on windows 8 fails. found out printing (even physical) printer on windows 8 fails when print service. missing in program work? i'm printing way:

flowdocument document = mydocument; var source = document idocumentpaginatorsource; var documentpaginator = source.documentpaginator;  using (var printserver = new localprintserver()) {     printqueue queue = printserver.getprintqueue(printername);     xpsdocumentwriter docwriter = printqueue.createxpsdocumentwriter(queue);      // print ticket - approach 1     // printticket printticket = queue.defaultprintticket.clone();      // print ticket - approach 2     var printticket = new printticket     {         pageorientation = pageorientation.landscape,         pagemediasize = new pagemediasize(pagemediasizename.isoa4), // set size of media (paper)     };       documentpaginator.pagesize = new size(document.pagewidth, document.pageheight);     docwriter.write(documentpaginator, printticket); } 

service set 'system account' without 'interacting desktop' (but tried or login local user).

this results exception on windows 8. when using 'print ticket - approach 1':

system.printing.printqueueexception: printticket provider failed bind printer. win32 error: -2147467231 @ ms.internal.printing.configuration.ptprovider..ctor(string devicename, int32 maxversion, int32 clientversion) @ ms.internal.printing.configuration.ptproviderbase.create(string devicename, int32 maxversion, int32 clientversion) @ system.printing.printticketmanager..ctor(string devicename, int32 clientprintschemaversion) @ system.printing.printqueue.get_defaultprintticket() 

using 'print ticket - approach 2':

exception encountered: system.printing.printqueueexception: fehler beim binden des printticket-anbieters den drucker. win32-fehler: -2147467231 bei ms.internal.printing.configuration.ptprovider..ctor(string devicename, int32 maxversion, int32 clientversion) bei ms.internal.printing.configuration.ptproviderbase.create(string devicename, int32 maxversion, int32 clientversion) bei system.printing.printticketmanager..ctor(string devicename, int32 clientprintschemaversion) bei system.printing.printqueue.get_userprintticket() bei system.printing.printqueue.get_currentjobsettings() bei system.printing.printqueue.createserializationmanager(boolean isbatchmode, boolean mustsetjobidentifier) bei system.windows.xps.xpsdocumentwriter.beginwrite(boolean batchmode, boolean asyncmode, boolean setprinttickethandler, printticket printticket, printticketlevel printticketlevel, boolean printjobidentifierset) bei system.windows.xps.xpsdocumentwriter.write(documentpaginator documentpaginator, printticket printticket) 

i service able find printers because when have tried print non-existing printer , got "invalid printer name" exception.

here i'll keep myself related questions: printing windows service, printing windows service, http://social.msdn.microsoft.com/forums/en-us/ieextensiondevelopment/thread/b74bd27d-1cc8-4fca-a6de-2cd1371cf3b7/,

mildly related: printing .net service,

edit:

in case interested in trying - here sample service application tries print simple document printer selected in config file: http://bin.mypage.sk/files/printtestservice.rar

edit2:

interesting. when tried different printing code there no error:

using (var printdocument = new printdocument()) {     printdocument.printersettings.printername = printername;     printdocument.print(); } 

unfortunately older gdi+ code using system.drawing.graphics library not compatible code produces paginated document in form of system.windows.media.visual objects. can't use print document unless i'd spend 2 weeks of creating pagination of document scratch.

edit3:

there discussion issue here: http://social.msdn.microsoft.com/forums/en-us/netfxbcl/thread/96e7fc10-3f08-4808-b748-692e30377293 there 'workaround' use 'anycpu' platform. workaround works (i tried it) not usable in case when service needs x86. have contacted ms support through our company find real solution.

at http://social.msdn.microsoft.com/forums/windowsdesktop/en-us/fdcfa0fa-50aa-4a61-be79-5b4c8f65fbf7/ see reported microsoft , confirmed bug in windows 8 , windows server 2012.

this bug triggered when trying print 32bit process in non-standard user session (like e.g. service).

according microsoft, bug resolved in windows 8.1 , windows server 2012 r2. however, still reproduce on windows 8.1.

on same site, workaround given microsoft. workaround solved problem on windows 8.1. works on windows 8 , windows server 2012.

the workaround goes follows:

  1. open regedit , go hkey_classes_root\clsid{ba7c0d29-81ca-4901-b450-634e20bb8c34}

  2. check value of "appid" registry entry. in our case {aa0b85da-fddf-4272-8d1d-ff9b966d75b0}

  3. now go hkey_classes_root\appid{aa0b85da-fddf-4272-8d1d-ff9b966d75b0} (or respective value found on system)
  4. under registry key, delete entries name "accesspermission", "launchpermission" , "runas"

since bug in windows, cannot fix in code. workaround might have side effects, haven't seen far in our scenario.


Comments

Popular posts from this blog

monitor web browser programmatically in Android? -

Shrink a YouTube video to responsive width -

wpf - PdfWriter.GetInstance throws System.NullReferenceException -