使用GhostScript从Windows服务打印PDF - 如何诊断权限问题

时间:2017-09-07 12:24:31

标签: windows-services user-permissions diagnostics

我有一个用C#编写的服务。运行以下代码:

public static bool PrintPDF(string ghostScriptPath, int numberOfCopies, string printerName, string pdfFileName)
{
    ProcessStartInfo startInfo = new ProcessStartInfo();
    startInfo.Arguments = $@"-dPrinted -dNoCancel=true -dBATCH -dNOPAUSE -dNOSAFER -q -dNumCopies={numberOfCopies} -sDEVICE=mswinpr2 -sOutputFile=""\\spool\{printerName}"" ""{pdfFileName}""";

    startInfo.FileName = Path.Combine(ghostScriptPath, "gswin64c.exe");
    startInfo.UseShellExecute = false;
    startInfo.CreateNoWindow = true;
    startInfo.RedirectStandardError = true;
    startInfo.RedirectStandardOutput = true;

    Process process = Process.Start(startInfo);

    Console.WriteLine(process.StandardError.ReadToEnd() + process.StandardOutput.ReadToEnd());

    process.WaitForExit(30000);
    if (process.HasExited == false) process.Kill();


    return process.ExitCode == 0;
}

在Windows服务之外,它没有任何问题。 在服务内部,当作为本地系统运行时,GhostScript开始运行但没有任何输出超时。

经过一番摆弄后,我终于将服务切换为网络服务,并将网络服务设置为服务器exe和GhostScript exe所在文件夹的所有者(在我这样做之前,我得到了拒绝访问错误) - 现在服务运行良好。

我的问题是 - 为什么网络服务可以在本地系统无法工作的地方工作?我认为Local System有更多特权。而且,我怎样才能获得有关实际问题的更多信息?我找到了一个解决方法,但它只是一个在黑暗中的幸运镜头。我不知道真正的问题是什么。

更多信息: 运行Windows 10 64位,并使用GhostScript v9.29

1 个答案:

答案 0 :(得分:0)

您需要在专用于其的本地用户帐户下运行该服务。 您还需要一次在列表中与该用户登录,以便填充打印机列表!