Snippets

Samuel Tegenfeldt (atea) Discover-ADGroupMembers.ps1

Created by stegenfeldt atWork
param(
    [string] $configPath = "C:\Xylem\ADGroups\config.xml"
)

$omApi = New-Object -ComObject 'MOM.ScriptAPI'
$omDiscoveryData = $omApi.CreateDiscoveryData(0, '$MPElement$', '$Target/Id$')
$scriptName = "Discover-ADGroupMembers.ps1"

$testResult = Test-Path -Path $configPath
if ($testResult) {
    [xml] $configXml = Get-Content $configPath

	## Get windows servers in MG to avoid issue #1
	# https://bitbucket.org/stegenfeldt/xylem.ad.groups/issue/1/discovery-fails-when-member-of-ad-group-is
	$windowsServerClass = Get-SCOMClass -Name "Microsoft.Windows.Computer"
	$windowsServers = Get-SCOMClassInstance -Class $windowsServerClass
	# I am aware that this will get virtual (cluster) nodes as well, and that's intentional.
	##

    foreach ($adGroupXML in $configXML.ADGroups.ADGroup) {
        [string]$adGroupDN = $adGroupXML.GroupDN
        [string]$adGroupDisplayName = $adGroupXML.DisplayName

        $omApi.LogScriptEvent($scriptName,6661,0,"Parsing AD-group $adGroupDN")

        $omGroupInstance = $omDiscoveryData.CreateClassInstance('$MPElement[Name="Xylem.AD.Groups.RoleBasedServerGroup"]$')
        $omGroupInstance.AddProperty('$MPElement[Name="Xylem.AD.Groups.RoleBasedServerGroup"]/GroupDN$', $adGroupDN)
        $omGroupInstance.AddProperty('$MPElement[Name="System!System.Entity"]/DisplayName$', $adGroupDisplayName)
        $omDiscoveryData.AddInstance($omGroupInstance)

        $adsiGroup = [adsi]"LDAP://$adGroupDN"
        foreach ($adsiGroupMemberDN in $adsiGroup.member.Value) {
            $adsiGroupMember = [adsi]"LDAP://$adsiGroupMemberDN"
            if (($adsiGroupMember.objectClass -eq "computer") -AND ($windowsServers.Name -contains $adsiGroupMember.dNSHostName)) {
                [string]$computerDNSHostName = $adsiGroupMember.dNSHostName
				# $omApi.LogScriptEvent($scriptName,6661,0,"Found $computerDNSHostName at $adsiGroupMemberDN")
                $omComputerInstance = $omDiscoveryData.CreateClassInstance('$MPElement[Name="Windows!Microsoft.Windows.Computer"]$')
                $omComputerInstance.AddProperty('$MPElement[Name="Windows!Microsoft.Windows.Computer"]/PrincipalName$',$computerDNSHostName)

                $omGroupContainment = $omDiscoveryData.CreateRelationshipInstance('$MPElement[Name="MSIL!Microsoft.SystemCenter.InstanceGroupContainsEntities"]$')
                
                $omGroupContainment.Source = $omGroupInstance
                $omGroupContainment.Target = $omComputerInstance
                $omDiscoveryData.AddInstance($omGroupContainment)
            }
        }
    }
}
$omDiscoveryData

Comments (0)

HTTPS SSH

You can clone a snippet to your computer for local editing. Learn more.