远程获取默认打印机

问题描述 投票:2回答: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/20/13,我试图将它与显示所有打印机和默认打印机结合使用,但我无法使它工作:

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

}

powershell printing command-line command wsh
2个回答
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

这是获取当前登录的用户安装的默认设置打印机的位置。也就是说,这是亚伦特别需要的。

因此,我们可以使用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
投票

此脚本将返回指定计算机的当前登录用户的默认打印机(从注册表中读取)。希望这对您有用,并节省了您的时间。我不是脚本向导,花了几个小时才将所有这些拼凑在一起。

# ---------------------------------------------------------------------------
#
# This script requires a computer name.  It will return the computer's 
# currently logged-in user's default printer.
#
# ---------------------------------------------------------------------------

# Set the variable below to choose your computer
$Computer = "computer_name"


# get the logged-in user of the specified computer
$user = Get-WmiObject –ComputerName $computer –Class Win32_ComputerSystem | Select-Object UserName

# get that user's AD object
$AdObj = New-Object System.Security.Principal.NTAccount($user.UserName)

# get the SID for the user's AD Object 
$strSID = $AdObj.Translate([System.Security.Principal.SecurityIdentifier])

# get a handle to the "USERS" hive on the computer
$reg = [Microsoft.Win32.RegistryKey]::OpenRemoteBaseKey("Users", $Computer)

# get a handle to the current user's USERS Registry key where the default printer value lives
$regKey = $reg.OpenSubKey("$strSID\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Windows")

# read and show the new value from the Registry for verification
$regValue = $regKey.GetValue("Device")
write-output $regValue
write-output " "
write-output " "
[void](Read-Host 'Press Enter to continue…')
© www.soinside.com 2019 - 2024. All rights reserved.