带网络打印机的添加打印机失败

时间:2017-01-05 03:21:03

标签: powershell

当我在本地PowerShell环境中使用Add-Printer -ConnectionName '\\server\Printer'时,它会成功。

当我使用相同的命令时,却包含在Invoke-Command中,如下所示:

Invoke-Command -ComputerName 'someServer' -Credential $creds -Authentication CredSSP -ScriptBlock { Add-Printer -ConnectionName '\\server\Printer' }

说不清楚

'\' is an invalid character.

我猜测它已连接到本地和远程可用的不同级别的用户个人资料,但我不确定如何解决它。

修改:为了更新这一点,我不得不放弃这种方法,因为我无法让它发挥作用。我的解决方法是使用

RUNDLL32 PRINTUI.DLL,PrintUIEntry /ga /c\\computerName /n\\someServer\Printer /q

哪个有效,但它与Add-Printer cmdlet略有不同。

3 个答案:

答案 0 :(得分:1)

我不是百分百肯定你为什么会看到这个错误。我确信这与处理字符串的方式有关。

但是,您不应该真正需要通过Invoke-Command运行它,因为Add-Printer本身有两个选项可以将打印机添加到远程计算机。

您可以使用-CompuerName参数指定单个计算机:

Add-Printer -ComputerName 'someServer' -ConnectionName '\\server\Printer'

您还可以使用-CimSession参数指定一个(或多个)CimSession,允许您同时点击一堆机器。

使用此命令需要注意的一点是,它仅适用于Server 2012 / Windows 8及更高版本(包括远程目标)。

答案 1 :(得分:1)

我遇到了类似的问题,但我试图从打印服务器遍历共享打印机列表,然后将所有打印机添加到本地计算机。如果你想看到我的解决方案,请跳到底部。

以下命令将所有共享打印机作为对象返回:

$printerList = Get-Printer -ComputerName PrintServer | where Shared -eq $true

以下内容应该遍历我的所有打印机并添加每个打印机:

foreach ($printer in $printerList) { 
    Add-Printer -ConnectionName "\\PrintServer\$printer.SharedName" 
}

相反,我应该遇到与OP相同的错误:

  

添加打印机:指定的服务器不存在,或者服务器或打印机名称无效。名称可能不包含','或者' \'字符。   在线:1字符:38   + ... nterList){Add-Printer -ConnectionName" \ PrintServer \ $ printer.SharedNam ...   + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~       + CategoryInfo:未指定:(MSFT_Printer:ROOT / StandardCimv2 / MSFT_Printer)[Add-Printer],CimException       + FullyQualifiedErrorId:HRESULT 0x80070709,Add-Printer

毋庸置疑,我对这些结果感到非常困惑,因为当我测试发生的事情时,我会看到以下内容:

Write-Host $printer.ShareName
printerName

大!为什么它不能用双引号工作?我故意使用双引号来返回$ printer变量的内容:

Write-Host "$printer.ShareName"
  

MSFT_Printer(名称=" printerName",ComputerName =" PrintServer",DeviceType = 0,Type = 0).ShareName

可能由于类型转换或谁知道什么(并且是的,ShareName属性已经是一个简单的字符串,它不是哈希表或嵌套的时髦数据类型),而不是弄乱CimException,我做了一个简单的ToString()作为解决方法:

$printerList = Get-Printer -ComputerName PrintServer | where Shared -eq $true
foreach ($printer in $printerList) { 
    $printerStr = $printer.ShareName.ToString()
    Add-Printer -ConnectionName "\\PrintServer\$printerStr" 
}

答案 2 :(得分:0)

我也遇到了这个问题,ToString()并没有为我解决。这是“不需要”参数-ComputerName。我正在运行remove-PrinterPort -Name $port,导致出现以下错误:

The specified server does not exist, or the server or printer name is invalid. Names may not contain ',' or '\' characters.

敲打头和Googlin'之后,我终于将计算机名称添加为$env:computername这样的测试,我尝试使用“”。以前,因为我认为这意味着要使用本地计算机,但是它无法正常工作,只是停滞了。

添加计算机名称后,端口和驱动程序被删除,没有错误。

get-help Remove-PrinterPort显示-Computer名称不是必需的,但似乎确实是必需的:

-ComputerName [<String>]
        Specifies the name of the computer from which to remove the printer port.

        Required?                    false
        Position?                    named
        Default value                none
        Accept pipeline input?       false
        Accept wildcard characters?  false