Blog Post

PowerShell – Service Comparison GUI Tool

,

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

ServiceComparisonTool1

ServiceComparisonTool2

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

Rate

You rated this post out of 5. Change rating

Share

Share

Rate

You rated this post out of 5. Change rating