Script per ricavare informazioni sul sistema

Tramite WMI e il Registry è possibile ricavare semplicemente informazioni sul sistema quali:

  • Versione
  • Data di installazione
  • Dati di registrazione
  • Informazioni sull’attivazione
  • Product Key

Di seguito un esempio di script che di solito adopero per esaminare le installazioni:

Option Explicit
On Error Resume Next

Dim message

message = “*** Operating System Info ***”

Dim objOS

For Each objOS in GetObject( _
    “winmgmts:”).InstancesOf(“Win32_OperatingSystem”)

  message = message & VBCR _
    & “Name = ” & objOS.Caption & Trim( ” ” & objOS.CSDVersion) & VBCR _
    & “Version = ” & objOS.Version & VBCR _
    & “Registered User = ” & objOS.RegisteredUser & VBCR _
    & “Organization = ” & objOS.Organization  & VBCR _
    & “Serial Number = ” & objOS.SerialNumber & VBCR _
    & “Install Date = ” & WMIDateStringToDate(objOS.InstallDate) & VBCR _
    & “Build Info =” & objOS.BuildNumber & ” ” & objOS.BuildType
Next

Set objOS = Nothing

message = message & VBCR & VBCR _
  & “*** Windows Product Activation (WPA) Info ***”

Dim objWPA, installationID

For Each objWPA in GetObject( _
    “winmgmts:”).InstancesOf(“Win32_WindowsProductActivation”)

  objWPA.GetInstallationID(installationID)

  message = message & VBCR _
    & “Activation Required = ” & IIF(objWPA.ActivationRequired = 1, “Yes”, “No”) & VBCR _
    & “Remaining Grace Period = ” & IIF(objWPA.ActivationRequired = 1, objWPA.RemainingGracePeriod, “-“)
Next

Set objWPA = Nothing

message = message & VBCR & VBCR _
  & “*** CD Key ***”

Const DigitalProductIdKey=”HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\DigitalProductId”

Dim wshShell
Set WshShell = CreateObject(“wscript.Shell”)
message = message & VBCR _
  & DecodeDigitalProductID(WshShell.RegRead(DigitalProductIdKey))

WScript.Echo message

if Err <> 0 Then
    WScript.Echo Err.Description
    Err.Clear
End if

Private Function IIf( expr, truepart, falsepart )
  IIF = falsepart
  If expr Then IIf = truepart
End Function

Function WMIDateStringToDate(date)
  WMIDateStringToDate = _
  CDate(Mid(date, 5, 2) & “/” & _
  Mid(date, 7, 2) & “/” & _
  Left(date, 4) & ” ” & _
  Mid (date, 9, 2) & “:” & _
  Mid(date, 11, 2) & “:” & _
  Mid(date, 13, 2))
End Function

Function DecodeDigitalProductID(id)
  Const idOffset=52
  Const Digits=”BCDFGHJKMPQRTVWXY2346789″

  Dim i,intAccumulator,j,strProductKey

  i=28

  Do
    intAccumulator=0 : j=14

    Do
      intAccumulator=intAccumulator*256
      intAccumulator=id(j+idOffset)+intAccumulator
      id(j+idOffset)=(intAccumulator\24) and 255 
      intAccumulator=intAccumulator Mod 24
      j=j-1
    Loop While j>=0

    i=i-1
    strProductKey=mid(Digits,intAccumulator+1,1) & strProductKey

    if (((29-i) Mod 6)=0) and (i<>-1) then
      i=i-1
      strProductKey=”-” & strProductKey
    End If

  Loop While i>=0

  DecodeDigitalProductID=strProductKey
End Function

Di seguito un esempio dell’output:

image

Per la codifica della data di installazione ho preferito utilizzare una funzione di decodifica anche se sarebbe stato possibile utilizzare la classe WbemScripting.SWbemDateTime, che però è disponibile solo a partire da Windows XP, per ulteriori informazioni si veda Hey, Scripting Guy! It’s About Time (Oh, and About Dates, Too).

Ho utilizzato On Error Resume Next per consentire la visualizazione delle informazioni anche in caso di possibili errori.