Print Services 2008 Printer Queue Discovery

Microsoft.Windows.Server.2008.PrintServer.Printer.Discovery (Discovery)

Discovers all Print Services 2008 Printer Queues

Knowledge Base article:

Summary

Discovers all Print Services 2008 Printer Queues

Element properties:

TargetMicrosoft.Windows.Server.2008.PrintServerRole
EnabledTrue
Frequency14400
RemotableFalse

Object Discovery Details:

Discovered Classes and their attribuets:

Member Modules:

ID Module Type TypeId RunAs 
DS DataSource Microsoft.Windows.TimedPowerShell.DiscoveryProvider Default

Source Code:

<Discovery ID="Microsoft.Windows.Server.2008.PrintServer.Printer.Discovery" Enabled="true" Target="Microsoft.Windows.Server.2008.PrintServerRole" ConfirmDelivery="false" Remotable="false" Priority="Normal">
<Category>Discovery</Category>
<DiscoveryTypes>
<DiscoveryClass TypeID="Microsoft.Windows.Server.2008.PrintServer.Printer">
<Property PropertyID="Attributes"/>
<Property PropertyID="Caption"/>
<Property PropertyID="DeviceID"/>
<Property PropertyID="Name"/>
<Property PropertyID="Path"/>
<Property PropertyID="PortName"/>
<Property PropertyID="Shared"/>
<Property PropertyID="ShareName"/>
<Property PropertyID="SpoolEnabled"/>
<Property PropertyID="Version"/>
<Property PropertyID="Clustered"/>
<Property TypeID="System!System.Entity" PropertyID="DisplayName"/>
</DiscoveryClass>
</DiscoveryTypes>
<DataSource ID="DS" TypeID="Windows!Microsoft.Windows.TimedPowerShell.DiscoveryProvider">
<IntervalSeconds>14400</IntervalSeconds>
<SyncTime/>
<ScriptName>Printer.ps1</ScriptName>
<ScriptBody><Script>param($sourceId,$managedEntityId,$computerName,$computerNetbiosName)

$api = new-object -comObject 'MOM.ScriptAPI'
$discoveryData = $api.CreateDiscoveryData(0, $SourceId, $ManagedEntityId)

#discovers non-clustered printers
$result = Get-WmiObject -class "win32_printer" | Where { $_.systemName -eq $computerNetbiosName }
foreach ($printer in $result)
{
$var = $printer| Select name, attributes, caption, deviceid, portname, shared, sharename

$instance = $discoveryData.CreateClassInstance("$MPElement[Name='Microsoft.Windows.Server.2008.PrintServer.Printer']$")
$instance.AddProperty("$MPElement[Name='Windows!Microsoft.Windows.Computer']/PrincipalName$", $computerName)
$fullname = $var.name + '(' + $computerNetbiosName + ')'
$instance.AddProperty("$MPElement[Name='Microsoft.Windows.Server.2008.PrintServer.Printer']/Name$", $fullname)

if ($var.attributes) { $instance.AddProperty("$MPElement[Name='Microsoft.Windows.Server.2008.PrintServer.Printer']/Attributes$", $var.attributes) }
if ($var.caption) { $instance.AddProperty("$MPElement[Name='Microsoft.Windows.Server.2008.PrintServer.Printer']/Caption$", $var.caption) }
if ($var.deviceid) { $instance.AddProperty("$MPElement[Name='Microsoft.Windows.Server.2008.PrintServer.Printer']/DeviceID$", $var.deviceid) }
if ($var.portname) { $instance.AddProperty("$MPElement[Name='Microsoft.Windows.Server.2008.PrintServer.Printer']/PortName$", $var.portname) }
$instance.AddProperty("$MPElement[Name='Microsoft.Windows.Server.2008.PrintServer.Printer']/Shared$", $var.shared)
if ($var.sharename) { $instance.AddProperty("$MPElement[Name='Microsoft.Windows.Server.2008.PrintServer.Printer']/ShareName$", $var.sharename) }
$instance.AddProperty("$MPElement[Name='Microsoft.Windows.Server.2008.PrintServer.Printer']/Clustered$", $false)
$instance.AddProperty("$MPElement[Name='System!System.Entity']/DisplayName$", $fullname)

$discoveryData.AddInstance($instance)
}

#discovers clustered printers
$spoolers = @()
$printvalues = @()
$resources = Get-ChildItem HKLM:\Cluster\Resources
foreach ($resource in $resources){
$values = Get-ItemProperty $resource.pspath
foreach ($value in $values){
if ($value.Type -ne $Null -and $value.Type.tolower() -eq "print spooler"){
[string]$path = $resource.pspath + "\Parameters\Printers"
$spoolers += $path
}
}
}

foreach ($spooler in $spoolers){
$printers = Get-ChildItem $spooler
foreach ($printer in $printers){
$var = Get-ItemProperty $printer.pspath

$instance = $discoveryData.CreateClassInstance("$MPElement[Name='Microsoft.Windows.Server.2008.PrintServer.Printer']$")
$instance.AddProperty("$MPElement[Name='Windows!Microsoft.Windows.Computer']/PrincipalName$", $computerName)
$fullname = $var.name + '(' + $computerNetbiosName + ')'
$instance.AddProperty("$MPElement[Name='Microsoft.Windows.Server.2008.PrintServer.Printer']/Name$", $fullname)

if ($var.Attributes) { $instance.AddProperty("$MPElement[Name='Microsoft.Windows.Server.2008.PrintServer.Printer']/Attributes$", $var.attributes) }
if ($var.name)
{
$instance.AddProperty("$MPElement[Name='Microsoft.Windows.Server.2008.PrintServer.Printer']/Caption$", $var.name)
$spoolerpath = Get-ItemProperty ($var.pspath + "\DsSpooler")
$instance.AddProperty("$MPElement[Name='Microsoft.Windows.Server.2008.PrintServer.Printer']/DeviceID$", "\\" + $spoolerpath.shortServerName + '\' + $var.name)
}
if ($var.port) { $instance.AddProperty("$MPElement[Name='Microsoft.Windows.Server.2008.PrintServer.Printer']/PortName$", $var.port) }
if ($var."Share Name")
{
$instance.AddProperty("$MPElement[Name='Microsoft.Windows.Server.2008.PrintServer.Printer']/Shared$", $true)
instance.AddProperty("$MPElement[Name='Microsoft.Windows.Server.2008.PrintServer.Printer']/ShareName$", $var."Share Name")
}
else
{
$instance.AddProperty("$MPElement[Name='Microsoft.Windows.Server.2008.PrintServer.Printer']/Shared$", $false)
}
$instance.AddProperty("$MPElement[Name='Microsoft.Windows.Server.2008.PrintServer.Printer']/Clustered$", $true)
$instance.AddProperty("$MPElement[Name='System!System.Entity']/DisplayName$", $fullname)

$discoveryData.AddInstance($instance)
}
}

$discoveryData
</Script></ScriptBody>
<Parameters>
<Parameter>
<Name>sourceID</Name>
<Value>$MPElement$</Value>
</Parameter>
<Parameter>
<Name>managedEntityID</Name>
<Value>$Target/Id$</Value>
</Parameter>
<Parameter>
<Name>computerName</Name>
<Value>$Target/Host/Property[Type="Windows!Microsoft.Windows.Computer"]/PrincipalName$</Value>
</Parameter>
<Parameter>
<Name>computerNetbiosName</Name>
<Value>$Target/Host/Property[Type="Windows!Microsoft.Windows.Computer"]/NetbiosComputerName$</Value>
</Parameter>
</Parameters>
<TimeoutSeconds>300</TimeoutSeconds>
</DataSource>
</Discovery>