Script to get a list of computers connected to a Avocent KVM switch

Hello,

in his office, a customer have a few Avocent KVM switches to control some client computers in a remote room. He ask me about the possibility to get a list of all computers connected to these boxes, because he do not want to maintain any list by hand.

I research the documention but there is no (scripting) interface from which I could get such a list. SSH is only for connecting serial consoles, SNMP offers no OIDs for such a case.

Because of the costs, DSView isn’t a option. The only way seems to be to extracting the list by reading the Webfrontend HTML output. Let us do this 🙂

I wrote a script in powershell, at least version 2 is needed to handle selfsigned SSL certificates, which do the following:

  • Login to the Webfronted with https and SSL encryption by System.Net.HTTPWebRequest class to get the authentification cookie
  • Get the Device HTML  page by .NET class System.Net.Webclient and using Authentification cookie
  • Save HTML do a temporary file
  • Open the file with Internet Explorer
  • Get the URL to start a KVM session, computername and portnumber by  DOM

Script details

Define the User, Password, protocol and the devices:

# KVM User
[string]$sUser="Admin"
# KVM Password
[string]$sPassword="YourPassword"
# Protocol
[string]$sProtocol="https"
# Your Devices
[String[]]$aAvocentDevices=@("Console1.domain.local","Console2.domain.local")

Built HTTP POST text and disable SSL certificate warnings

[Byte[]]$aBody=[System.Text.Encoding]::Default.GetBytes("action=login&loginUsername="+$sUser+"&loginPassword="+$sPassword+"&language=de")
[System.Net.CookieContainer]$oCookieContainer = New-Object System.Net.CookieContainer
# Ignore SSL Certificate Warning, requires Powershell 2.0
[System.Net.ServicePointManager]::ServerCertificateValidationCallback = {$true}

Built the login POST request by using System.Net.HTTPWebRequest class

[string]$sLoginURL = $sProtocol+"://$sConsole/login.php"
[System.Net.HTTPWebRequest] $oWebRequest = [System.Net.WebRequest]::create($sLoginURL)
$oWebRequest.AllowAutoRedirect = $false
$oWebRequest.Method = "POST"
$oWebRequest.Accept="application/x-ms-application, image/jpeg, application/xaml+xml, image/gif, image/pjpeg, application/x-ms-xbap, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, */*"
$oWebRequest.Headers.Add("Accept-Encoding: gzip, deflate")
$oWebRequest.Headers["Cache-Control"] = "no-cache";
$oWebRequest.UserAgent="Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; WOW64; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET4.0C; .NET4.0E; MS-RTC LM 8; InfoPath.2)"
$oWebRequest.ContentType = "application/x-www-form-urlencoded"
$oWebRequest.Timeout = ([System.TimeSpan]::FromSeconds(50)).TotalMilliseconds
$oWebRequest.CookieContainer = $oCookieContainer
$oWebRequest.ContentLength=$aBody.Length
$oWebRequest.Referer=$sProtocol+"://$sConsole/login.php"
$oWebRequest.CookieContainer.Add((New-Object System.Net.Cookie("/home.php-t1s", "1","","$sConsole")));

Getting the authentification cookie and set an avocent specific cookie

# Try to login
$oReqStream = $oWebRequest.GetRequestStream()
$oReqStream.Write($aBody, 0, $aBody.Length)
[System.Net.HTTPWebResponse] $oResponse = $oWebRequest.getResponse()
$oResponse.Headers["Set-Cookie"]="/home.php-t1s=1;"+$oResponse.Headers["Set-Cookie"]

Get the device list as html by using the authentification cookie

$oWebClient = new-object system.net.webclient
$oWebClient.Headers.add("Cookie", $oResponse.Headers["Set-Cookie"])
$oWebClient.Headers.Add("Accept: application/x-ms-application, image/jpeg, application/xaml+xml, image/gif, image/pjpeg, application/x-ms-xbap, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, */*")
$oWebClient.Headers.Add("Accept-Encoding: text/plain, text/html")
# Devicelist as html
$sHTML=$oWebClient.DownloadString($sProtocol+"://$sConsole/target-table.php?id=1&colcnt=4")
$oReqStream.Flush()
$oReqStream.Close()
$oResponse.Close()

Save the HTML Output in a file and open it with Internet Explorer

$sTempFile=[System.IO.Path]::GetTempFileName()+".html"
Set-Content -Path $sTempFile $sHTML
$oIE=new-object -Com internetexplorer.application
$oIE.Visible=1
write-host "file:///$sTempFile"
$oIE.Navigate2("file:///$sTempFile")
while($oIE.busy){
    Start-Sleep 1
    write-host -nonewline "."
}

Get all devices by DOM (Document object model)

for($iLoop=1;$iLoop -le 64;$iLoop++){
    $oEntry=$oIE.Document.getElementByID("name$iLoop")
    if($oEntry){
        # Valid Entry
        $sDeviceName=$oEntry.innerHTML
        write-host "DEVICE:  " $sDeviceName
        $oEntryLink=$oEntry.parentNode
        $oRegEx=new-object System.Text.RegularExpressions.Regex("targetid=(\d{1,2})$")
        [Int16]$iTargetID=0
        if([System.Int16]::TryParse($oRegEx.Match($oEntryLink.href).Groups[1].Value,[ref]$iTargetID)){
            if($iTargetID -gt 0){
                $sURL=$sProtocol+"://"+$sConsole+"/session_launch.php?action=connect&sessionType=kvmLaunch&targetId="+$iTargetID.ToString()
                Write-Host "PORT:    " $iTargetID.ToString()
                write-host "KVM URL: " $sURL
            }
        }
    }
}

Finally quit IE and remove temporary files

	$oIE.Quit()
	Remove-Item -Force -Path $sTempFile

You can download the whole script by opening the post. It should be easy to generate a website with all your devices. Enjoy the script 🙂

Michael

Advertisment to support michlstechblog.info

List Targets which are connected to multiple Avocent KVM switches
4.4 KiB
757 Downloads
Details...

Add a comment »One comment to this article

  1. I struggled a lot with powershell and fiddler to mimic the login behavior to these avocent devices and was not able to. I did not even thinked the this kind of script will be available on the internet. Thank you very much!!!

    Reply

Time limit is exhausted. Please reload CAPTCHA.

Original Theme by Schiy · Powered by WordPress