List the Printers in Print Cluster


New plans, new projects…

As a part of one of such plans I needed to list all the printers located at the Windows 2000 print cluster (I know, I know what you wanna say). Simple task, one line command can do this

Get-WMIObject win32_Printer -computerName PrintClusterName

Ooops… No printers listed. OK, this print cluster has several resource groups and several virtual names, one per department. Print cluster itself does not have any printer, all are installed within those resource groups

Get-WMIObject win32_Printer -computerName DepartamentalVirtualName

No printers listed.

Short investigation showed that Windows cluster 2000/2003 does not support WMI, so, no way to list the printers.

Good thing is that all those printers were published in Active Directory. This approach worked, not from the first run though.

Search for the PrintQueue object class

$ADRoot = [ADSI]””
$Searcher = New-Object System.Directoryservices.DirectorySearcher($ADRoot)
$Searcher.SearchRoot = $ADRoot
$Searcher.SearchScope = “subtree”
$Searcher.Filter = “(objectClass=PrintQueue)”
$ADPrinters = $Searcher.FindAll()

and be aware that all the object properties are collections and their names are case sensitive.For example, the driver name is available like this

$ADPrinter.Properties.drivername[0] 

That’s it. In addition the script pings IP printer addresses to filter out “forgotten” printers.

The entire script is provided below. It allows to get almost every bit of information we usually see in the Printer Properties window

#####################################################################
#### FUNCTIONS ####################################################
#####################################################################
FUNCTION Ping ($Device)
{
$Filter = “Address=” + [char]34 + $Device + [char]34
$PingStatus = Get-WMIObject Win32_PingStatus -Filter $Filter
return (($PingStatus -ne $Null) -and ($PingStatus.StatusCode -eq 0))
}

FUNCTION GetProperty ($PropertyName)
{
if ($ADPrinter.Properties.$PropertyName -eq $Null)
{return “”}
else
{
if ($ADPrinter.Properties.$PropertyName[0] -ne $Null)
{return $ADPrinter.Properties.$PropertyName[0].ToString()}
else
{return $ADPrinter.Properties.$PropertyName.ToString()}
}
}

#####################################################################
#####################################################################
#####################################################################

#####################################################################
#### INITIALIZING THE VARIABLES
#####################################################################
$InfoMessage = $Host.PrivateData.WarningForeGroundColor
$ErrorMessage = $Host.PrivateData.ErrorForeGroundColor
$ScriptPath = Split-Path $MyInvocation.MyCommand.Path

############################################################
$OutputFileName = (Read-Host “Enter the result file name”).Trim()
if ($OutputFileName -ne “”)
{
if ($OutputFileName.IndexOf(“:”) -eq -1)
{$OutputFileName = Join-Path $ScriptPath $OutputFileName}
if ((Test-Path $OutputFileName) -eq $True)
{
Write-Host ($OutputFileName + ” already exists”) -foregroundColor $ErrorMessage
return
}
Add-Content $OutputFileName -value “Virtual Cluster Name;Printer Name;Port Name;IP Address;Share Name;Driver Name;Creation Date;Location;Description;Active”
}

#####################################################################
#### MAIN LOOP
#####################################################################

$ADRoot = [ADSI]””
$Searcher = New-Object System.Directoryservices.DirectorySearcher($ADRoot)
$Searcher.SearchRoot = $ADRoot
$Searcher.SearchScope = “subtree”
$Searcher.Filter = “(objectClass=PrintQueue)”
$ADPrinters = $Searcher.FindAll()
Write-Host “Searching for the printers in Active Directory…”

ForEach ($ADPrinter in $ADPrinters)
{
Write-Host “.” -noNewLine

$Line = (GetProperty “shortservername”) + “;” + (GetProperty “printername”) + “;” + (GetProperty “portname”) + “;”

$Active = “Incorrect Port Name”
$IPAddress = “”
if ($ADPrinter.Properties.portname[0] -match “IP_(.*)”)
{
$IPAddress = $Matches[1]
if ((Ping $IPAddress))
{$Active = “YES”}
else
{$Active = “No”}
}

$Line = $Line + $IPAddress + “;” + (GetProperty “printsharename”) + “;” + (GetProperty “drivername”) + “;” + (GetProperty “whencreated”) + “;”
$Line = $Line + (GetProperty “location”) + “;” + (GetProperty “description”)
$Line = $Line + “;” + $Active
Add-Content $OutputFileName -value $Line
}
Write-Host

return

 

 

Advertisements

One Response to List the Printers in Print Cluster

  1. Hi. I really enjoyed my brief visit on your site and I’ll be sure to be back for more.
    Can I contact your through your email?

    Please email me back.

    Thanks!
    Kevin
    kevincollins1012 gmail.com

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s

%d bloggers like this: