gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 19:58:44 24 4
gpt4 key购买 nike

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

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

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

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

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

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

最佳答案

这个问题是由于 GetPrintQueue 方法有点邪恶造成的,因为它不允许您传入所需的访问级别。使用您的代码,您将使用 AdministratePrinter 权限(这是无意义的)连接到打印 服务器,并连接到打印队列具有默认用户权限。因此,操作将失败,即使 Everyone 对打印队列具有管理员权限。

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

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

如果您没有在 Administrators 组成员的上下文中运行(或没有以提升的权限运行),这仍然可能导致权限错误,因此用 try/catch block 围绕它是生产代码的好主意.

关于c# - 拒绝访问尝试在 C# 中清除打印队列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8348743/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com