Powershell 远程获取默认打印机

Powershell 远程获取默认打印机,powershell,printing,command-line,command,wsh,Powershell,Printing,Command Line,Command,Wsh,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\

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
它似乎在运行。。但我只在远程计算机上的一个快速弹出命令行窗口中看到结果,而在我的计算机上看不到。我所看到的是:

cscript started with process ID 568.
在powershell
gwmi win32_打印机-计算机名c78572中工作。。但我不知道如何对它进行排序以显示默认打印机

编辑12/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

}

您可以使用wmi32\u打印机获取默认值。代码如下:

$AllPrinters = gwmi win32_printer -computername c78572
$DefaultPrinter = $AllPrinters | where {$_.Default -eq $true}
这将返回所有本地连接的打印机。如果您想获得网络连接打印机的列表(正如Aaron在下面评论的那样),您会遇到一些问题。上述脚本无法工作,因为WMI在本地计算机上运行,而不是在用户级别上运行。经过大量研究后,获取此信息的一种方法是运行一个登录脚本,因为基本上没有其他方法可以远程使用WMI获取登录用户的信息

HKEY_CURRENT_USER\Software\Microsoft\Windows NT\CurrentVersion\Windows\Device
如果无法使用WMI,如何真正做到这一点?使用后门。所有相关信息都存储在注册表中。输出可能不美观,但它将为您提供我们需要的所有信息。我们只关注3个关键位置:

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Print\Printers
包含所有本地安装的打印机。忘了它吧,使用
gwmi win32\u printer
命令获取此列表

HKEY_CURRENT_USER\Printers\Settings
包含当前登录用户安装的所有打印机。它没有默认的打印机信息

HKEY_CURRENT_USER\Software\Microsoft\Windows NT\CurrentVersion\Windows\Device
这是获取当前登录的用户安装的默认打印机的位置。i、 这就是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

此脚本将返回指定计算机当前登录用户的默认打印机(从注册表读取)

我们正在尝试清理一些网络打印机连接,像这样的脚本显示用户连接到的共享打印机是我们真正需要的

我的主要挑战是找出一种获取“当前用户”信息(而不是“计算机”信息)的方法。共享打印机连接存储在用户区,因此我需要在那里

我将来自多个来源的信息拼凑起来,这样做:

  • 确定已登录的用户(帐户)
  • 获取该用户的SID
  • 使用SID导航到用户的HKEY_用户注册表配置单元
  • 在SOFTWARE\Microsoft\Windows NT\CurrentVersion\Windows\Device中输出值。在编码之前,我确定这个注册表值会在默认打印机更改后立即更新。额外好处:您还可以通过更新此注册表值来更改/设置用户的默认打印机

看起来像是正确的命令,但唯一的问题是它们是网络打印机,因此当您实际去查看时,它们被设置为1时,它不会将它们列为默认值。您是对的,使用WMI无法获取用户的网络打印机。请参阅以上编辑。我为当前登录的用户添加了一种访问网络打印机的方法。它可以很容易地进行修改,以便从该框中的所有其他未登录用户处获取信息。我正在尝试将您拥有的内容与打印机列表相结合,然后是它下面的默认列表……但它无法工作。我用我的代码编辑了我的作品。我知道这已经一年多了,但是我的评论。设置键不包含网络打印机,我看到它们列在HKCU\printers\Connections谢谢下。我对我的代码进行了非常彻底的注释,认为这样就足够了。我将在正文中补充一些解释。