每当将新行插入数据库表时,我都需要自动将ssrs报告打印到网络上的特定打印机。数据库表上有一个触发器,它使用xp_cmdshell来调用呈现和打印报告的控制台应用程序。当我从命令提示符执行控制台应用程序时,它可以工作。此外,当我将sql server运行的帐户更改为管理员时,xp_cmdshell按预期工作并打印报告。但是,我不希望sql server以管理员身份运行,因此我使用sp_xp_cmdshell_proxy_account设置了代理帐户。我使用管理员作为SQL Server执行xp_cmdshell的帐户,并将SQL Server设置为作为本地系统运行。但是,当我使用非sysadmin的帐户登录到SQL Server并使用xp_cmdshell执行控制台应用程序时,控制台应用程序会生成以下异常:
RPC服务器不可用 - 源:System.Drawing - 堆栈跟踪:位于System.Windows.Forms.PrintControllerWithStatusDialog.OnStartPrint的System.Drawing.Printing.StandardPrintController.OnStartPrint(PrintDocument document,PrintEventArgs e)(PrintDocument document,PrintEventArgs) e)位于PrintQCChecklist.Program.Main(String [] args)的System.Drawing.Printing.PrintDocument.Print()的System.Drawing.Printing.PrintController.Print(PrintDocument文档)
然后我用xp_cmdshell调用whoami.exe并返回'administrator'。为什么在sql server作为admin运行时打印文档但在代理下作为admin运行时崩溃? (请不要因为使用xp_cmdshell而烦恼。我知道安全风险。谢谢。)
答案 0 :(得分:0)
您是否考虑过将SSRS报告发布到网络共享,并让打印机程序选择报告,打印报告然后归档?我以前用廉价的第三方打印工具做类似的事情 - 由供应商支持,而且 - 在我看来 - 更清洁。