Office 2003-Key-Auslese-Funktion falsch/fehlerhaft?

  • Ich habe ein Skript geschrieben, welches die Windows und Office-Keys aller unserer Rechner in der Firma ausliest und in eine Datei speichert. Die Funktion für die Office-Keys habe ich hier aus dem Forum. Ich habe sie nur leicht angepasst.

    Spoiler anzeigen
    [autoit]

    Func getOfficeKey()
    Local $List[1]
    Local $i = 1
    $var = RegRead("HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Office\11.0\Common\InstallRoot", "Path")
    If $var <> "" Then
    $product = "2003"
    Dim $officeKey = "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Office\11.0\Registration"
    Else
    $var = RegRead("HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Office\10.0\Common\InstallRoot", "Path")
    If @error <> 0 Then
    GUICtrlSetData($status_L, "Info: Unable to find installationPath, maybe no Office installed!")
    Return "No Office XP or 2003 found"
    EndIf
    If $var <> "" Then
    $product = "XP"
    Dim $officeKey = "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Office\10.0\Registration"
    EndIf
    EndIf
    Dim $var = RegEnumKey($officeKey, $i)
    If @error <> 0 Then
    GUICtrlSetData($status_L, "Info: Unable to find REG_BINARY 'DigitalProductID', maybe no Office installed!")
    Return "No Office XP or 2003 found"
    Else
    $List[$i - 1] = RegRead($officeKey & "\" & $var, "DigitalProductID")
    If $List[$i - 1] = "" Then
    GUICtrlSetData($status_L, "Info: Unable to find REG_BINARY 'DigitalProductID', maybe no Office installed!")
    Else
    $key = $List[$i - 1]
    Return DecodeProductKey($key)
    EndIf
    EndIf
    EndFunc ;==>getOfficeKey

    [/autoit]

    Jetzt ist das Problem, dass demnach mind. die Hälfte der Rechner mit Office mit dem selben Key installiert wurden. Um genau zu sein 58 mal. Wir haben allerdings nur OEM Lizenzen. D.h. jeder Key dürfte eigentlich nur einmal auftauchen. Irgendwie hab ich das Gefühl, dass die Funktion nicht ganz korrekt ist.

    2 Mal editiert, zuletzt von nuely (28. Februar 2008 um 14:44)

    • Offizieller Beitrag

    Hi,

    das sieht mir doch verdächtig nach diesem alten Skript von mir aus:

    Spoiler anzeigen
    [autoit]

    ; ----------------------------------------------------------------------------
    ;
    ; AutoIt Version: 3.1.1 beta
    ; Author: Thorsten Meger
    ;
    ; Script Function:
    ; Windows XP Information displayed in a Gui
    ;
    ; ----------------------------------------------------------------------------
    #include <GUIConstants.au3>

    [/autoit] [autoit][/autoit] [autoit]

    $GUI = GUICreate("", 380, 315, -1, -1)
    GUISetFont(9, 700, -1, "MS Sans Serif")

    [/autoit] [autoit][/autoit] [autoit]

    $windowsInformation_L = GUICtrlCreateLabel(" Windows Information", 5, 3, 290, 25)
    $status_L = GUICtrlCreateLabel("Information read ...", 20, 280, 200, 20)
    $description_L = GUICtrlCreateLabel("Description", 20, 58, 100, 20)
    $windowsType_L = GUICtrlCreateLabel("WindowsType", 20, 83, 100, 20)
    $serialNumber_L = GUICtrlCreateLabel("SerialNumber", 20, 108, 100, 20)
    $ProductKey_L = GUICtrlCreateLabel("ProductKey", 20, 133, 100, 20)
    $InstallDate_L = GUICtrlCreateLabel("InstallDate", 20, 158, 100, 20)
    $LastBootUpTime_L = GUICtrlCreateLabel("LastBootUpTime", 20, 183, 100, 20)
    $RegisteredOwner_L = GUICtrlCreateLabel("RegisteredOwner", 20, 208, 100, 20)
    $officeKey_L = GUICtrlCreateLabel("OfficeKey", 20, 233, 100, 20)

    [/autoit] [autoit][/autoit] [autoit]

    $description_I = GUICtrlCreateInput("", 125, 55, 235, 20)
    $windowsType_I = GUICtrlCreateInput("", 125, 80, 235, 20)
    $serialNumber_I = GUICtrlCreateInput("", 125, 105, 235, 20)
    $ProductKey_I = GUICtrlCreateInput("", 125, 130, 235, 20)
    $InstallDate_I = GUICtrlCreateInput("", 125, 155, 235, 20)
    $LastBootUpTime_I = GUICtrlCreateInput("", 125, 180, 235, 20)
    $RegisteredOwner_I = GUICtrlCreateInput("", 125, 205, 235, 20)
    $officeKey_I = GUICtrlCreateInput("", 125, 230, 235, 20)

    [/autoit] [autoit][/autoit] [autoit]

    $informationPanel_G = GUICtrlCreateGroup("Information Panel", 10, 35, 360, 225)
    $status_G = GUICtrlCreateGroup("Status", 10, 265, 360, 40)

    [/autoit] [autoit][/autoit] [autoit]

    $font = "Comic Sans MS"
    GUICtrlSetColor($windowsInformation_L, 0xff0000)
    GUICtrlSetFont($windowsInformation_L, 16, 700, 4, $font)

    [/autoit] [autoit][/autoit] [autoit]

    $progressbar = GUICtrlCreateProgress(140, 278, 220, 20)

    [/autoit] [autoit][/autoit] [autoit]

    Global $product = ""
    Global $counter = 3
    Global $wait = 150

    [/autoit] [autoit][/autoit] [autoit]

    GUISetState(@SW_SHOW)

    [/autoit] [autoit][/autoit] [autoit]

    While 1
    $msg = GUIGetMsg()
    If $counter = 3 Then
    Sleep(1000)
    GUICtrlSetData($status_L, "Initialize ... " & $counter)
    progress()
    $counter -= 1
    ElseIf $counter = 2 Then
    GUICtrlSetData($status_L, "Initialize ... " & $counter)
    progress()
    $counter -= 1
    ElseIf $counter = 1 Then
    GUICtrlSetData($status_L, "Initialize ... " & $counter)
    progress()
    $counter -= 1
    ElseIf $counter = 0 Then
    GUICtrlSetData($status_L, "Ready ...")
    progress()
    $counter -= 1
    ElseIf $counter = -1 Then
    Dim $Bin = RegRead("HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion", "DigitalProductID")
    Dim $key4RegisteredOwner = "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion"
    $objWMIService = ObjGet("winmgmts:{impersonationLevel=impersonate}!\\.\root\cimv2")
    $colSettings = $objWMIService.ExecQuery ("Select * from Win32_OperatingSystem")

    [/autoit] [autoit][/autoit] [autoit]

    For $objOperatingSystem In $colSettings
    Next
    GUICtrlSetData($description_I, StringMid($objOperatingSystem.Description, 1))
    GUICtrlSetData($windowsType_I, '(' & @OSVersion & ') ' & StringMid($objOperatingSystem.Caption, 19))
    GUICtrlSetData($serialNumber_I, StringMid($objOperatingSystem.SerialNumber, 1))
    GUICtrlSetData($ProductKey_I, DecodeProductKey($Bin))
    GUICtrlSetData($InstallDate_I, WMIDateStringToDate($objOperatingSystem.InstallDate))
    GUICtrlSetData($LastBootUpTime_I, WMIDateStringToDate($objOperatingSystem.LastBootUpTime))
    GUICtrlSetData($RegisteredOwner_I, RegRead($key4RegisteredOwner, "RegisteredOwner"))
    GUICtrlSetData($officeKey_I, getOfficeKey())
    GUICtrlSetData($officeKey_L, "Office " & $product)
    $counter -= 1
    ElseIf $counter < -1 Then
    Select
    Case $msg = $GUI_EVENT_CLOSE
    GUICtrlSetState($progressbar, $GUI_HIDE)
    GUICtrlSetData($status_L, "CU Mega")
    Sleep(2000)
    ExitLoop
    EndSelect
    EndIf
    WEnd
    Exit

    [/autoit] [autoit][/autoit] [autoit]

    Func DecodeProductKey($BinaryDPID)
    Local $bKey[15]
    Local $sKey[29]
    Local $Digits[24]
    Local $Value = 0
    Local $hi = 0
    Local $n = 0
    Local $i = 0
    Local $dlen = 29
    Local $slen = 15
    Local $Result

    [/autoit] [autoit][/autoit] [autoit]

    $Digits = StringSplit("BCDFGHJKMPQRTVWXY2346789", "")
    $BinaryDPID = StringMid($BinaryDPID, 105, 30)
    For $i = 1 To 29 Step 2
    $bKey[Int($i / 2) ] = Dec(StringMid($BinaryDPID, $i, 2))
    Next
    For $i = $dlen - 1 To 0 Step - 1
    If Mod(($i + 1), 6) = 0 Then
    $sKey[$i] = "-"
    Else
    $hi = 0
    For $n = $slen - 1 To 0 Step - 1
    $Value = BitOR(BitShift($hi, -8), $bKey[$n])
    $bKey[$n] = Int($Value / 24)
    $hi = Mod($Value, 24)
    Next
    $sKey[$i] = $Digits[$hi + 1]
    EndIf
    Next
    For $i = 0 To 28
    $Result = $Result & $sKey[$i]
    Next
    Return $Result
    EndFunc ;==>DecodeProductKey

    [/autoit] [autoit][/autoit] [autoit]

    Func WMIDateStringToDate($dtmDate)
    Return (StringMid($dtmDate, 7, 2) & "/" & _
    StringMid($dtmDate, 5, 2) & "/" & StringLeft($dtmDate, 4) _
    & " " & StringMid($dtmDate, 9, 2) & ":" & StringMid($dtmDate, 11, 2) & ":" & StringMid($dtmDate, 13, 2))
    EndFunc ;==>WMIDateStringToDate

    [/autoit] [autoit][/autoit] [autoit]

    Func progress()
    If $counter = 3 Then
    For $i = 0 To 20 Step 1
    GUICtrlSetData($progressbar, $i)
    Sleep($wait / 20)
    Next
    ElseIf $counter = 2 Then
    For $i = 20 To 50 Step 1
    GUICtrlSetData($progressbar, $i)
    Sleep($wait / 30)
    Next
    ElseIf $counter = 1 Then
    For $i = 50 To 80 Step 1
    GUICtrlSetData($progressbar, $i)
    Sleep($wait / 30)
    Next
    ElseIf $counter = 0 Then
    For $i = 80 To 100 Step 1
    GUICtrlSetData($progressbar, $i)
    Sleep($wait / 20)
    Next
    GUICtrlSetState($progressbar, $GUI_SHOW)
    EndIf
    EndFunc ;==>progress

    [/autoit] [autoit][/autoit] [autoit]

    Func getOfficeKey()
    Local $List[1]
    Local $i = 1
    $var = RegRead("HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Office\11.0\Common\InstallRoot", "Path")
    If $var <> "" Then
    $product = "2003"
    Dim $officeKey = "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Office\11.0\Registration"
    Else
    $var = RegRead("HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Office\10.0\Common\InstallRoot", "Path")
    If @error <> 0 Then
    GUICtrlSetData($status_L, "Info: Unable to find installationPath, maybe no Office installed!")
    Return "No Office XP or 2003 found"
    EndIf
    If $var <> "" Then
    $product = "XP"
    Dim $officeKey = "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Office\10.0\Registration"
    EndIf
    EndIf
    Dim $var = RegEnumKey($officeKey, $i)
    If @error <> 0 Then
    GUICtrlSetData($status_L, "Info: Unable to find REG_BINARY 'DigitalProductID', maybe no Office installed!")
    Return "No Office XP or 2003 found"
    Else
    $List[$i - 1] = RegRead($officeKey & "\" & $var, "DigitalProductID")
    If $List[$i - 1] = "" Then
    GUICtrlSetData($status_L, "Info: Unable to find REG_BINARY 'DigitalProductID', maybe no Office installed!")
    Else
    $key = $List[$i - 1]
    Return DecodeProductKey($key)
    EndIf
    EndIf
    EndFunc ;==>getOfficeKey

    [/autoit]

    Mega

  • Ich habe mal grade das Skritp was Mega gepostet hat getestet und bei mir zeigt er alle Daten richtig an, alle Seriennummern passen.
    @Mega, nettes Tool :thumbup:

    Mfg
    Jens (McPoldy)

    Twitter: jkroeger

    Denn die Dinge, die wir erst lernen müssen, bevor wir sie tun, lernen wir beim Tun.(Aristoteles)

    • Offizieller Beitrag

    Ich habe mal grade das Skritp was Mega gepostet hat getestet und bei mir zeigt er alle Daten richtig an, alle Seriennummern passen.
    @Mega, nettes Tool :thumbup:

    Hi,

    danke. Das war einer der Gründe warum ich damals angefangen habe mit Autoit. Ich wollte gucken ob unsere Kunden die Systeme verunstaltet haben. :P

    Könnte man mal neu und schön machen ... aber siw.exe erledigt das ja alles.

    Mega


  • Könnte man mal neu und schön machen ... aber siw.exe erledigt das ja alles.

    Stimmt, aber für die Benutzung muss man ja wieder vor dem Rechner sein. Oder nicht? Habe mir das Tool nicht so genau angesehen.


    Zurück zum Thema:
    Habe mir heute morgen gleich mal einen der Rechner gegriffen und schon den Fehler gefunden. SIW.exe hat erstmal drei Office Installationen gefunden. Zwei konnte ich mir erklären. Auf dem Rechner war anfangs Basic drauf und dann hat jemand Professional drüber installiert. Die dritte Installation hieß nur "Unknown Microsoft Office 2003 SKU:". Das war genau die mit dem oft vorkommenden Key.
    Dann habe ich nochmal die Software CWSysinfo.exe ausprobiert, welche auch von Firmen kostenlos genutzt werden darf, und auch diese hat drei Installationen angezeigt. Sie war allerdings etwas schlauer und hat die Dritte identifiziert als "Microsoft Visio Viewer 2003". Und genau diesen installieren wir seit Benutzung der IOM bei uns überall mit. Das bedeutet das obige Script erwischt in dem Fall den falschen Key.

    Ich werd jetzt nochmal nen Testrechner nehmen und dort Office und Visio Viewer drauf installieren und dann sehen, dass ich den richtigen Key bekomme.

  • so fertig. Ist vielleicht nicht das Schönste, aber es geht.

    Spoiler anzeigen
    [autoit]


    $officeKeys=getOfficeKey()
    For $i=0 To Ubound($officeKeys)-1
    MsgBox(0,"",$officeKeys[$i][0] & ": " & $officeKeys[$i][1] )
    Next

    [/autoit] [autoit][/autoit] [autoit]

    Func getOfficeKey()
    Local $List[1][2]
    Local $i = 1
    Dim $pfad = ""
    Dim $version= ""
    Dim $var= ""
    $var = RegRead("HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Office\11.0\Common\InstallRoot", "Path")
    If $var <> "" Then
    $pfad = "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Office\11.0\Registration"
    EndIf
    If $pfad <> "" Then
    ;1. Pfad holen
    $var = RegEnumKey($pfad, $i)
    ;Schleife wiederholen, so lange es Installationen gibt
    While 1
    ;Ermitteln um welches Produkt es sich handelt
    $version = RegRead($pfad & "\" & $var, "ProductName")
    If $version = "" Then
    $version = "Unbekannte Version. Ggf. Visio Viewer"
    EndIf
    ;Produktkey ermitteln
    $key = RegRead($pfad & "\" & $var, "DigitalProductID")

    [/autoit] [autoit][/autoit] [autoit]

    ;Wenn $key nicht gefüllt ist, gibt es keiner weitere Installation mehr und das Array wird zurückgegeben
    If $key = "" Then
    Return $List
    Else
    ;Prüfen ob Array erweitert werden muss
    If $List[Ubound($List,1)-1][Ubound($List,2)-1] <> '' Then
    ReDim $List[Ubound($List,1)+1][Ubound($List,2)]
    EndIf
    ;Produktname in Array schreiben
    $List[$i - 1][0] = $version
    ;Produktkey in Array schreiben
    $List[$i - 1][1] = DecodeProductKey(RegRead($pfad & "\" & $var, "DigitalProductID"))
    EndIf
    $i=$i+1
    ;nächsten Pfad holen
    $var = RegEnumKey($pfad, $i)
    WEnd
    Return $List
    Else
    $List[0][0] = "Kein Office gefunden"
    $List[0][1] = ""
    Return $List
    EndIf
    EndFunc ;==>getOfficeKey

    [/autoit]

    Einmal editiert, zuletzt von nuely (28. Februar 2008 um 14:34)