I had the task recently of running an inventory on a large group of servers looking for old systems that require replacement. One of the criteria was the hardware warranty expiration. These are primary Dell systems, so I looked around for scripts to check that, but wasn't having much luck getting them working. Since the scripts hit the Dell web site looking for details, I would suspect various changes there will cause issues. So after looking at the code a bit, running some fiddler traces to see the full interaction of the site, I found I would need cookie support. Since I haven't seen that work well in the past, I had used PERL LWP for this as you can find in a previous post on Oracle Access Manager diagnostic page scrapping automation. I did some searching and came upon this very useful post which shows how to get cookies working in the Posh v3 invoke-webrequest commandlet. So, armed with that, I put together this code to pull the details. Note that there can be more than one warranty listed for a serial number. This script takes a service tag number, or array of service tag numbers and outputs something like this:
ServiceTag : ###### Country : United States WarrantyExpiration : 3/23/2011 WarrantyType : Gold or ProSupport with Mission Critical WarrantyStarted : 3/23/2007 ServiceTag : ###### Country : United States WarrantyExpiration : 3/23/2011 WarrantyType : 4 Hour On-Site Service WarrantyStarted : 3/22/2008
You can pass any additional parameter to the script that is accepted by invoke-webrequest. So if you need a proxy or authentication, you can do so.
#Requires -version 3.0 #Get-DellWarrantyDetails param( [parameter(mandatory=$true,position=0)][String[]]$svctags, [parameter(mandatory=$false, ValueFromRemainingArguments=$true,position=1)] [String[]]$remaining ) begin { #process any extra arguments like proxy settings, credentials, etc (used for invoke-webrequest) $extras = @{} for ($i = 0; $i -lt $Remaining.Count; $i++) { if ($Remaining[$i] -match "^-(.*)") { $val = $Matches[1] if ($Remaining[$i+1] -match "^-" -or ($remaining.Count -eq $i+1)) { $extras.Add($val,$true) } else { $extras.Add($val,$Remaining[$i+1]) $i++ } } } $script:posturl = "http://www.dell.com/support/troubleshooting/us/en/555/TroubleShooting/Display_Warranty_Tab?name=TroubleShooting_WarrantyTab" $script:geturlPrefix = "http://www.dell.com/support/troubleshooting/us/en/04/Servicetag/" $script:geturlSuffix = "?s=BIZ#ui-tabs-5" $script:session = New-Object Microsoft.PowerShell.Commands.WebRequestSession } process { foreach ($svctag in $svctags) { Invoke-WebRequest @extras -Uri ($script:geturlPrefix + $svctag + $script:geturlSuffix) ` -WebSession $script:session -ErrorAction SilentlyContinue |Out-Null $postresult = Invoke-WebRequest @extras -Uri $script:posturl -WebSession $script:session -ErrorAction SilentlyContinue if ($postresult -eq $null) { #webrequest failed } else { $countrytag = ($postresult.allelements|where {$_.tagname -match "DIV" -and $_.class -eq "Width100Percent" -and $_.innerHTML -match "CounrtyShipDateRight" -and $_.innerText[0] -eq "C"}).innerhtml.split("`n")[1] $countrytag = $countrytag.substring($countrytag.indexof(">")+1) $countrytag = $countrytag.substring(0,$countrytag.indexof("<")-1) #countrytag is now just a country name in text format with HTML removed $warrTbl = ($postresult.allelements|where {$_.tagname -eq "form" -and $_.id -eq "grid"}).innerhtml $warrTbl = $warrTbl.replace(" class=uif_t_altRow","").substring($warrTbl.indexof("TBODY")-1) $warrXML = [xml]("<root><TABLE>" + $warrTbl + "</root>") foreach ($xEntry in $warrXML.root.TABLE.tbody.tr) { $result = New-Object PSobject Add-Member -InputObject $result NoteProperty ServiceTag $svctag Add-Member -InputObject $result NoteProperty Country $countrytag Add-Member -InputObject $result NoteProperty WarrantyExpiration $xEntry.td[3] Add-Member -InputObject $result NoteProperty WarrantyType $xEntry.td[0] Add-Member -InputObject $result NoteProperty WarrantyStarted $xEntry.td[2] $result } } } }
No comments:
Post a Comment