Fujitsu Servicestatus überprüfen

[Aktualisert: 06.01.2020] Ich habe in den letzten Wochen ein Powershell-Skript geschrieben, welches Informationen zu einer Seriennummer von Fujitsu ausliest. Anlass dafür ist, dass mein Arbeitgeber hauptsächlich Fujitsu Geräte im Einsatz hat. Die Garantie Informationen sind bisher händlisch in die Asset-Management-System-Software eingetragen worden. Worauf natürlich keiner wirklich Lust hat… egal ob Kollegen, Auszubildene oder Praktikanten.

So sieht das Ganze exemparisches im Betrieb aus:

Das Skript hat einmal den Parameter SerialNumber. Wie der Name schon sagt, muss danach die Seriennummer in Anführungszeichen angegeben werden.

.\fujtisu-support_check-warranty-status.ps1 -SerialNumber "YM5G017837"

Damit läuft das Skript  ohne weiter Interaktionen durch und schreibt ein Protokolldatei für den Vorgang. Diese wird standardmäßig unter C:\Temp abgelegt.

Möchte man jedoch das Resultat auch am Bildschirm sehen so gibt es einen weiteren Parameter mit dem Namen Interactive. Wird dieser angegeben, bleibt das Konsolenfenster des Skripts am Ende offen.

.\fujtisu-support_check-warranty-status.ps1 -SerialNumber "YM5G017837" -Interactive

Das Skript soll aktuell ein Ansatz für euch sein. Je nach Asset-Management und dessen API muss das Skript angepasst werden.

<#
.SYNOPSIS
Dieses Skript ruft die Garantieinformationen eines Geräts vom Hersteller Fujitsu ab

Daniel Wydler

THIS CODE IS MADE AVAILABLE AS IS, WITHOUT WARRANTY OF ANY KIND. THE ENTIRE
RISK OF THE USE OR THE RESULTS FROM THE USE OF THIS CODE REMAINS WITH THE USER. 

.DESCRIPTION

 
.PARAMETER SerialNumber
Angabe der Seriennummer des Geräts, welches abgefragt werden soll

.PARAMETER csv
Ausgabe der Gerätedaten in eine CSV Datei

 
.INPUTS
Die Seriennummer des Geräts
 
.OUTPUTS
Ausgabe der Garantieinformationen des Geräts
 
.NOTES
File:           fujtisu-support_check-warranty-status
Version:        0.5
Author:         Daniel Wydler
Creation Date:  10.03.2019, 10:32 Uhr
Purpose/Change:
 
Date                   Comment
-----------------------------------------------
10.03.2019, 10:32 Uhr  Initial community release
10.03.2019, 10:34 Uhr  Fujtisu change the query function
10.03.2019, 10:35 Uhr  remove serial from demo pc
15.09.2019, 15:35 Uhr  Fujtisu change the query function
09.12.2019, 14:21 Uhr  Implement export to excel/csv


.COMPONENT
None

.LINK
https://github.com/dwydler/Powershell-Skripte/blob/master/Fujitsu/fujtisu-support_check-warranty-status.ps1

.EXAMPLE
.\fujtisu-support_check-warranty-status -SerialNumber "YM5G017837"
.\fujtisu-support_check-warranty-status -SerialNumber "YM5G017837;YLPW019174"
.\fujtisu-support_check-warranty-status -SerialNumber "YM5G017837;YLPW019174" -csv
#>

#---------------------------------------------------------[Initialisations]--------------------------------------------------------

param(
    [Parameter(
        Position=0,
        Mandatory=$false
    )] 
    [ValidateNotNullOrEmpty()]
    [string] $SerialNumber = "",

    [Parameter(
        Position=1,
        Mandatory=$false
    )] 
    [ValidateNotNullOrEmpty()]
    [switch] $csv
)

Clear-Host

#----------------------------------------------------------[Declarations]----------------------------------------------------------

### function Write-Log
[string] $strLogfilePath = $(pwd).Path
[string] $strLogfileDate = Get-Date -Format "yyyy-MM-dd_HH-mm-ss"
[string] $strLogfileNamePrefix = "Log_"
[string] $strLogfileName = $($strLogfileNamePrefix + $strLogfileDate + ".log")
[string] $strLogfile = $strLogfilePath + "\" + $strLogfileName


###
[array] $aSerialNumbers = @()

[string] $strCsvFilePath = $(pwd).Path
[string] $strCsvFileDate = Get-Date -Format "yyyy-MM-dd_HH-mm-ss"
[string] $strCsvFileNamePrefix = "Export_"
[string] $strCsvFileName = $($strCsvFileNamePrefix + $strCsvFileDate + ".csv")
[string] $strCsvFile = $strCsvFilePath + "\" + $strCsvFileName

#-----------------------------------------------------------[Functions]------------------------------------------------------------

function WorkingDir {
    param (
         [parameter(
            Mandatory=$false,
            Position=0
          )]
        [switch] $Debugging
    )

    # Splittet aus dem vollständigen Dateipfad den Verzeichnispfad heraus
    # Beispiel: D:\Daniel\Temp\Unbenannt2.ps1 -> D:\Daniel\Temp
    [string] $strWorkingdir = Split-Path $MyInvocation.PSCommandPath -Parent

    # Wenn Variable wahr ist, gebe Text aus.
    if ($Debugging) {
        Write-Host "[DEBUG] PS $strWorkingdir`>" -ForegroundColor Gray
    }

    # In das Verzeichnis wechseln
    cd $strWorkingdir
}

function Write-Log {
    [CmdletBinding()]
    param (
        [Parameter(
            Mandatory=$true,
            Position=0)]
        [ValidateNotNullOrEmpty()]
        [string] $LogText = "",

        [Parameter(Mandatory=$false)]
        [ValidateNotNullOrEmpty()]
        [ValidateSet('Info','Success','Warning','Error')]
        [string] $LogStatus= "Info",

        [Parameter(Mandatory=$false)]
        [switch] $Absatz,

        [Parameter(Mandatory=$false)]
        [switch] $EventLog
    )

    [string] $strLogdate = Get-Date -Format "yyyy-MM-dd HH:mm:ss"
    [string] $strTextColor = "White"
    [string] $strLogFileAbsatz = ""
    [string] $strLogFileHeader = ""

    if ( -not (Test-Path $strLogfilePath) ) {
        Write-Host "Der angegebene Pfad $strLogfilePath existiert nicht!" -ForegroundColor Red
        exit
    }

    # Add a header to logfile, if the logfile not exist
    If ( -not (Test-Path $strLogfile) ) {
        $strLogFileHeader = "$("#" * 120)`n"
        $strLogFileHeader += "{0,-21} {1,0}" -f "# Skript:", "$($MyInvocation.ScriptName)`n"
        $strLogFileHeader += "{0,-21} {1,0}" -f "# Startzeit:", "$(Get-Date -Format "dd.MM.yyyy HH:mm:ss")`n"
        $strLogFileHeader += "{0,-21} {1,0}" -f "# Startzeit:", "$(Get-Date -Format "dd.MM.yyyy HH:mm:ss")`n"
        $strLogFileHeader += "{0,-21} {1,0}" -f "# Ausführendes Konto:", "$([Security.Principal.WindowsIdentity]::GetCurrent().Name)`n"
        $strLogFileHeader += "{0,-21} {1,0}" -f "# Computername:", "$env:COMPUTERNAME`n"
        $strLogFileHeader += "$("#" * 120)`n"

        Write-Host $strLogFileHeader
        Add-Content -Path $strLogfile -Value $strLogFileHeader -Encoding UTF8
    }
   

    switch($LogStatus) {
        Info {
            $strTextColor = "White"
        }
        Success {
            $strTextColor = "Green"
        }
        Warning {
            $strTextColor = "Yellow"
        }
        Error {
            $strTextColor = "Red"
        }
    }

    # Add an Absatz if the parameter is True
    if($Absatz) {
        [string] $strLogFileAbsatz = "`r`n"
    }

    #Format the text output
    $LogText = "{0,-20} - {1,-7} - {2,0}" -f "$strLogdate", "$LogStatus", "$LogText $strLogFileAbsatz"

    # Write output to powershell console
    Write-Host $LogText -ForegroundColor $strTextColor

    # Write output to logfile
    Add-Content -Path $strLogfile -Value $LogText -Encoding UTF8

    # Add Logfile to local Eventlog of the operating system 
    if($EventLog) {
        Write-EventLog -LogName 'Windows PowerShell' -Source "Powershell" -EventId 0 -Category 0 -EntryType $LogStatus -Message $LogText
    }

}

Function ValidSerialNumber ([string] $strLocSerialNumber) {
    
    if($strLocSerialNumber -match "^[a-zA-Z]{2}[\da-zA-Z][a-zA-Z]\d{6}$") {
        return $true
    }
    else {
        return $false

    }
}

#------------------------------------------------------------[Modules]-------------------------------------------------------------

#-----------------------------------------------------------[Execution]------------------------------------------------------------

# Wechselt in das Verzeichnis, in dem das PowerShell Skript liegt
WorkingDir


Write-Host @"
------------------------------------------------------------------------------------------------------------------------

                                        Fujitsu Garantie / Service Status ueberpruefen
                                                        Version: 0.5

------------------------------------------------------------------------------------------------------------------------
"@

Write-Log -LogText "Überprüfen ob Seriennummern(n) als Parameter übergeben worden sind." -LogStatus Info
if ($SerialNumber -eq "") {
    Write-Log -LogText "Keine Seriennummern gefünden." -LogStatus Info -Absatz

    do {
        $SerialNumber = Read-Host "Bitte Seriennummer(n) eingebenn (z.B. YLPW019174;YLPW019175)"
    } while ($SerialNumber -eq "")    
}
else {
    Write-Log -LogText "Mindestens eine Serienummer gefunden." -LogStatus Info -Absatz
}

# Seriennummern von einem String in ein Array konvertieren
$aSerialNumbers = $SerialNumber -split ';'

# Falls der Schalter "csv" angeben ist, wird die Datei angelegt.
if ($csv) {
    Add-Content -Path "$strCsvFile"  -Value '"Produktname","Bestellnummer","Garantie Gruppe","Service Offer Gruppe","Service Code","Service Start","Service Ende","Service Status","Garantie Typ"' -Encoding UTF8
}
 
ForEach ($sn in $aSerialNumbers) {

    Write-Log -LogText "Überprüfen des Muster/Länger der Seriennummer '$sn'." -LogStatus Info
    if (ValidSerialNumber $sn ) {
        Write-Log -LogText "Gültige Seriennummer '$sn' erkannt." -LogStatus Success -Absatz

        Write-Log -LogText "Abfrage der Daten des Geräts bei Fujitsu." -LogStatus Info
        $wroSearchHtml= Invoke-WebRequest "https://support.ts.fujitsu.com/Adler/Default.aspx?Lng=de&GotoDiv=Warranty/WarrantyStatus&DivID=indexwarranty&GotoUrl=IndexWarranty&Ident=$sn"

        [array] $arrFujitsuDeviceWarrentyInfos = $wroSearchHtml.InputFields | Where-Object { ($_.name -eq "Ident") -or ($_.name -eq "Produkt") -or ($_.name -eq "Firstuse") -or ($_.name -eq "WarrantyEndDate")  -or ($_.name -eq "WCode") `
            -or ($_.name -eq "WCodeDesc") -or ($_.name -eq "PartNumber") -or ($_.name -eq "WGR") -or ($_.name -eq "SOG") } | Select-Object Name, Value
        
        Write-Log -LogText "`tProduktname:`t`t`tFujitsu $($arrFujitsuDeviceWarrentyInfos[1].value)" -LogStatus Info 
        Write-Log -LogText "`tBestellnummer:`t`t`t$($arrFujitsuDeviceWarrentyInfos[8].value)" -LogStatus Info
        Write-Log -LogText "`tGarantie Gruppe:`t`t$($arrFujitsuDeviceWarrentyInfos[6].value)" -LogStatus Info
        Write-Log -LogText "`tService Offer Gruppe:`t$($arrFujitsuDeviceWarrentyInfos[7].value)" -LogStatus Info
        Write-Log -LogText "`tService Code:`t`t`t$($arrFujitsuDeviceWarrentyInfos[2].value)" -LogStatus Info
        Write-Log -LogText "`tService Start:`t`t`t$(Get-Date $arrFujitsuDeviceWarrentyInfos[3].value -Format "dd.MM.yyyy")" -LogStatus Info

        if( (Get-Date $arrFujitsuDeviceWarrentyInfos[4].value) -gt (Get-Date)) {
            Write-Log -LogText "`tService Ende:`t`t`t$(Get-Date $arrFujitsuDeviceWarrentyInfos[4].value -Format "dd.MM.yyyy")" -LogStatus Success
            Write-Log -LogText "`tService Status:`t`tDas Produkt ist unter Service." -LogStatus Success
            [string] $strSeviceStatus = "Das Produkt ist unter Service."
        }
        else {
            Write-Log -LogText "`tService Ende:`t`t`t$(Get-Date $arrFujitsuDeviceWarrentyInfos[4].value -Format "dd.MM.yyyy")" -LogStatus Error
            Write-Log -LogText "`tService Status:`t`t`tDas Produkt hat keinen Service mehr." -LogStatus Error
            [string] $strSeviceStatus = "Das Produkt hat keinen Service mehr."
        }
        Write-Log -LogText "`tGarantie Typ:`t`t`t$($arrFujitsuDeviceWarrentyInfos[5].value)" -LogStatus Info -Absatz

        if ($csv) {
            Write-Log -LogText "`Schreibe die Daten in die CSV Datei '$strCsvFileName'." -LogStatus Info -Absatz
            Add-Content -Path "$strCsvFile" -Value "`"$($arrFujitsuDeviceWarrentyInfos[1].value)`",`"$($arrFujitsuDeviceWarrentyInfos[8].value)`",`"$($arrFujitsuDeviceWarrentyInfos[6].value)`",`"$($arrFujitsuDeviceWarrentyInfos[7].value)`",`"$($arrFujitsuDeviceWarrentyInfos[2].value)`",`"$(Get-Date $arrFujitsuDeviceWarrentyInfos[3].value -Format "dd.MM.yyyy")`",`"$(Get-Date $arrFujitsuDeviceWarrentyInfos[4].value -Format "dd.MM.yyyy")`",`"$strSeviceStatus`",`"$($arrFujitsuDeviceWarrentyInfos[5].value.Trim())`"" -Encoding UTF8
        }
    }
    else {
        Write-Log -LogText "Die Seriennummer '$sn' ist ungültig!" -LogStatus Error
    }

}

exit

Quelle: Git Repository

Ich freue mich über jede Idee bzw. Verbesserungsvorschlag für das Skript.

Abonnieren
Benachrichtige mich bei
10 Comments
neueste
älteste
Inline Feedbacks
View all comments
Pascal
15.11.2019 16:24

Hi, vielen Dank für das Klasse Skript. Könntest du vielleicht auch einen CSV Schalter mit einbauen, damit man auch mehrer Seriennummern in einen Rutsch abfragen kann?
Gruß
Pascal

Pascal Günther
Reply to  dw
08.12.2019 21:50

Hi dw, hoffentlich ist das Christkind gut gelaunt 😉

Luca
16.07.2018 09:28

Ich wollte einen Warranty Check als Teil von einem Script bauen und hab deines hier gefunden. Jedoch, wenn ich nur die Funktion „GetWarrantyInfo“ z.B. einzeln ausführe, dann bekomme ich keinen Wert zurück. Auch wenn ich den ersten Link, der abgerufen wird, im Browser aufrufen will, bekomme ich eine blanke Seite. Jedoch wenn ich dein Script als ganzes ausführe, dann scheint es zu funktionieren.

Johannes
27.06.2018 09:53

Hallo, vielen Dank für deine Arbeit! Allerdings gibt mir dein Script falsche Werte zurück. Für einen alten P520 mit der Identnr. YLPW019174 bekomme ich z.B.: folgende Ausgabe: Produktname: Fujitsu LIFEBOOK E754 HM86 Bestellnummer: S26391-K393-V100 Service Code: FSP:GM5S20Z00DENB2 Service Start: 31.07.2015 Service Ende: 31.07.2020 Service Status: Ihr Produkt ist unter Service Garantie Gruppe: NB2 Garantie Art: 5 Jahre Vor-Ort Service, 9×5, nächster Arbeitstag Antrittszeit, gilt im Land des Erwerbs Ebenfalls für einen nicht so alten P920. Weiters ist mir aufgefallen, dass der Parameter „-strSerialNumber „YYYY0000″“ so nicht mehr notwendig ist, bzw auch gar nicht funktioniert. Während ich das jetzt geschrieben habe,… Weiterlesen »

Marcus
29.08.2017 14:57

Hallo,

gibt es dazu ein Update? Das Skrip scheint nicht zu funktionieren, selbst wenn ich den enthaltenen Link zu Fujitsu direkt aufrufe.

http://support.ts.fujitsu.com/Warranty/WarrantyStatus.asp?lng=DE&IDNR=XXXXXXXX

10
0
Would love your thoughts, please comment.x
()
x
Back to top