【问题标题】:Get default printer remotely远程获取默认打印机
【发布时间】:2014-01-05 12:47:47
【问题描述】:

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 中工作.. 但我不知道如何对其进行排序以显示默认打印机。

编辑 2013 年 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

}

【问题讨论】:

    标签: powershell printing command-line command wsh


    【解决方案1】:

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

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

    我的主要挑战是想办法获取“当前用户”信息(而不是“计算机”信息)。共享打印机连接存储在用户区,所以我需要在其中。

    我拼凑了来自多个来源的信息以做到这一点:

    • 确定登录用户(帐户)
    • 获取该用户的 SID
    • 使用 SID 导航到用户的 HKEY_USERS 注册表配置单元
    • 输出 SOFTWARE\Microsoft\Windows NT\CurrentVersion\Windows\Device 中的值。在编码之前,我确定此注册表值会在默认打印机更改后立即更新。奖励:您还可以通过更新此注册表值来更改/设置用户的默认打印机。
    # ---------------------------------------------------------------------------
    #
    # 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…')
    

    【讨论】:

    • 谢谢。我非常彻底地评论了我的代码,并认为这就足够了。我将在正文中添加更多解释。
    【解决方案2】:

    您可以使用 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
    

    ----EDIT - 获取所有打印机的列表----

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

    $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
    

    【讨论】:

    • 看起来像正确的命令,但唯一的问题是它们是网络打印机,因此它不会将它们列为默认值,而实际上当你去查看时它们被设置为一个。
    • 你是对的,使用WMI无法获取用户的网络打印机。请参阅上面的编辑。我为当前登录的用户添加了一种访问网络打印机的方法。它可以很容易地进行修改,以从盒子上的所有其他未登录用户那里获取信息。
    • 我正在尝试将您拥有的内容与打印机列表相结合,然后是其下方的默认列表……但它不起作用。我用我的代码编辑了我的 OP。
    • 我知道这已经一年多了,但我的评论。 Settings 键不包含网络打印机,我看到它们列在 HKCU\Printers\Connections
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-08-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多