Advertisement
amnich

Get-UserNetPrinter

Jun 14th, 2017
1,359
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. function Get-UserNetPrinter {
  2.     <#
  3.         .SYNOPSIS
  4.             Get all the Network Printers from the Registry
  5.             Requires Remote Registry access on the remote machine
  6.  
  7.         .DESCRIPTION
  8.             Extract a list of all Print-Server Printers that a computer is using.
  9.             These are not the same as direct install printers. For that, WMI is easier
  10.  
  11.  
  12.         .PARAMETER ComputerName
  13.             A computer or array of computers
  14.  
  15.         .EXAMPLE
  16.             Get-UserNetPrinter $(hostname)
  17.  
  18.         DESCRIPTION
  19.         ------------
  20.             Get all the installed printers on the current machine
  21.  
  22.  
  23.         OUTPUT
  24.         ------------
  25.             Returns Computer Printer Details as an object
  26.  
  27.             E.g:
  28.  
  29.             computer         : ComputerName
  30.             user             : Domain\User
  31.             printServer      : PrintServerName
  32.             printer          : PrinterName
  33.             pringerGUID      : {ABCDE-FGH-1234-5678-ABCDEFGHI}
  34.             printerDesc      :
  35.             printerDriver    : XX V123
  36.             printerLocation  :
  37.             printerPortName  : 192.168.254.254
  38.             printerShareName : PrinterSharedName
  39.             printerSpooling  : PrintAfterSpooled
  40.             printerPriority  : 1
  41.             printerUNC       : \\UNC\PATH\GOES\HERE
  42.             printerDefault   :
  43.  
  44.  
  45.  
  46.         .NOTES
  47.             Author: Pessimist__Prime for Reddit
  48.             Last-Edit-Date: 14/06/2017
  49.  
  50.  
  51.             Changelog:
  52.             14/06/2017 - Initial Script
  53.             14/06/2017 - Adam Mnich added default printer
  54.  
  55.  
  56.     #>
  57.  
  58.  
  59.     [CmdletBinding()]
  60.     PARAM(
  61.         [Parameter(ValueFromPipelineByPropertyName = $true, Position = 0)]        
  62.         [string[]]$computerName = $env:ComputerName
  63.     )
  64.     begin {
  65.         #Return the script name when running verbose, makes it tidier
  66.         write-verbose "===========Executing $($MyInvocation.InvocationName)==========="
  67.         #Return the sent variables when running debug
  68.         Write-Debug "BoundParams: $($MyInvocation.BoundParameters|Out-String)"
  69.         $regexPrinter = "\\\\.*\\(.*)$"
  70.         $regexPrinter2 =  "(\w*),"
  71.         $regexPrinter3 = "\\\\.*\\(.*),winspool"
  72.     }
  73.  
  74.     process {
  75.         #Iterate through each computer passed to function
  76.         foreach ($computer in $computerName) {
  77.  
  78.             write-verbose "Processing $computer"
  79.             #Open the old remote registry
  80.             $reglm = [Microsoft.Win32.RegistryKey]::OpenRemoteBaseKey([Microsoft.Win32.Registryhive]::LocalMachine, $computer)
  81.             $regu = [Microsoft.Win32.RegistryKey]::OpenRemoteBaseKey([Microsoft.Win32.Registryhive]::Users, $computer)
  82.             #Grab the USER SIDS, try and ignore service accounts and stuff
  83.             $sids = ($regu.GetSubKeyNames() | Where-Object {($_ -notlike '*.DEFAULT*') -and ($_ -notlike "*classes*") -and ($_.length -ge 9)})
  84.             foreach ($sid in $sids) {
  85.                 write-verbose "Processing UserSID:  $sid"
  86.                 $printersReg = $regu.OpenSubKey("$sid\printers\connections")
  87.                 $printerDefaultReg = $regu.OpenSubKey("$sid\printers\defaults")                            
  88.                 $DefaultPrinter = try {
  89.                         ($regu.OpenSubKey("$sid\printers\defaults\$($printerDefaultReg.GetSubKeyNames())")).getvalue($null)
  90.                     }
  91.                     catch {$null}
  92.                 if ($printerDefaultReg -eq $null){
  93.                     $printerDefaultReg = $regu.OpenSubKey("$sid\Software\Microsoft\Windows NT\CurrentVersion\Windows") 
  94.                     $DefaultPrinter = try {$printerDefaultReg.GetValue("Device")} catch {$null}
  95.                 }
  96.                 Write-Verbose "Default Printer $DefaultPrinter"
  97.                 if ($DefaultPrinter -match $regexPrinter3){
  98.                     $DefaultPrinter = $Matches[1]
  99.                 }
  100.                 elseif ($DefaultPrinter -match $regexPrinter){
  101.                     $DefaultPrinter = $Matches[1]
  102.                 }
  103.                 elseif ($DefaultPrinter -match $regexPrinter2){
  104.                     $DefaultPrinter = $Matches[1]          
  105.                 }
  106.                 if (($printersReg -ne $null) -and ($printersReg.length -gt 0)) {
  107.                     $printers = $printersReg.getsubkeynames()
  108.                     #Try and get the username from the SID - Need to be the same domain
  109.                     #Should change to a try-catch for different domains
  110.                     $user = $($(New-Object System.Security.Principal.SecurityIdentifier($sid)).Translate([System.Security.Principal.NTAccount]).Value)
  111.  
  112.                     foreach ($printer in $printers) {
  113.                         #Need to split the regkey name to get proper values
  114.                         #Split 2 = Print server
  115.                         #Split 3 = printer name
  116.                         #Never seen a value in the 0 or 1 spots
  117.                         $split = $printer.split(",")
  118.                         $printerDetails = $regu.openSubKey("$SID\Printers\Connections\$printer")
  119.                         $printerGUID = $printerDetails.getValue("GuidPrinter")
  120.                         $spoolerPath = "SOFTWARE\Microsoft\Windows NT\CurrentVersion\Print\Providers\Client Side Rendering Print Provider\Servers\$($split[2])\Printers\$printerGUID\DsSpooler"
  121.                         $printSpooler = $reglm.OpenSubKey("$spoolerPath")
  122.  
  123.                         #Make an object to store in the array
  124.                         $pdetails = [pscustomobject]@{
  125.                             computer         = $computer
  126.                             user             = $user
  127.                             printServer      = $split[2]
  128.                             printer          = $split[3]
  129.                             pringerGUID      = $printerGUID
  130.                             printerDesc      = $($printSpooler.getValue("description"))
  131.                             printerDriver    = $($printSpooler.getValue("DriverName"))
  132.                             printerLocation  = $($printSpooler.getValue("Location"))
  133.                             printerPortName  = $($printSpooler.getValue("PortName"))
  134.                             printerShareName = $($printSpooler.getValue("printShareName"))
  135.                             printerSpooling  = $($printSpooler.getValue("printSpooling"))
  136.                             printerPriority  = $($printSpooler.getValue("priority"))
  137.                             printerUNC       = $($printSpooler.getValue("uNCName"))
  138.                             printerDefault   = if ($split[3] -eq $DefaultPrinter){$true}
  139.                         }                      
  140.                         #Add the object to the array
  141.                         $pdetails
  142.                     }
  143.                 }
  144.                 else {
  145.                     #Well, something didn't work on this computer entry
  146.                     #This script could do with better error handling
  147.                     write-verbose "No Access or No Printers"
  148.                 }
  149.             }
  150.         }
  151.     }
  152. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement