我正在尝试在 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(使用前将#替换为@)