#------------------------------------------------------------------------- # CCRMON # # Beschreibung # Überwacht die Replikation im CCR Cluster per Performance Counter # # Laufzeitfehler werde nicht abgefangen und beenden das Skript. !!! # # Das Skript wird mit den Berechtigungen des angemeldeten Benutzers # ausgeführt. Die entsprechenden Berechtigungen sind sicher zu stellen # # (c)2004 Net at Work Netzwerksysteme GmbH # # Version 1.0 (24. Juni 2004) Frank Carius function Updatestatus(){ write-host "------- Start Update ---------" $form.Text = "Exchange 2007 CCR Statusmonitor - updating" $fsTable.clear() $Clusterserver = Get-Mailboxserver | where {$_.ClusteredStorageType -like "NonShared"} | Get-ClusteredMailboxServerStatus | foreach-object { $ccrname = $_.identity write-host CCR-Server: $ccrname $_.operationalmachines| %{ write-host OperationalMasters: $_ if ($_.contains("Active") -eq $false) { $servername = $_ write-host Passive: $servername $perfcat = new-object System.Diagnostics.PerformanceCounterCategory("MSExchange Replication",$servername) $perfcat.GetInstanceNames() | Where {$_ -ne "_Total"} | %{ $Instance = $_.tostring() write-host "CCR: $ccrname Passive: $servername Instance: $Instance " [string]$status = "" $dictinstancecounter = @{} $perfcat.GetCounters($Instance) | %{$dictinstancecounter.add($_.countername, $_.rawvalue)} if ($dictinstancecounter.item("Failed") -eq 1){$status += "Failed"} if ($dictinstancecounter.item("Initializing") -eq 1){$status += "Initializing"} if ($dictinstancecounter.item("Suspended") -eq 1){$status += "Suspended"} if ($dictinstancecounter.item("Copy Queue Exceeds Mount Threshold (CCR Only)") -eq 1){$status += "CCRExceed"} #$dictinstancecounter.item("CopyNotificationGenerationNumber") #$dictinstancecounter.item("CopyGenerationNumber") #$dictinstancecounter.item("InspectorGenerationNumber") #$dictinstancecounter.item("ReplayNotificationGenerationNumber") #$dictinstancecounter.item("ReplayGenerationNumber") #$dictinstancecounter.item("ReplayQueueLength") #$dictinstancecounter.item("ReplayBatchSize") #$dictinstancecounter.item("CopyQueueLength") #$dictinstancecounter.item("ReplayGenerationsComplete") #$dictinstancecounter.item("ReplayGenerationsRemaining") #$dictinstancecounter.item("ReplayGenerationsPerMinute") #$dictinstancecounter.item("TruncatedGenerationNumber") if ($status -eq ""){$status += "OK"} write-host "Status: " $status $fsTable.Rows.add($ccrname, $Instance, $Status, $dictinstancecounter.item("CopyQueueLength"), $dictinstancecounter.item("ReplayNotificationGenerationNumber")) } } } } $form.Text = "Exchange 2007 CCR Statusmonitor - Last Update: " + (get-date) write-host "------- Start Done ---------" } # Declare Form [System.Reflection.Assembly]::LoadWithPartialName("System.Drawing") | out-null [System.Reflection.Assembly]::LoadWithPartialName("System.windows.forms")| out-null $form = new-object System.Windows.Forms.form $form.Text = "Exchange 2007 CCR Statusmonitor" $form.Location = new-object System.Drawing.Size(10,30) $form.size = new-object System.Drawing.Size(1000,620) $form.autoscroll = $true #$form.topmost = $true $form.Add_Shown({$form.Activate()}) # UpdateNow Button $UpdateButton = new-object System.Windows.Forms.Button $UpdateButton.Location = new-object System.Drawing.Size(10,5) $UpdateButton.Size = new-object System.Drawing.Size(120,23) $UpdateButton.Text = "UpdateNow" $UpdateButton.visible = $True $UpdateButton.Add_Click({Updatestatus}) $form.Controls.Add($UpdateButton) # Declare Table $fsTable = New-Object System.Data.DataTable $fsTable.TableName = "CCRStatus" | out-null $fsTable.Columns.Add("CCRName",[string]) | out-null $fsTable.Columns.Add("Storagegroup",[string]) | out-null $fsTable.Columns.Add("Status",[string]) | out-null $fsTable.Columns.Add("CopyQueueLength",[int64]) | out-null $fsTable.Columns.Add("Highest Log",[int64]) | out-null #$Dataset = New-Object System.Data.DataSet #$Dataset.tables.add($fsTable) $Dataview = New-Object System.Data.DataView($fsTable) $Dataview.allowEdit = $false #$Dataview.allowAdd = $false $Dataview.allowDelete = $false # Add DataGrid View $dgDataGrid = new-object System.windows.forms.DataGridView $dgDataGrid.Location = new-object System.Drawing.Size(10,30) $dgDataGrid.size = new-object System.Drawing.Size(950,550) $dgDataGrid.autosize = $true $dgDataGrid.DataSource = $Dataview #$dgDataGrid.DataSource = $fsTable $form.Controls.Add($dgDataGrid) Updatestatus $form.ShowDialog()