2013-12-17 119 views
2

的Windows 7:获取默认的打印机远程

cscript C:\Windows\System32\Printing_Admin_Scripts\en-US\prnmngr.vbs -g 

Windows XP中:

cscript C:\windows\system32\prnmngr.vbs -g 

这些将得到当前系统的默认打印机。我想知道是否有一种方法可以在我的计算机上运行此计算机以通过计算机名称获取远程计算机的默认打印机?

我试图运行:

psexec \\c78572 -i -d cscript C:\Windows\System32\Printing_Admin_Scripts\en-US\prnmngr.vbs -g 

,它似乎跑..但我只看到远程计算机上的快速弹出CMD行窗口的结果,而不是我的。所有我对我的最终看到的是:

cscript started with process ID 568. 

在PowerShell中gwmi win32_printer -computername c78572工作..但我不知道如何对它进行排序,以显示我的默认打印机。

编辑13年12月20日,我试图把它与一个显示所有打印机和默认的结合,但我不能得到它的工作:

while (1) { 
$tag1 = Read-Host 'Enter tag # or Q to quit' 
if ($tag1 -eq "Q") { 
    break; 
} 

cls 

sc.exe \\$tag1 start RemoteRegistry; 

cls 

start-sleep -seconds 2 

cls 

$OSInfo = get-wmiobject -class win32_operatingsystem -computername $tag1; 
$OSInfo | Format-Table -Property @{Name="OS Name";Expression={$_.Caption}},@{Name="System Boot Time";Expression={$_.ConvertToDateTime($_.LastBootUpTime)}} -AutoSize; 


gwmi win32_printer -computername $tag1 | ft -Property @{Name="Printer Name";Expression={$_.Name}} -AutoSize; 

$Computer = $tag1 
$Reg = [Microsoft.Win32.RegistryKey]::OpenRemoteBaseKey('currentuser', $Computer) 
$RegKey= $Reg.OpenSubKey('Software\Microsoft\Windows NT\CurrentVersion\Windows') 
$DefaultPrinter = $RegKey.GetValue("Device") 
$DefaultPrinter | ConvertFrom-Csv -Header Name, Provider, Order| Select Name 

# Alt method: Get-WmiObject win32_printer -computername c60311 

}

回答

8

您可以使用wmi32_printer获取默认值。这里是代码:

$AllPrinters = gwmi win32_printer -computername c78572 
$DefaultPrinter = $AllPrinters | where {$_.Default -eq $true} 

这将返回所有本地连接的打印机。如果你想获得网络连接的打印机列表(正如Aaron评论的那样),你会遇到一些问题。上述脚本不起作用,因为WMI在本地机器上运行,而不是在用户级别上运行。经过大量研究,获取此信息的一种方法是运行登录脚本,因为实质上没有其他方式可以远程使用WMI来获取登录用户的信息。

如果我们不能使用WMI,该怎么做呢?使用后门。所有相关信息都存储在注册表中。输出可能不太好,但它会给你我们需要的所有信息。我们只关心3个关键地点:

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Print\Printers 

这包含了所有本地安装打印机。忘记它,请使用gwmi win32_printer命令获取此列表。

HKEY_CURRENT_USER\Printers\Settings 

这包含了所有的当前登录的用户安装打印机。它没有默认的打印机信息。

HKEY_CURRENT_USER\Software\Microsoft\Windows NT\CurrentVersion\Windows\Device 

这是从哪里得到的当前登录的用户安装的默认打印机。即这是Aaron专门寻找的。

因此,我们可以使用PowerShell连接到远程注册表,并读取当前登录使用以下脚本用户的默认打印机:

$Computer = "c78572" 
$Reg = [Microsoft.Win32.RegistryKey]::OpenRemoteBaseKey('currentuser', $Computer) 
$RegKey= $Reg.OpenSubKey('Software\Microsoft\Windows NT\CurrentVersion\Windows') 
$DefaultPrinter = $RegKey.GetValue("Device") 
$DefaultPrinter | ConvertFrom-Csv -Header Name, Provider, Order| Select Name 

----编辑 - 让所有的列表打印机----

要列出远程计算机上的所有打印机:

$Computer = "c78572" 

#Get Local Printers: 
$Printers = @(Get-WmiObject win32_printer -computername $Computer | Select Name) 

#Get List of Network Printers: 
$Reg = [Microsoft.Win32.RegistryKey]::OpenRemoteBaseKey('currentuser', $Computer) 
$RegKey= $Reg.OpenSubKey('Printers\Settings') 
$Printers += @($RegKey.GetValueNames()) 

#Output List of Printers 
Write-Output $Printers | ft -Property @{Name="Printer Name";Expression={$_.Name}} -AutoSize 


#Get Default Printer 
$Reg = [Microsoft.Win32.RegistryKey]::OpenRemoteBaseKey('currentuser', $Computer) 
$RegKey= $Reg.OpenSubKey('Software\Microsoft\Windows NT\CurrentVersion\Windows') 
$DefaultPrinter = $RegKey.GetValue("Device") 

#Output the Default Printer 
Write-Output $DefaultPrinter | ConvertFrom-Csv -Header Name, Provider, Order| Select Name | ft -Property @{Name="Default Printer Name";Expression={$_.Name}} -AutoSize 
+0

貌似正确的命令,但唯一的问题是,他们是网络打印机,所以它并没有将它们列为默认WH实际上,当你去看时,它们被设置为一个。 – Aaron

+0

您说得对,使用WMI无法获得用户的网络打印机。请参阅上述编辑。我已经添加了一种方法来访问当前登录用户的网络打印机。它可以很容易地被修改,以从盒子上的所有其他未登录用户那里获得信息。 – HAL9256

+0

我正在尝试将打印机列表与打印机列表相结合,然后在其下面使用默认列表...但它不起作用。我用我的代码编辑了我的OP。 – Aaron