我的组织使用一个软件,其中有一个硬编码的打印机名称PRN1
。
用户分布在多个地点;所以不可能只重命名一台打印机。我们的联网打印机通过登录脚本按计算机位置进行映射;有些电脑有本地连接的打印机。
目前提出的解决方案是在用户登录时远程登录每台计算机;重新映射用户默认打印机;并手动重命名(右键单击>打印机支持...)。
我试图避免这种情况,因为我们不使用漫游配置文件,而且有些用户确实从一个位置移动到另一个位置;并且用户不会理解为什么它突然不起作用。
理想情况下,我想创建一个自动复制用户默认打印机的脚本;并将其命名为PRN1
。
$AllPrinters = gwmi win32_printer
$DefaultPrinter = $AllPrinters | where {$_.Default -eq $true}
rundll32 printui.dll,PrintUIEntry /ga /n $DefaultPrinter.SystemName + "\" + $DefaultPrinter.ShareName /z /b"PRN1"
以上是我现在拥有的;我知道我没有正确使用rundll32
命令,因为打印机没有与新名称重复。
非常感谢任何帮助或帮助。
答案 0 :(得分:2)
我在这里和那里使用那个rundll32命令,但从来没有运气好。
你可以通过完全使用wmi来做这样的事情。如果用户最终遇到问题,您可能希望将大量的try包裹起来以抑制错误并记录输出。
$Name = "PRN"
$AllPrinters = gwmi win32_printer
$DefaultPrinter = $AllPrinters | where {$_.Default -eq $true}
$objHelper = [WMICLASS]"\\localhost\root\cimv2:Win32_SecurityDescriptorHelper"
$print = [WMICLASS]"\\localhost\root\cimv2:Win32_Printer"
$print.Scope.Options.EnablePrivileges = $true
$newprinter = $print.createInstance()
$newprinter.drivername = $DefaultPrinter.DriverName
$newprinter.PortName = $DefaultPrinter.PortName
$newprinter.Shared = $false
$newprinter.Location = $DefaultPrinter.Location
$newprinter.Comment = $DefaultPrinter.Comment
$newprinter.DeviceID = $Name
$newprinter.PrintProcessor = $DefaultPrinter.PrintProcessor
$newprinter.PrintJobDataType = $DefaultPrinter.DataType
$newprinter.RawOnly = $DefaultPrinter.RawOnly
$result = $newprinter.Put()