![](/img/trans.png)
[英]C# Privilege issues creating folders from Windows service running as Local System account.
[英]printing a PDF file in a C# windows service under Local system account
我在 C# 中开发了一个 Windows 服务,它通过网络接收一个 PDF 文件,它需要将它打印到已安装的打印机上。 我正在使用库进行实际打印( HiQPdf )。 我在模拟控制台应用程序中对其进行了测试。
当我在本地系统帐户下安装并运行该服务时,该库会抛出 {"No printers are installed."} System.Drawing.Printing.InvalidPrinterException
我通过将服务作为调试运行并附加到 Visual Studio 中的服务发现了这一点在管理员模式下。
如果我通过转到服务属性(通过键入 services.msc 访问服务)和登录选项卡在该机器上指定用户帐户,我指定此帐户以及我登录的当前用户的用户名和密码上,然后服务完美地打印
这种方法现在有一个缺点,即需要用户对服务属性进行此更改并保持用户的密码为最新,这并不理想。
现在我的问题是,有没有办法在本地系统帐户或任何其他帐户系统帐户下运行该 Windows 服务,而不是需要为该帐户提供用户名和密码的用户帐户?
我还发现以下文章从 Windows 服务打印,它建议不要在 Windows 服务中使用某些库并加载用户配置文件(我猜这需要用户凭据),但没有建议如何在本地系统帐户下执行此操作。
同样有趣的是,即使在本地系统帐户下,我也可以获得已安装打印机的列表,其中包括提到的所需打印机:
try
{
if (System.Drawing.Printing.PrinterSettings.InstalledPrinters.Count > 0)
{
string[] ar = new string[System.Drawing.Printing.PrinterSettings.InstalledPrinters.Count];
System.Drawing.Printing.PrinterSettings.InstalledPrinters.CopyTo(ar, 0);
System.IO.File.WriteAllLines(@"c:\Projects\list_of_printter.txt", ar);
}
}
catch (Exception e)
{
Console.WriteLine(e);
}
以下代码片段实际执行打印作业:
try
{
var pdfPrinter = new PdfPrinter();
logger.LogInformation("Created pdf printer");
pdfPrinter.PrinterSettings.PrinterName = printerName;
pdfPrinter.SerialNumber = "MY_LICENSE";
pdfPrinter.SilentPrinting = true;
pdfPrinter.PageSettings.Margins.Bottom = 0;
pdfPrinter.PageSettings.Margins.Left = 0;
pdfPrinter.PageSettings.Margins.Right = 0;
pdfPrinter.PageSettings.Margins.Top = 0;
pdfPrinter.PageSettings.Landscape = true;
logger.LogInformation("About to print document");
pdfPrinter.PrintPdf(fileBytes);
logger.LogInformation("Document should be printed now");
}
catch (Exception e)
{
logger.LogError($"Error when printing. Exception: {e}. Message: {e.Message}");
throw;
}
系统用户没有安装打印机,它看不到您作为用户安装的打印机。
要从作为系统的服务打印到网络打印机,您需要将打印机安装为本地打印机。
http://techgenix.com/AddSharedPrinterasaLocalPrinter/
我将此用于打印 PDF 的 Widows 服务。
我只是遇到了几乎相同的问题,但使用 Windows 服务甚至更早失败了。 我的建议只是不要使用该 Windows 服务项目类型。 创建一个控制台应用程序并使用NSSM - Non-Sucking Service Manager使其成为一项服务。 此外,安装和卸载服务也不会那么痛苦,如果您愿意,还可以使用 GUI。
那么问题是默认打印机不同。 您必须手动设置默认打印机:
var settings = new PrinterSettings();
settings.PrinterName = "HPBF11E5 (HP OfficeJet 6950)";
var p = new PrintDocument();
p.PrinterSettings = settings; //set settings with new default printer
...
这样我什至在没有“允许服务与桌面交互”选项的情况下使用 LocalService 帐户让它工作。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.