Microsoft SCOM: Setzen des MaintenanceMode für einzelne Computer

Ein Thema, das mich kürzlich beschäftigt hat, ist das programmatische Setzen des MaintenanceMode im Microsoft System Center Operations Manager (SCOM) eines einzelnen Rechners.

1. Der erste Versuch diese Funktionalität mit Powershell zu skripten, habe ich auf Grund des unverhältnismäßigen Zeitaufwands und der Komplexität auf Eis gelegt gehabt.

2. Im zweiten Schritt habe ich einfach beim Setzen des MaintenanceMode in der OperationsShell die Datenbankaktivitäten ausgewertet. Ergebnis war, dass es eine spezielle Prozedur gibt, die den MaintenanceMode starten kann. Die Prozedur heißt [p_MaintenanceModeStart] und enthält vorwiegend die Parameter, die auch in der Operations Shell abgefragt werden. Einzige Schwierigkeit ist die Ermittlung der richtigen "BaseManagedEntityId". Um die Handhabung des MaintenanceMode zu vereinfachen, habe ich nachfolgende Prozedur erstellt, die den übergebenen Computername in den MaintenanceMode setzt.

 

IF  EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[ADMIN_SCOM_ComputerMaintenanceModeStart]'AND type in (N'P'N'PC'))
DROP PROCEDURE [dbo].[ADMIN_SCOM_ComputerMaintenanceModeStart]
GO

/*
    Autor:    Patrick Fiedler
    Ablauf:    1. Überprüfen, ob auf dem Server eine OperationsmanagerDatenbank existiert
            2. Sammeln der benötigten Informationen
            3. Setzen des MaintenanceMode
*/


create procedure [dbo].[ADMIN_SCOM_ComputerMaintenanceModeStart]
                            @ComputerName nvarchar(200),
                            @EndTime datetime,
                            @Comment nvarchar(200),
                            @StartTime datetime = null
as

set nocount on

declare @dbname nvarchar(250),
        @ScomDatabaseName nvarchar(250),
        @BaseManagedEntityId uniqueidentifier,
        @sql nvarchar(max)

-- Übersetzen der Datumswerte in UTC
set @EndTime = dateadd(minute, -datediff(mi,getutcdate(),getdate()), @EndTime)
if(@StartTime is not null)
    set @StartTime = dateadd(minute, -datediff(mi,getutcdate(),getdate()), @StartTime)

-- Check, ob ScomDB auf dem Server existiert
declare #cur cursor for
        select    d.name
        from    sys.databases d
        where    d.database_id>4

open #cur

fetch next from #cur into @dbname

while @@FETCH_STATUS=0
begin
    begin try
        exec('
        declare @Date datetime
        select top 1
                @Date=StartTime
        from    ['
+@dbname+'].dbo.MaintenanceMode m
        '
)
        
        set @ScomDatabaseName = @dbname
        print 'INFO: Die SCOM-Datenbank ist '+@ScomDatabaseName+'.'
        break
    end try
    begin catch
        print 'INFO: Die Datenbank '+@dbname+' ist keine SCOM-Datenbank.'
    end catch
    
    fetch next from #cur into @dbname
end

close #cur
deallocate #cur

-- Ermitteln der Entity-ID
set @sql='
SELECT    @BaseManagedEntityId=[BaseManagedEntityId]
FROM    ['
+@ScomDatabaseName+'].[dbo].[BaseManagedEntity]
where    BaseManagedEntityId=TopLevelHostEntityId
    and FullName like '
'Microsoft.Windows.Computer:%''
    and Name like '
''+@ComputerName+'%''
'

exec sp_executesql @sqlN'@BaseManagedEntityId uniqueidentifier output'@BaseManagedEntityId=@BaseManagedEntityId out

print 'BaseEntityId: '+cast(@BaseManagedEntityId as nvarchar(50))

if(@BaseManagedEntityId is null)
begin
    raiserror('ERROR: Es konnte keine BaseEntityId ermittelt werden.',16,1)
    return -1
end

set @sql='
use ['
+@ScomDatabaseName+']

declare @CurrentUser nvarchar(200)
set @CurrentUser = SUSER_NAME()

exec [p_MaintenanceModeStart]
            @BaseManagedEntityId=@BaseManagedEntityId,
            @ScheduledEndTime = @EndTime,
            @ReasonCode = 0, -- Unknown (Planned)
            @Comments = @Comment,
            @User = @CurrentUser, --
            @Recursive=1, -- all contained objects
            @StartTime=@StartTime -- now
'

exec sp_executesql    @sql
                    N'@BaseManagedEntityId uniqueidentifier, @EndTime datetime, @Comment nvarchar(200), @StartTime datetime'
                    @BaseManagedEntityId=@BaseManagedEntityId
                    @EndTime=@EndTime
                    @Comment=@Comment
                    @StartTime=@StartTime

Kommentar schreiben

Kommentare: 0