Service Comparison GUI Tool does comparison of all the services of any given two servers. The output is a grid view and sorting can be done on a required columns. The result is a combination of unique services and the same services are of different state.
Copy and paste the below code on Powershell-ISE for better execution.
Tool Details :The layout details are as follows
Download the code - ServiceComparisonTool
Code-
function Compare-Service { function OnApplicationLoad { return $true } function OnApplicationExit { #Note: This function runs after the form is closed #TODO: Add custom code to clean up and unload snapins when the application exits } #endregion Application Functions #---------------------------------------------- # Generated Form Function #---------------------------------------------- function Call-SystemInformation_pff { #---------------------------------------------- #region Import the Assemblies #---------------------------------------------- [void][reflection.assembly]::Load("System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089") [void][reflection.assembly]::Load("System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a") [void][reflection.assembly]::Load("mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089") [void][Reflection.Assembly]::LoadWithPartialName("System.Windows.Forms") [void][Reflection.Assembly]::LoadWithPartialName("System.Windows.Forms.DataVisualization") #get-pssnapin -Registered -ErrorAction silentlycontinue #endregion Import Assemblies #---------------------------------------------- #region Generated Form Objects #---------------------------------------------- [System.Windows.Forms.Application]::EnableVisualStyles() $form1 = New-Object System.Windows.Forms.Form $btnRefresh = New-Object System.Windows.Forms.Button $btngetdata=New-Object System.Windows.Forms.Button $rtbPerfData = New-Object System.Windows.Forms.RichTextBox #$pictureBox1 = New-Object System.Windows.Forms.PictureBox $lblServicePack = New-Object System.Windows.Forms.Label $lblDBName= New-Object System.Windows.Forms.Label $lblOS = New-Object System.Windows.Forms.Label $lblExpire = New-Object System.Windows.Forms.Label $statusBar1 = New-Object System.Windows.Forms.StatusBar $btnClose = New-Object System.Windows.Forms.Button #$comboServers = New-Object System.Windows.Forms.ComboBox $InitialFormWindowState = New-Object System.Windows.Forms.FormWindowState $txtComputerName1 = New-Object System.Windows.Forms.TextBox $txtComputerName2 = New-Object System.Windows.Forms.TextBox $dataGrid1 = New-Object System.Windows.Forms.DataGrid $Chart = New-object System.Windows.Forms.DataVisualization.Charting.Chart #$dataGrid1 = new-object System.windows.forms.DataGridView #endregion Generated Form Objects #---------------------------------------------- # User Generated Script #---------------------------------------------- Function Compare-Service { param( [Parameter(Mandatory=$true)] [string]$Computer1, [Parameter(Mandatory=$true)] [string]$Computer2 ) $Object =@() try { $ServicesOnComputer1 = Get-WMIObject -ComputerName $Computer1 -Class Win32_service -ErrorAction Stop } Catch [Exception] { [System.Windows.Forms.MessageBox]::Show("The $Computer1 host entered does not exist or cannot be contacted. Please try again!!!!"); } try { $ServicesOnComputer2 = Get-WMIObject -ComputerName $Computer2 -Class Win32_service -ErrorAction Stop } Catch [Exception] { [System.Windows.Forms.MessageBox]::Show("The $Computer2 host entered does not exist or cannot be contacted. Please try again"); } $d=Compare-Object -ReferenceObject $ServicesOnComputer1 -DifferenceObject $ServicesOnComputer2 -Property Name, StartMode, State, Status -PassThru ` | Sort-Object DisplayName, SystemName | Select-Object SystemName, DisplayName, StartMode, State, Status foreach($Ser in $D) { $SystemName = $Ser.SystemName $DisplayName = $Ser.DisplayName $StartMode =$Ser.StartMode $State = $Ser.State $Status =$Ser.Status $Object += New-Object PSObject -Property @{Name= $SystemName.ToUpper();DisplayName= $DisplayName;StartMode=$StartMode;State=$State;Status=$Status;} } $dt = new-Object Data.datatable $First = $true foreach ($item in $Object){ $DR = $DT.NewRow() $Item.PsObject.get_properties() | foreach { If ($first) { $Col = new-object Data.DataColumn $Col.ColumnName = $_.Name.ToString() $DT.Columns.Add($Col) } if ($_.value -eq $null) { $DR.Item($_.Name) = "[empty]" } ElseIf ($_.IsArray) { $DR.Item($_.Name) =[string]::Join($_.value ,";") } Else { $DR.Item($_.Name) = $_.value } } $DT.Rows.Add($DR) # $array.AddRange($DR) $First = $false } $dataGrid1.DataSource = $dt } $Close={ $form1.close() } $GetData={ if((Test-Connection -ComputerName $txtComputerName1.text -Count 1 -ea 0) -and (Test-Connection -ComputerName $txtComputerName2.text -Count 1 -ea 0)) { $statusBar1.text="Getting the Service Related Information...Please wait" Compare-Service -Computer1 $txtComputerName1.text -Computer2 $txtComputerName2.text } ELSE { [void][System.Windows.Forms.MessageBox]::Show("could not connect to a given computer, Please check") $statusBar1.text="Computer Name is Invalid.please check" } # $rtbPerfData.text=$data.Trim() $txtComputerName1.usewaitcursor=$False $errorActionPreference="Continue" $statusBar1.Text="Ready" } # --End User Generated Script-- #---------------------------------------------- # Generated Events #---------------------------------------------- $Form_StateCorrection_Load= { #Correct the initial state of the form to prevent the .Net maximized form issue $form1.WindowState = $InitialFormWindowState } #---------------------------------------------- #region Generated Form Code #---------------------------------------------- # # form1 # $form1.Controls.Add($btnRefresh) #$form1.Controls.Add($rtbPerfData) #$form1.Controls.Add($pictureBox1) $form1.Controls.Add($lblServicePack) $form1.Controls.Add($lblOS) $form1.Controls.Add($lblDBName) $form1.Controls.Add($statusBar1) $form1.Controls.Add($btnClose) $form1.Controls.Add($txtComputerName1) $Form1.controls.add($Chart) $Form1.controls.add($txtComputerName2) $Form1.controls.add($lblExpire) $form1.ClientSize = New-Object System.Drawing.Size(900,600) $form1.DataBindings.DefaultDataSourceUpdateMode = [System.Windows.Forms.DataSourceUpdateMode]::OnValidation #$form1.FormBorderStyle = [System.Windows.Forms.FormBorderStyle]::SizableToolWindow $form1.Name = "form1" $form1.Text = "Service Comparison Tool " $form1.add_Load($PopulateList) # create chart object $System_Drawing_Size = New-Object System.Drawing.Size $System_Drawing_Size.Width = 850 $System_Drawing_Size.Height = 450 $dataGrid1.Size = $System_Drawing_Size $dataGrid1.DataBindings.DefaultDataSourceUpdateMode = 0 $dataGrid1.HeaderForeColor = [System.Drawing.Color]::FromArgb(255,0,0,0) $dataGrid1.Name = "dataGrid1" $dataGrid1.DataMember = "" $dataGrid1.TabIndex = 0 $System_Drawing_Point = New-Object System.Drawing.Point $System_Drawing_Point.X =13 $System_Drawing_Point.Y = 72 $dataGrid1.Location = $System_Drawing_Point $Chart.visible=$FALSE $form1.Controls.Add($dataGrid1) $dataGrid1.CaptionText='Service Comparison' # # btnRefresh # $btnRefresh.DataBindings.DefaultDataSourceUpdateMode = [System.Windows.Forms.DataSourceUpdateMode]::OnValidation $btnRefresh.Enabled = $TRUE $btnRefresh.Location = New-Object System.Drawing.Point(420,35) $btnRefresh.Name = "btnRefresh" $btnRefresh.Size = New-Object System.Drawing.Size(72,20) $btnRefresh.TabIndex = 7 $btnRefresh.Text = "CmpSvc" $btnRefresh.UseVisualStyleBackColor = $True $btnRefresh.add_Click($GetData) # # # btnClose # $btnClose.DataBindings.DefaultDataSourceUpdateMode = [System.Windows.Forms.DataSourceUpdateMode]::OnValidation $btngetdata.Enabled = $TRUE $btnClose.Location = New-Object System.Drawing.Point(500,35) $btnClose.Name = "btnClose" $btnClose.Size = New-Object System.Drawing.Size(72,20) $btnClose.TabIndex = 3 $btnClose.Text = "Close" $btnClose.UseVisualStyleBackColor = $True $btnClose.add_Click($Close) # # lblDBName # $lblDBName.DataBindings.DefaultDataSourceUpdateMode = [System.Windows.Forms.DataSourceUpdateMode]::OnValidation $lblDBName.Font = New-Object System.Drawing.Font("Lucida Console",8.25,1,3,1) $lblDBName.Location = New-Object System.Drawing.Point(13,10) $lblDBName.Name = "lblDBName" $lblDBName.Size = New-Object System.Drawing.Size(178,23) $lblDBName.TabIndex = 0 $lblDBName.Text = "Enter the Name:Server 1 " $lblDBName.Visible = $TRUE # #$txtComputerName1.text #txtComputerName1 $txtComputerName1.DataBindings.DefaultDataSourceUpdateMode = [System.Windows.Forms.DataSourceUpdateMode]::OnValidation $txtComputerName1.Location = New-Object System.Drawing.Point(200, 10) $txtComputerName1.Name = "txtComputerName1" $txtComputerName1.TabIndex = 1 $txtComputerName1.Size = New-Object System.Drawing.Size(200,70) $txtComputerName1.visible=$TRUE # # # lblExpire # $lblExpire.DataBindings.DefaultDataSourceUpdateMode = [System.Windows.Forms.DataSourceUpdateMode]::OnValidation $lblExpire.Font = New-Object System.Drawing.Font("Lucida Console",8.25,1,3,1) $lblExpire.Location = New-Object System.Drawing.Point(13,35) $lblExpire.Name = "lblExpire" $lblExpire.Size = New-Object System.Drawing.Size(178,23) $lblExpire.TabIndex = 0 $lblExpire.Text = "Enter the Name:Server 2 " $lblExpire.Visible = $TRUE # #$txtComputerName2.text #txtComputerName2 $txtComputerName2.DataBindings.DefaultDataSourceUpdateMode = [System.Windows.Forms.DataSourceUpdateMode]::OnValidation $txtComputerName2.Location = New-Object System.Drawing.Point(200, 35) $txtComputerName2.Name = "txtComputerName2" $txtComputerName2.TabIndex = 1 $txtComputerName2.Size = New-Object System.Drawing.Size(200,70) $txtComputerName2.visible=$TRUE # # lblServicePack # $lblServicePack.DataBindings.DefaultDataSourceUpdateMode = [System.Windows.Forms.DataSourceUpdateMode]::OnValidation $lblServicePack.Font = New-Object System.Drawing.Font("Lucida Console",8.25,1,3,1) $lblServicePack.Location = New-Object System.Drawing.Point(13,100) $lblServicePack.Name = "lblServicePack" $lblServicePack.Size = New-Object System.Drawing.Size(278,23) $lblServicePack.TabIndex = 0 $lblServicePack.Text = "ServicePack" $lblServicePack.Visible = $False # # lblOS # $lblOS.DataBindings.DefaultDataSourceUpdateMode = [System.Windows.Forms.DataSourceUpdateMode]::OnValidation $lblOS.Font = New-Object System.Drawing.Font("Lucida Console",8.25,1,3,1) $lblOS.Location = New-Object System.Drawing.Point(12,77) $lblOS.Name = "lblOS" $lblOS.Size = New-Object System.Drawing.Size(278,23) $lblOS.TabIndex = 2 $lblOS.Text = "User Information" $lblOS.Visible = $False # # statusBar1 # $statusBar1.DataBindings.DefaultDataSourceUpdateMode = [System.Windows.Forms.DataSourceUpdateMode]::OnValidation $statusBar1.Location = New-Object System.Drawing.Point(0,365) $statusBar1.Name = "statusBar1" $statusBar1.Size = New-Object System.Drawing.Size(390,22) $statusBar1.TabIndex = 5 $statusBar1.Text = "statusBar1" # #> $rtbPerfData.BackColor = [System.Drawing.Color]::FromArgb(255,255,255,255) $rtbPerfData.BorderStyle = [System.Windows.Forms.BorderStyle]::None $rtbPerfData.DataBindings.DefaultDataSourceUpdateMode = [System.Windows.Forms.DataSourceUpdateMode]::OnValidation $rtbPerfData.Font = New-Object System.Drawing.Font("Lucida Console",8.25,0,3,1) $rtbPerfData.Location = New-Object System.Drawing.Point(13,120) $rtbPerfData.Name = "rtbPerfData" $rtbPerfData.Size = New-Object System.Drawing.Size(450,200) $rtbPerfData.TabIndex = 6 $rtbPerfData.Text = "" #Save the initial state of the form $InitialFormWindowState = $form1.WindowState #Init the OnLoad event to correct the initial state of the form $form1.add_Load($Form_StateCorrection_Load) #Show the Form return $form1.ShowDialog() } #End Function #Call OnApplicationLoad to initialize if(OnApplicationLoad -eq $true) { #Create the form Call-SystemInformation_pff | Out-Null #Perform cleanup OnApplicationExit } } Compare-Service