Montag, 21. Juli 2014

Mehrstufige Eskalation von Incidents

Der produktive Einsatz des Service Managers schreitet vorran und es fällt auf, das mache Incidents leider nach geraumer Zeit noch nicht bearbeitet wurden.



Um dem vorzubeugen wollten wir eine Eskalation der Tickets einbauen, die unsere Mitarbeiter über das unbearbeitete Ticket informiert. Da der Service Manager leider über keine Eskalation in unserem Sinne verfügt, strickten wir uns eine mit Hilfe der SMLets.



Zunächst erstellen wir eine Funktion zum Auslesen der Mailvorlagen, die im Falle einer Eskalation an den PrimaryOwner versandt werden.In unserem Fall handelt es sich bei den PrimaryOwner um eine AD-Gruppe, in der alle Mitglieder der SupportGroup enthalten sind.

function get-MailContent ($templatename, $IR)
{
[String]$MailContent = [System.IO.File]::ReadAllText( "C:\Skripts\Mails\" + $templatename)
[string]$MailContent = $MailContent.Replace("#ID", $IR.Id)
[string]$MailContent = $MailContent.Replace("#TITLE", $IR.Title)
return $MailContent | Out-String;
echo "--get-MailContent geladen"
}



Als nächstes importieren wir die SMLets und binden die benötigten Klassen ein.

Import-Module smlets;

#benötigte Klassen
$classAnLog = Get-SCSMClass System.WorkItem.TroubleTicket.AnalystCommentLog;
$ClassIncident = Get-SCSMClass System.WorkItem.Incident$;
$AssignedToUserClass = Get-SCSMRelationshipClass System.WorkItemAssignedToUser;
$PrimaryOwnerClass = Get-SCSMRelationshipClass System.WorkItem.IncidentPrimaryOwner$



Hier muss die ID gewechselt werden. Es werden aussließlich die Incidents eskalaiert, die sich in diesen Status befinden.

#StatusID´s der Status New und InfoRecived
$IDNew = (Get-SCSMEnumeration -Name Enum.cfbcf3e99aaa4609a876f29bb138957a).id;
$IDInfoRecived = (Get-SCSMEnumeration -Name Enum.957065f4277a484794833985748bdc8a).id;


Wir laden uns die Incidents, die sich im Status "New" oder "InfoRecived" befinden.

    #Incidents im Status New und InfoRecived auslesen
    $IncidentswhichCouldEscalate = Get-SCSMObject -Class $ClassIncident -Filter "Status -eq $IDNew";
    $IncidentswhichCouldEscalate = $IncidentswhichCouldEscalate + (Get-SCSMObject -Class $ClassIncident -Filter "Status -eq $IDInfoRecived");




Nun arbeiten wir alle zuvor gefiltererten Incidents ab.

ForEach($incident in $IncidentswhichCouldEscalate)
    {
        #AssignedUser auslesen
        $User = Get-SCSMRelatedObject -SMObject $incident -Relationship $AssignedToUserClass;

        #Nur wenn kein User zugewiesen ist
        if(!$user)
        {
            #Nur, wenn der Incident noch nicht eskaliert ist
            if($incident.Escalated -eq $false)
            {               

                #Der Incident wurde innerhalb der letzten 4 Stunden nicht bearbeitet
                if($incident.LastModified -lt (Get-Date).AddHours(-4))
                {
                    #Eskalation auf true setzen und Eskalation I im Actionlog eintragen
                    $incident | Set-SCSMObject -Property Escalated -Value true;
                    $incident | Set-SCSMIncident -Comment "Eskalation I";
               
                    #PrimaryOwner raussuchen
                    $PrOwner = Get-SCSMRelatedObject -SMObject $incident -Relationship $PrimaryOwnerClass
               
                    [String]$Content = get-MailContent("EskalationI.txt") ($incident)
                   
                    #Mail an PrimaryOwnerGroup

                    Send-MailMessage -SmtpServer "smtp.domain.de" -To ($PrOwner.UserName + "@domain.de") -From "Helpdesk " -Subject ("Eskalation " + $incident.Id) -Body $Content -Encoding ([System.Text.Encoding]::UTF8) -BodyAsHtml

                }
            }
            #Nur, wenn der Incident bereits eskaliert ist
            elseif($incident.Escalated -eq $true)
            {
               
                #Für jedes Comment das zum Incident gehört durchführen

                #Objekt der Klasse SCSMIncident des zZ zu bearbeitenden Incidents erstellen
                $incdentDefInfos = Get-SCSMIncident -ID $incident.Id

                #Bearbeiterkommentare des Incidents auslesen und nach Eintragungsdatum sortieren
                $CommentList = $incdentDefInfos.AppliesToTroubleTicket | where {$_.Classname -eq "System.WorkItem.TroubleTicket.AnalystCommentLog" } | sort -Property EnteredDate
           
                #Kommentarliste von hinten durcharbeiten
                for($CountComments = $CommentList.Length; $CountComments -ge 0; $CountComments--)
                {  
                    #Kommentar von ServiceAccount erstellt
                    if($CommentList.EnteredBy[$CountComments] -eq 'domain\ServiceAccount')
                    {

                        #Ist das zuletzt erstellte Kommentar von ServiceAccount "Eskalation I", so darf der Incident ein zweites mal eskalieren
                        if($CommentList.Comment[$CountComments] -eq 'Eskalation I')
                        {   

                            #Eskalation2 //Wenn Eskal I zutrifft und seither 4h vergangen sind                       
                            if($CommentList.EnteredDate[$CountComments] -lt (Get-Date).AddHours(-4))
                            {                   
                                #Eskalation auf true setzen und Eskalation I im Actionlog eintragen
                                $incident | Set-SCSMObject -Property Eskalated -Value true
                                $incident | Set-SCSMIncident -Comment "Eskalation II" 
                           
                              
                                #PrimaryOwner raussuchen
                                $PrOwner = Get-SCSMRelatedObject -SMObject $incident -Relationship $PrimaryOwnerClass

                                [String]$Content = get-MailContent("EskalationII.txt") ($incident)

                                #Mail an PrimaryOwner Group

                                Send-MailMessage -SmtpServer "smtp.domain.de" -To ($PrOwner.UserName + "@domain.de") -From "Helpdesk " -Subject ("Eskalation Stufe 2  " + $incident.Id) -Body $Content -Encoding ([System.Text.Encoding]::UTF8) -BodyAsHtml

                            }
                            break;                       
                        }
                        #Kommt allerigns zuerst ein Kommentar mit "Eskalation II", so ist der Incident bereits 2* eskaliert und es muss abgebrochen werden
                        elseif($CommentList.Comment[$CountComments] -eq 'Eskalation II')
                        {
                            break;
                        }
                    }
                }
            }
        }
    }