win32_printer访问被拒绝的解决方法

时间:2014-09-11 18:39:26

标签: powershell printing

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

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

  

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

     

Get-WmiObject:访问被拒绝。 (HRESULT异常:0x80070005(E_ACCESSDENIED))      在行:1 char:14      + Get-WmiObject<<<< -Class Win32_Printer -computername newprintservername          + CategoryInfo:NotSpecified:(:) [Get-WmiObject],UnauthorizedAccessException          + FullyQualifiedErrorId:System.UnauthorizedAccessException,Microsoft.PowerShell.Commands.GetWmiObjectCommand

并发症:" newprintservername"实际上可能是两个不同的服务器之一,所以我希望能够在尝试连接之前检查是否存在打印队列。我想我可以尝试连接,检查打印机连接,如果它不存在,尝试连接到其他服务器,但除非绝对必要,否则我不想采取这种方式。

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

2 个答案:

答案 0 :(得分: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时查看队列信息,当我尝试无效时,它回复说“找不到打印队列”。

这对您来说是否足以让您完成所需的工作?

答案 1 :(得分:0)

您可能需要提升机器的权限才能查询WMI。尝试使用具有该计算机管理员权限的凭据运行命令,并查看具体方法。

  

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

或者,如果您无法获得该计算机的管理员权限,则可能需要与设置非管理员的人员一起查看此博客帖子以查询WMI - link

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

干杯,