6 Replies Latest reply on Aug 7, 2018 8:15 AM by goslackware3

    Cisco Discovery Protocol

    Troy Clavell Guru
    vExpertUser Moderators

      How easy would it be to get the below codes output to a spreadsheet. Ideally each column be the name of the ESXi Host and under those columns are the returned results.

      Get-VMHost | Where-Object {$_.State -eq "Connected"} |
      %{Get-View $_.ID} |
      %{$esxname = $_.Name; Get-View $_.ConfigManager.NetworkSystem} |
      %{ foreach($physnic in $_.NetworkInfo.Pnic){
          $pnicInfo = $_.QueryNetworkHint($physnic.Device)
          foreach($hint in $pnicInfo){
            Write-Host $esxname $physnic.Device
            if( $hint.ConnectedSwitchPort ) {
              $hint.ConnectedSwitchPort
            } else {
              Write-Host "No CDP information available."; Write-Host
            }
          }
        }
      }
      

      code found in http://kb.vmware.com/kb/1003885

        • 1. Re: Cisco Discovery Protocol
          BenConrad Master

          This will give you CSV output where each row is a host with it's CDP properties

           

          cls
          $objReport = @()
          
          function Get-CDP    {
              $obj = @()
              Get-VMHost  | Where-Object {$_.State -eq "Connected"} | %{Get-View $_.ID} |
              %{$esxname = $_.Name; Get-View $_.ConfigManager.NetworkSystem} |
              %{ foreach($physnic in $_.NetworkInfo.Pnic){
              
                  $obj = "" | Select-Object hostname, pNic,PortId,Address,vlan        
              
                  $pnicInfo = $_.QueryNetworkHint($physnic.Device)
                  foreach($hint in $pnicInfo){
                    #Write-Host "$esxname $($physnic.Device)"
                    $obj.hostname = $esxname
                    $obj.pNic = $physnic.Device
                    if( $hint.ConnectedSwitchPort ) {
                      # $hint.ConnectedSwitchPort
                      $obj.PortId = $hint.ConnectedSwitchPort.PortId
                    } else {
                      # Write-Host "No CDP information available."; Write-Host
                      $obj.PortId = "No CDP information available."
                    }
                    $obj.Address = $hint.ConnectedSwitchPort.Address
                    $obj.vlan = $hint.ConnectedSwitchPort.vlan
                    
                  }
                  $objReport += $obj
                }
              }
          $objReport
          }
          
          $results = get-cdp
          $results |  Export-Csv "c:\temp\out.csv"
          
          • 2. Re: Cisco Discovery Protocol
            Troy Clavell Guru
            vExpertUser Moderators

            Thanks BenConrad that should do the trick!

             

             

            THe attachment is a bit different than your pasted code.  I used the pasted code to get the results.

            • 3. Re: Cisco Discovery Protocol
              Pb981 Novice

              How can i add to this the "Device ID" string?

              Thanks!

              • 4. Re: Cisco Discovery Protocol
                LucD Guru
                Community WarriorsUser ModeratorsvExpert

                You mean the PCI device hash ?

                Like this

                 

                function Get-CDP    { 

                    $objReport = @() 

                    Get-VMHost | Where-Object {$_.State -eq "Connected"} | %{Get-View $_.ID} | 

                    %{$esxname = $_.Name; Get-View $_.ConfigManager.NetworkSystem} | 

                    %{ foreach($physnic in $_.NetworkInfo.Pnic){ 

                     

                        $obj = "" | Select-Object hostname, pNic,PCI,PortId,Address,vlan         

                     

                        $pnicInfo = $_.QueryNetworkHint($physnic.Device) 

                        foreach($hint in $pnicInfo){ 

                          #Write-Host "$esxname $($physnic.Device)" 

                          $obj.hostname = $esxname 

                          $obj.pNic = $physnic.Device

                          $obj.PCI = $physnic.PCI

                          if( $hint.ConnectedSwitchPort ) { 

                            $obj.PortId = $hint.ConnectedSwitchPort.PortId 

                          } else

                            $obj.PortId = "No CDP information available." 

                          } 

                          $obj.Address = $hint.ConnectedSwitchPort.Address 

                          $obj.vlan = $hint.ConnectedSwitchPort.vlan 

                           

                        } 

                        $objReport += $obj 

                      } 

                    } 

                $objReport 

                 

                1 person found this helpful
                • 5. Re: Cisco Discovery Protocol
                  vMarkusK1985 Hot Shot
                  vExpert

                  Thanks to LucD for sharing this great function.

                   

                  I have inetgrated the orignal version into my own Function:

                  function Get-UplinkDetails {
                  <#
                      .NOTES
                      ===========================================================================
                      Created by: Markus Kraus
                      Twitter: @VMarkus_K
                      Private Blog: mycloudrevolution.com
                      ===========================================================================
                      Changelog:  
                      2017.03 ver 1.0 Base Release  
                      ===========================================================================
                      External Code Sources: 
                      Get-CDP Version from @LucD22
                      https://communities.vmware.com/thread/319553
                      ===========================================================================
                      Tested Against Environment:
                      vSphere Version: vSphere 6.0 U2
                      PowerCLI Version: PowerCLI 6.3 R1
                      PowerShell Version: 4.0
                      OS Version: Server 2012 R2
                      Keyword: ESXi, Network, CDP, DVS, vSwitch, VMNIC 
                      ===========================================================================
                  
                  
                      .DESCRIPTION
                      This cmdlet collects detailed informations about your ESXi Host connections to pSwitch and DVS / vSwitch
                  
                  
                      .Example
                      Get-UplinkDetails -Clustername * | ft -AutoSize
                  
                  
                      .Example
                      Get-UplinkDetails -Clustername MyCluster001 | ft -AutoSize
                  
                  
                      .Example
                      Get-UplinkDetails -Clustername MyCluster* | Sort Clustername, Hostname, DVS | ft -AutoSize
                  
                  
                      .PARAMETER Clustername
                      Your vSphere Cluster Name or Wildcard
                  
                  
                  
                  
                  #Requires PS -Version 4.0
                  #Requires -Modules VMware.VimAutomation.Core, @{ModuleName="VMware.VimAutomation.Core";ModuleVersion="6.3.0.0"}
                  #>
                  
                  
                  [CmdletBinding()]
                  param( 
                      [Parameter(Mandatory=$True, ValueFromPipeline=$False, Position=0)]
                          [String] $Clustername
                          
                  )
                  
                  
                  Begin {
                      $Validate = $True
                  
                  
                      if (($myCluster = Get-Cluster -Name $Clustername).count -lt 1) {
                         $Validate = $False
                         throw "No Cluster '$myCluster' found"
                      }
                      if (($myHosts = $myCluster | Get-VMHost).count -lt 1) {
                         $Validate = $False
                         throw "No Hosts in Cluster '$myCluster' found"
                      }
                  
                  
                      function Get-CDP ($VMhost){
                          $VMhostProxySwitch = $VMhost.NetworkInfo.ExtensionData.ProxySwitch 
                          $VMhostSwitch = $VMhost.NetworkInfo.VirtualSwitch
                  
                  
                          $objReport = @()
                          $VMhost| %{Get-View $_.ID} | 
                          %{ Get-View $_.ConfigManager.NetworkSystem} | 
                          %{ foreach($physnic in $_.NetworkInfo.Pnic){ 
                       
                              $obj = "" | Select-Object Clustername,Hostname,VMNIC,PCI,MAC,DVS,vSwitch,CDP_Port,CDP_Device,CDP_Address   
                       
                              $pnicInfo = $_.QueryNetworkHint($physnic.Device) 
                              foreach($hint in $pnicInfo){ 
                                  $obj.Clustername = $VMhost.parent.name
                                  $obj.Hostname = $VMhost.name 
                                  $obj.VMNIC = $physnic.Device
                                  $obj.PCI = $physnic.PCI
                                  $obj.MAC = $physnic.Mac
                                  if ($backing = ($VMhostProxySwitch | where {$_.Spec.Backing.PnicSpec.PnicDevice -eq $physnic.Device}).DvsName) {
                                      $obj.DVS = $backing
                                      } else {
                                          $obj.DVS = "-No Backing-"
                                          }
                                  if ($backing = ($VMhostSwitch | where {$_.Nic -eq $physnic.Device}).Name) {
                                      $obj.vSwitch = $backing
                                      } else {
                                          $obj.vSwitch = "-No Backing-"
                                          }
                                  if( $hint.ConnectedSwitchPort ) { 
                                      $obj.CDP_Port = $hint.ConnectedSwitchPort.PortId
                                      $obj.CDP_Device = $hint.ConnectedSwitchPort.DevId
                                      $obj.CDP_Address = $hint.ConnectedSwitchPort.Address  
                                      } else { 
                                          $obj.CDP_Port = "-No Info-" 
                                          $obj.CDP_Device = "-No Info-" 
                                          $obj.CDP_Address = "-No Info-" 
                                          } 
                                  
                  
                  
                              } 
                              $objReport += $obj 
                              } 
                          } 
                          $objReport 
                      } 
                    
                  }
                  
                  
                  Process {
                  
                  
                      $MyView = @()
                  
                  
                      if ($Validate -eq $True) {
                    
                          foreach ($myHost in $myHosts) {
                  
                  
                          $CDP = Get-CDP $myHost
                          $MyView += $CDP        
                  
                  
                    }
                             
                         $MyView | Sort Clustername, Hostname, VMNIC
                  
                  
                      }
                      }
                  }
                  
                  
                  
                  
                  
                  
                  
                  
                  
                  
                  
                  
                  
                  
                  
                  
                  
                  
                  
                  
                  
                  
                  
                  
                  
                  
                  
                  
                  
                  
                  
                  
                  
                  
                  
                  
                  
                  
                  
                  
                  • 6. Re: Cisco Discovery Protocol
                    goslackware3 Novice

                    I've modified  vMarkusK1985 script, to include additional cdp fields in the below script:

                    2 people found this helpful