Detectie van verouderde clusterobjecten voor Nano Server ongedaan maken
Microsoft.Windows.Server.ClusterSharedVolumeMonitoring.VirtualServer.NanoServer.LegacyObjects.UnDiscovery.Task (Task)
Met deze taak wordt de detectie ongedaan gemaakt van exemplaren die horen bij verouderde clusterklassen die worden gehost op de virtuele clusterserver die het cluster op de Nano Server vertegenwoordigt.
Element properties: Member Modules:
Source Code: <Task ID="Microsoft.Windows.Server.ClusterSharedVolumeMonitoring.VirtualServer.NanoServer.LegacyObjects.UnDiscovery.Task" Accessibility="Public" Enabled="true" Target="SCLibrary!Microsoft.SystemCenter.AllManagementServersPool" Timeout="3600" Remotable="true">
<Category>Maintenance</Category>
<WriteAction ID="Undiscover" TypeID="Windows!Microsoft.Windows.PowerShellWriteAction" RunAs="Microsoft.Windows.Server.ClusterDisksMonitoring.RunAsUnDiscoveryProfile">
<ScriptName>UndiscoveryClusterNano.ps1</ScriptName>
<ScriptBody><Script> $objMomScriptAPI = New-Object -ComObject Mom.ScriptAPI -ErrorAction SilentlyContinue
#Event constants
$EVENT_TYPE_SUCCESS = 0
$EVENT_TYPE_ERROR = 1
$EVENT_TYPE_WARNING = 2
$EVENT_TYPE_INFORMATION = 4
$EVENT_ID_SUCCESS = 1001 #Use IDs in the range 1 - 1000
$EVENT_ID_SCRIPTERROR = 999 #Then you can use eventcreate.exe to test the MP
$SCRIPT_NAME = "UndiscoveryNanoObjectScript"
Function LogScriptEvent($EVENTID = $EVENT_ID_SUCCESS , $EVENTYPE=$EVENT_TYPE_INFORMATION , $Message)
{
if ($null -eq $objMomScriptAPI)
{
return
}
$objMomScriptAPI.LogScriptEvent($SCRIPT_NAME, $EVENTID, $EVENTYPE, $Message)
}
Function Get-OmManagementGroup([bool]$IsPowerShell = $true)
{
$ErrorActionPreference = "SilentlyContinue"
if($true -eq $IsPowerShell)
{
$mg = Get-SCOMManagementGroup -ComputerName localhost
}
else
{
$message = "Connecting to SCOM Management Group.."
Write-Host $message
$mg = New-Object Microsoft.EnterpriseManagement.ManagementGroup("localhost")
}
return $mg
}
Function Remove-OldNanoData([bool]$IsPowerShell = $true)
{
$ErrorActionPreference = "SilentlyContinue"
$error.Clear()
$mg = Get-OmManagementGroup -IsPowerShell $IsPowerShell
if ($null -eq $mg -or $error.Count -ne 0)
{
$message = "Cannot connect to SCOM Management Group. " + $error[0]
LogScriptEvent -EVENTID $EVENT_ID_SCRIPTERROR -EVENTYPE $EVENT_TYPE_ERROR -Message $message
Write-Host $message
return
}
$undiscovery = New-Object Microsoft.EnterpriseManagement.ConnectorFramework.IncrementalDiscoveryData
if ($null -eq $undiscovery -or $errror.Count -ne 0)
{
$message = "Cannot create undiscovery object. " + $error[0]
LogScriptEvent -EVENTID $EVENT_ID_SCRIPTERROR -EVENTYPE $EVENT_TYPE_ERROR -Message $message
Write-Host $message
return ;
}
$IsAdministrator = $false
$IsAdministrator = $mg.IsUserAdministrator()
if ($false -eq $IsAdministrator)
{
$message = "User doesn't have enough permission to perform undisovery old objects"
LogScriptEvent -EVENTID $EVENT_ID_SCRIPTERROR -EVENTYPE $EVENT_TYPE_ERROR -Message $message
Write-Host $message
return
}
$error.Clear()
$CSVSeedClassName = "Microsoft.Windows.Server.ClusterSharedVolumeMonitoring.Cluster"
$CSVClassName = "Microsoft.Windows.Server.ClusterSharedVolumeMonitoring.ClusterSharedVolume"
$ClusterDiskClassName = "Microsoft.Windows.Server.ClusterDisksMonitoring.ClusterDisk"
$NanoCSVSeedClassName = "Microsoft.Windows.Server.ClusterSharedVolumeMonitoring.Cluster.NewOS"
$NanoCSVClassName = "Microsoft.Windows.Server.ClusterSharedVolumeMonitoring.ClusterSharedVolume.NewOS"
$NanoClusterDiskClassName = "Microsoft.Windows.Server.ClusterDisksMonitoring.ClusterDisk.NewOS"
$message = "Finding duplicated Nano Server cluster objects.."
Write-Host $message
if ($true -eq $IsPowerShell)
{
$NanoSeeds = Get-ScomObjectsHashTable -ScomObjects (Get-ScomObject -ClassName $NanoCSVSeedClassName)
$NaNoCSV = Get-ScomObjectsHashTable -ScomObjects (Get-ScomObject -ClassName $NanoCSVClassName) -IsCSV $true
$NanoClusterDisks = Get-ScomObjectsHashTable -ScomObjects (Get-ScomObject -ClassName $NanoClusterDiskClassName)
$CSVobjects = Get-ScomObjectsHashTable -ScomObjects (Get-ScomObject -ClassName $CSVClassName) -IsCSV $true
$CsvSeeds = Get-ScomObjectsHashTable -ScomObjects (Get-ScomObject -ClassName $CSVSeedClassName )
$ClusterDisks = Get-ScomObjectsHashTable -ScomObjects (Get-ScomObject -ClassName $ClusterDiskClassName)
}
else
{
$NanoSeeds = Get-ScomObjectsHashTable -ScomObjects (Get-OmClassInstance -ClassName $NanoCSVSeedClassName -mg $mg)
$NaNoCSV = Get-ScomObjectsHashTable -ScomObjects (Get-OmClassInstance -ClassName $NanoCSVClassName -mg $mg) -IsCSV $true
$NanoClusterDisks = Get-ScomObjectsHashTable -ScomObjects (Get-OmClassInstance -ClassName $NanoClusterDiskClassName -mg $mg)
$CSVobjects = Get-ScomObjectsHashTable -ScomObjects (Get-OmClassInstance -ClassName $CSVClassName -mg $mg) -IsCSV $true
$CsvSeeds = Get-ScomObjectsHashTable -ScomObjects (Get-OmClassInstance -ClassName $CSVSeedClassName -mg $mg)
$ClusterDisks = Get-ScomObjectsHashTable -ScomObjects (Get-OmClassInstance -ClassName $ClusterDiskClassName -mg $mg)
}
$IsDuplicateFound = -Not ((0 -eq $NanoSeeds.Count -or $null -eq $NanoSeeds) -and (0 -eq $NaNoCSV.Count -or $null -eq $NaNoCSV ) -and (0 -eq $NanoClusterDisks.Count -or $null -eq $NanoClusterDisks))
$IsDuplicateFound = $IsDuplicateFound -and (-Not ((0 -eq $CSVobjects.Count -or $null -eq $CSVobjects) -and (0 -eq $CsvSeeds.Count -or $null -eq $CsvSeeds) -and (0 -eq $ClusterDisks.Count -or $null -eq $ClusterDisks) ) )
if ($true -eq $IsDuplicateFound)
{
$message = "Marking duplicated Nano Server cluster objects for removal.."
Write-Host $message
Start-UndiscoveryOldObjects -OldObjects $CsvSeeds -NanoObjects $NanoSeeds -undiscovery $undiscovery
Start-UndiscoveryOldObjects -OldObjects $ClusterDisks -NanoObjects $NanoClusterDisks -undiscovery $undiscovery
Start-UndiscoveryOldObjects -OldObjects $CSVobjects -NanoObjects $NaNoCSV -undiscovery $undiscovery
$error.Clear()
$message = "Removing duplicated Nano Server cluster objects.."
Write-Host $message
$undiscovery.Commit($mg)
if ($error.Count -ne 0)
{
$message = "Cannot commit undiscovery data. " + $error[0]
LogScriptEvent -EVENTID $EVENT_ID_SCRIPTERROR -EVENTYPE $EVENT_TYPE_ERROR -Message $message
Write-Host $message
return
}
else
{
$message = "Undiscovery finished successfully."
Write-Host $message
}
}
else
{
$message = "Duplicated Nano Server cluster objects were not found."
Write-Host $message
}
}
Function Start-UndiscoveryOldObjects([HashTable]$OldObjects,[HashTable]$NanoObjects,$undiscovery)
{
if ($null -eq $undiscovery)
{
return
}
if ($NanoObjects.Count -eq 0 -or $null -eq $NanoObjects)
{
$message = "Nano objects not found."
LogScriptEvent -Message $message
return
}
if ($OldObjects.Count -eq 0 -or $null -eq $OldObjects)
{
$message = "Legacy Nano object not found."
LogScriptEvent -Message $message
return
}
$ErrorActionPreference = "SilentlyContinue"
$error.Clear()
foreach ($NanoKey in $NanoObjects.Keys)
{
if ($true -eq $OldObjects.ContainsKey($NanoKey) -and $NanoKey.Length -gt 1)
{
$oldObject = $OldObjects[$NanoKey]
foreach($obj in $oldObject)
{
$key = $obj.Path + "-" + $obj.Name
$undiscovery.Remove($obj)
}
}
}
}
Function Get-ScomObject([string]$ClassName)
{
$ErrorActionPreference = "SilentlyContinue"
$error.Clear()
$result = $null
if ([string]::IsNullOrEmpty($ClassName))
{
return $result
}
$Class = Get-SCOMClass -Name $ClassName
if($null -ne $Class)
{
$result = Get-SCOMClassInstance -Class $Class
}
return $result
}
Function Get-ScomObjectsHashTable($ScomObjects,[bool]$IsCSV =$false)
{
$ErrorActionPreference = "SilentlyContinue"
$error.Clear()
$hashtbl = @{}
if ($null -eq $ScomObjects)
{
return $hashtbl
}
if($false -eq $IsCSV)
{
foreach ($obj in $ScomObjects)
{
$key = $obj.Path + "-" + $obj.Name
$hashtbl[$key] = $obj
}
}
else
{
foreach ($obj in $ScomObjects)
{
$key = $obj.Path
if ($false -eq $hashtbl.ContainsKey($key))
{
$objs = @()
}
else
{
$objs = $hashtbl[$key]
}
$objs += $obj
$hashtbl[$key] = $objs
}
}
return $hashtbl
}
Function Load-SCOModule
{
$ErrorActionPreference = "SilentlyContinue"
$result = $true
$omModule = get-module -name "OperationsManager"
$error.Clear()
if ($omModule -eq $null)
{
$SCOMPowerShellKey = "HKLM:\SOFTWARE\Microsoft\System Center Operations Manager\12\Setup\Powershell\V2"
$SCOMModulePath = (Get-ItemProperty $SCOMPowerShellKey).InstallDirectory
if ($true -eq [string]::IsNullOrEmpty($SCOMModulePath))
{
return $false
}
$SCOMModulePath = Join-Path $SCOMModulePath "OperationsManager"
$error.Clear()
Import-module $SCOMModulePath | Out-Null
$result = 0 -eq $error.Count
}
return $result
}
Function Get-OmClass ($mg,[string]$ClassName)
{
if ($null -eq $mg -or $true -eq [string]::IsNullOrEmpty($ClassName))
{
return $null
}
$ErrorActionPreference = "SilentlyContinue"
$error.Clear()
$scriteria = "Name='$ClassName'"
$Criteria = New-Object Microsoft.EnterpriseManagement.Configuration.MonitoringClassCriteria($scriteria)
if (0 -ne $error.Count)
{
return $null
}
$EntityTypes = $mg.EntityTypes
if($null -eq $EntityTypes)
{
return $null
}
$mtypes = $mg.EntityTypes.GetClasses($Criteria)
if (0 -ne $error.Count)
{
return $null
}
$result = $mtypes[0]
return $result
}
Function Get-OmClassInstance($mg,[string]$ClassName)
{
$Class = Get-OmClass -mg $mg -ClassName $ClassName
if ($null -eq $Class)
{
return $null
}
$ErrorActionPreference = "SilentlyContinue"
$error.Clear()
$query = "Id like '%'"
$criteria = New-Object Microsoft.EnterpriseManagement.Monitoring.MonitoringObjectCriteria($query,$class)
if (0 -ne $error.Count)
{
return $null
}
$result = $mg.GetMonitoringObjects($criteria)
return $result
}
Function Load-SCOMAssemblies()
{
$ErrorActionPreference = "Stop"
$result = $true
$OpsMgrMainLib = "Microsoft.EnterpriseManagement.OperationsManager,Version=7.0.5000.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"
$ScomDiscoverySdk = "Microsoft.EnterpriseManagement.Core,Version=7.0.5000.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"
try
{
[Reflection.Assembly]::Load($OpsMgrMainLib)
[Reflection.Assembly]::Load($ScomDiscoverySdk)
}
catch
{
$result = $false
}
return $result
}
Function Main
{
$message = "Starting undiscovery of duplicated Nano Server Cluster Object.. "
LogScriptEvent -Message $message
Write-Host $message
$result = Load-SCOModule
if ($true -eq $result)
{
$message = "Using PowerShell Undiscovery Method"
LogScriptEvent -Message $message
$error.Clear()
$message = "Connecting to SCOM Management Group.."
Write-Host $message
New-SCManagementGroupConnection -ComputerName "localhost"
if (0 -eq $error.Count)
{
Remove-OldNanoData
}
else
{
$message = "Cannot connect to Management Group. " + $error[0]
LogScriptEvent -EVENTID $EVENT_ID_SCRIPTERROR -EVENTYPE $EVENT_TYPE_ERROR -Message $message
Write-Host $message
}
}
else
{
$message ="Loading SCOM SDK Libraries.."
Write-Host $message
$result = Load-SCOMAssemblies
if ($true -eq $result)
{
Remove-OldNanoData -IsPowerShell $false
}
else
{
$message = "Cannot load SCOM SDK Libraries. Undiscoveries failed."
Write-Host $message
}
}
}
Main</Script> </ScriptBody>
<TimeoutSeconds>3600</TimeoutSeconds>
</WriteAction>
</Task>