尝试在 C# 中清除打印队列时访问被拒绝

2024-01-17

我正在尝试在 C# 中创建一个方法来清空打印队列中的所有项目。下面是我的代码:

LocalPrintServer localPrintServer = new LocalPrintServer(PrintSystemDesiredAccess.AdministratePrinter); 
PrintQueue printQueue = localPrintServer.GetPrintQueue(printerName);

if (printQueue.NumberOfJobs > 0)
{
    printQueue.Purge();
}

当此代码在 localPrintServer 构造函数上运行时,应用程序会抛出以下错误: “创建 PrintServer 对象时发生异常。Win32 错误:访问被拒绝。”

该构造函数有一些重载(包括不发送参数)。尝试其中任何一个,我都会越过该行,但是当我到达 printQueue.Purge() 调用时,我收到与上面列出的相同的访问被拒绝消息。

寻找关于如何/做什么来解决这个问题的建议。我可以从计算机中手动删除打印作业。我不确定该应用程序是否以与我相同的访问权限运行,也不知道如何检查。


这个问题是由GetPrintQueue方法有点邪恶,因为它不允许您传递所需的访问级别。使用您的代码,您将连接到打印server with AdministratePrinter权利(毫无意义),并连接到印刷品queue具有默认用户权限。因此,即使Everyone具有打印队列的管理员权限。

要解决此问题,请使用构造函数PrintQueue而是指定正确的访问级别:

using (PrintServer ps = new PrintServer()) {
    using (PrintQueue pq = new PrintQueue(ps, printerName,
          PrintSystemDesiredAccess.AdministratePrinter)) {
        pq.Purge();
    }
}

如果您没有在管理员组成员的上下文中运行(或者没有以提升的权限运行),这仍然可能会导致权限错误,因此对于生产代码来说,用 try/catch 块包围它是一个好主意。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

尝试在 C# 中清除打印队列时访问被拒绝 的相关文章

随机推荐