/
Get-SCOMGroupMembers.ps1
95 lines (94 loc) · 4.6 KB
/
Get-SCOMGroupMembers.ps1
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
function Get-SCOMGroupMembers {
# (c)2017, Beyond Impact 2.0, LLC
# All rights reserved
# No claim to copyright is made for original U.S. Government Works.
# coded by: Cole McDonald
param (
[Microsoft.EnterpriseManagement.Monitoring.MonitoringObjectGroup]$GroupObject,
[System.Collections.ArrayList]$endMembers,
[string]$ManagementServer,
[string]$GroupName,
[switch]$verbose
)
$oldVerbose = $VerbosePreference
if ($verbose) {
$VerbosePreference = "continue"
}
Write-Verbose "`n!!! - Calling Parameters: $ManagementServer, $GroupName, $Verbose, $($GroupObject.DisplayName) - !!!"
write-verbose "testing for output array"
# Initialize output array if not sent
if (!$endMembers) {
[system.collections.arraylist]$endMembers = @()
}
# If the group object is empty and is sent in by name, get the group object from SCOM
write-verbose "Checking to see if we are using an object or need to fetch the object from SCOM"
if (!$GroupObject) {
write-verbose "- fetching object from SCOM"
if (!$ManagementServer -or !$GroupName) {
# Not enough inormation to contact SCOM
write-verbose "- Error gathering from SCOM, returning false"
$VerbosePreference = $oldVerbose
return $false
} else {
try {
write-verbose "- Gathering SCOM Data for $GroupName from $ManagementServer"
$GroupObject = Get-SCOMGroup -ComputerName $ManagementServer | Where-Object DisplayName -like "*$GroupName*"
} catch {
write-verbose "- Error gathering from SCOM, returning false"
$VerbosePreference = $oldVerbose
return $false
}
}
} else {
Write-Verbose "- $($GroupObject.displayName) received as an object from the caller"
}
# Get members of the object
write-verbose "Getting groups from object"
$GroupMembers = $GroupObject.GetChildMonitoringObjectGroups()
if ($GroupMembers.Count -gt 0) {
Write-Verbose "Looping through $($GroupMembers.count) Items"
foreach ($GroupMember in $GroupMembers) {
## Time to get recursive with it
$endMembers = Get-SCOMGroupMembers `
-ManagementServer $ManagementServer `
-GroupObject $GroupMember `
-GroupName $GroupMember.displayname `
-endMembers $endMembers `
| Where-Object { $PSItem.GetType().name -eq "MonitoringObject" }
Write-Verbose "Received $($endMembers.count) members from recursion"
}
}
# Here is where we add the objects the Group knows about to the $endMembers array
write-verbose "Getting class instances from group"
try {
$instances = $GroupObject `
| Get-SCOMClassInstance -ComputerName $ManagementServer `
| Where-Object { $PSItem.GetType().name -eq "MonitoringObject" }
Write-Verbose "- Found $($instances.count) Instances"
if ($instances.count -gt 0) {
Write-Verbose "*** Adding $($instances.count) from the Group $($GroupObject.displayname)"
$instances `
| foreach {
$endMembers.Add( $PSItem )
write-verbose "- - $($PSItem.displayname)"
}
}
} catch {
write-verbose "- Problem fetching instances... Incorrect management server sent? $ManagementServer"
$VerbosePreference = $oldVerbose
return $false
}
# Time to return our amazing results to the caller
Write-Verbose "Returning $($endMembers.count) to the caller"
if ($endMembers.Count -gt 0) {
# If not empty, Return Array
$VerbosePreference = $oldVerbose
# Strip out non-monitor object entries
return $endMembers
} else {
# Else return $False
$VerbosePreference = $oldVerbose
return $false
}
}