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