【问题标题】:workaround for win32_printer access deniedwin32_printer 访问被拒绝的解决方法
【发布时间】:2023-03-05 16:48:01
【问题描述】:

我正在为 Windows 7 编写一个 powershell 脚本来替换用户桌面上的一些打印机连接,并且我需要能够在 Windows 打印服务器上获取打印队列列表。除了浏览、连接和打印到打印队列之外,我无权访问打印服务器。

问题:当使用 get-wmiobject 通过 win32_printer 向服务器查询列表时,访问被拒绝。

PS M:> Get-WmiObject -Class Win32_Printer -computername newprintservername

Get-WmiObject:访问被拒绝。 (来自 HRESULT 的异常:0x80070005 (E_ACCESSDENIED)) 在行:1 字符:14 + Get-WmiObject

复杂性:“newprintservername”实际上可能是两个不同的服务器之一,因此我希望能够在尝试连接之前检查打印队列是否存在。我想我可以尝试连接,检查打印机连接,如果它不存在,尝试连接到另一台服务器,但除非绝对必要,否则我不想走那条路线。

有什么想法吗?提前致谢。

【问题讨论】:

    标签: powershell printing


    【解决方案1】:

    出于某种原因,我很难找到它,但我知道它必须存在:用于打印服务器、打印机、打印队列等的 .Net 类。所以,这就是我发现的……

    向我展示如何加载 .DLL 以访问类的脚本的链接:
    http://poshcode.org/2942

    这是我使用的(我有一个 64 位操作系统):

    $SystemPrinting = Get-ChildItem "$($env:systemroot)\assembly\GAC_64\System.Printing"
    $SystemPrintingFile = Get-ChildItem -Name "*system.printing*" -Recurse -Path $SystemPrinting.FullName
    $SystemPrintingFile = "$($SystemPrinting.FullName)\$($SystemPrintingFile)"
    Add-Type -Path $SystemPrintingFile
    

    然后我添加了这个:

    $PrintServer = [System.Printing.PrintServer]"\\ServerName"
    try{
        $PrintQueue = $PrintServer.GetPrintQueue("PrintQueueName")
    }
    Catch{
        "Print Queue Not Found"
    }
    

    我使用有效的打印队列进行了尝试,当我查看 $PrintQueue 时可以查看队列信息,当我尝试无效的打印队列时,它回复说“找不到打印队列”。

    这足以让您一起完成您需要做的事情吗?

    【讨论】:

      【解决方案2】:

      您可能需要提升机器的权限才能查询 WMI。尝试使用对该机器具有管理员权限的凭据运行您的命令,看看情况如何。

      Get-WmiObject -Class Win32_Printer -computername newprintservername -Credential (Get-Credential)

      或者,如果您无法在该计算机上获得管理员权限,您可能希望与设置非管理员以查询 WMI 的人一起查看此博客文章 - link

      至少,它可能会帮助您指明正确的方向。

      干杯,

      【讨论】:

        猜你喜欢
        • 2018-01-20
        • 2012-11-27
        • 2018-03-27
        • 2013-09-06
        • 1970-01-01
        • 2021-09-14
        • 2017-08-09
        • 1970-01-01
        • 2012-08-29
        相关资源
        最近更新 更多