Sunday, 10 February 2008

exchange 2007 diagnostic logging



Exchange 2007 diagnostic logging Powershell quick set winform script

One of the things that has been dropped from the GUI (Exchange

Management Console) in Exchange 2007 is the ability to set the

diagnostic level of different Exchange components. You now have to use

the Exchange Management Shell cmdlets get-eventloglevel and

set-eventloglevel. While functional if you have to enable a number of

different categories if you are trying to diagnose certain problems it

can be a little cumbersome to try and come up with a different

command-line for each one of the possible 150 components you might

want to change. Because I do tend to enable and disable these things a

fair bit when trying to fix a problems or diagnose why a piece a code

or script might not be working I thought I'd come up with a little

Powershell winform that would give me a GUI to do this with and allow

me to quickly set the diagnostic logging level on a number of

components with a few clicks of the mouse.

The script first starts by presenting a Winform to the user with one

combo box which is populated with all the names of the Exchange

servers in the Org populated from the Get-Exchangeserver cmdlet. When

a servername is selected the getdiagvalues function runs which uses

the get-eventloglevel cmdlet to fill a datagrid with all the current

log levels for all components on that server. To set a new log level

just select the row (or rows if you want to do multiple) and then the

new log level from the combo box at the top of the form and press the

apply button. When the apply button is pressed the UpdateLogLevel

function is run this function first checks to see if multiple row in

the grid where selected or just one row and then builds and executes

the set-eventloglevel commandlet. After this it reruns the

getdiagvalues function which repopulates the datagrid with the updated

values.

The script is designed to run from within the Exchange Management

shell it should work for remote servers okay but I haven't really

tested this and the set-eventloglevel doesn't take a server parameter

(where get-eventloglevel does).

I've put a download copy of the script here the script itself looks

like

[System.Reflection.Assembly]::LoadWithPartialName("System.Drawing")

[System.Reflection.Assembly]::LoadWithPartialName("System.windows.form

s")

Function getdiagvalues{

$daTable.clear()

$dgDataGrid.DataSource = $daTable

get-eventloglevel -Server $snServerNameDrop.SelectedItem.ToString() |

ForEach-Object{

$daTable.Rows.Add($_.Identity,$_.EventLevel)

}

$dgDataGrid.DataSource = $daTable

}

Function UpdateLogLevel{

if ($dgDataGrid.SelectedRows.Count -eq 0){

$idIdtoSet =

$dgDataGrid.Rows[$dgDataGrid.CurrentCell.RowIndex].Cells[0].Value

set-eventloglevel -Identity $idIdtoSet -Level $llLoglevelDrop.Text

}

else{

$msgbox = new-object -comobject wscript.shell

$lcLoopCount = 0

while ($lcLoopCount -le ($dgDataGrid.SelectedRows.Count-1)) {

#

[void]$msgbox.popup($dgDataGrid.SelectedRows[$lcLoopCount].Cells[0].Va

lue,0,"Cant Do MX lookup",1)

set-eventloglevel -Identity

$dgDataGrid.SelectedRows[$lcLoopCount].Cells[0].Value -Level

$llLoglevelDrop.SelectedItem

$lcLoopCount += 1}

}

getdiagvalues

}

$form = new-object System.Windows.Forms.form

$llLableloc = 50

$VlLoc = 50

$Dataset = New-Object System.Data.DataSet

$daTable = New-Object System.Data.DataTable

$daTable.TableName = "Diag"

$daTable.Columns.Add("Identity")

$daTable.Columns.Add("Current Setting")

# Add Server DropLable

$snServerNamelableBox = new-object System.Windows.Forms.Label

$snServerNamelableBox.Location = new-object System.Drawing.Size(10,20)

$snServerNamelableBox.size = new-object System.Drawing.Size(100,20)

$snServerNamelableBox.Text = "ServerName"

$form.Controls.Add($snServerNamelableBox)

# Add Server Drop Down

$snServerNameDrop = new-object System.Windows.Forms.ComboBox

$snServerNameDrop.Location = new-object System.Drawing.Size(130,20)

$snServerNameDrop.Size = new-object System.Drawing.Size(130,30)

get-exchangeserver |

ForEach-Object{$snServerNameDrop.Items.Add($_.Name)}

$snServerNameDrop.Add_SelectedValueChanged({getdiagvalues})

$form.Controls.Add($snServerNameDrop)

# Add New Log Level Drop Down

$llLoglevelDrop = new-object System.Windows.Forms.ComboBox

$llLoglevelDrop.Location = new-object System.Drawing.Size(350,20)

$llLoglevelDrop.Size = new-object System.Drawing.Size(70,30)

$llLoglevelDrop.Items.Add("Lowest")

$llLoglevelDrop.Items.Add("Low")

$llLoglevelDrop.Items.Add("Medium")

$llLoglevelDrop.Items.Add("High")

$llLoglevelDrop.Items.Add("Expert")

$form.Controls.Add($llLoglevelDrop)

# Add Apply Button

$exButton = new-object System.Windows.Forms.Button

$exButton.Location = new-object System.Drawing.Size(430,20)

$exButton.Size = new-object System.Drawing.Size(60,20)

$exButton.Text = "Apply"

$exButton.Add_Click({UpdateLogLevel})

$form.Controls.Add($exButton)

# New setting Group Box

$OfGbox = new-object System.Windows.Forms.GroupBox

$OfGbox.Location = new-object System.Drawing.Size(300,0)

$OfGbox.Size = new-object System.Drawing.Size(200,50)

$OfGbox.Text = "New Log Level Settings"

$form.Controls.Add($OfGbox)

# Add DataGrid View

$dgDataGrid = new-object System.windows.forms.DataGridView

$dgDataGrid.Location = new-object System.Drawing.Size(10,80)

$dgDataGrid.size = new-object System.Drawing.Size(500,500)

$dgDataGrid.AutoSizeColumnsMode = "AllCells"

$dgDataGrid.SelectionMode = "FullRowSelect"

$form.Controls.Add($dgDataGrid)

$form.Text = "Exchange 2007 Diagnostic Logging Form"

$form.size = new-object System.Drawing.Size(600,600)

$form.autoscroll = $true

$form.topmost = $true


No comments: