none
Detect which motherboard and run appropriate BIOS update command.

    Question

  • Hi there.

    I am attempting to write a script which will detect which motherboard is in a machine and then will run the appropriate BIOS update command.

    This script will run from Windows PE 2.1

    I know I can fairly easily write a script with a bunch of commands and use system( to execute them.

    the problem is getting the motherboard model #.

    There are alot of utilities which will give this information but I dont know if I can "parse" that information from the utility.

    I basically need something that works in DOS and just returns the motherboard model number, or some sort of WMI method.

    anyone have any ideas?

    Thanks!

    Andy 
    Thursday, December 04, 2008 3:51 PM

Answers

  • Hi, try modifying this (assuming wmi, vbscript and your bios update utility are available from your preboot environment)...

    Option Explicit  
    Dim objFSO, wshNetwork, scriptBaseName  
    Set objFSO     = CreateObject("Scripting.FileSystemObject")  
    Set wshNetwork = CreateObject("Wscript.Network")  
    scriptBaseName = objFSO.GetBaseName(Wscript.ScriptFullName)  
    On Error Resume Next 
       ProcessScript  
       If Err.Number <> 0 Then 
          MsgBox "An Unknown Error occurred!", vbCritical, scriptBaseName  
          Wscript.Quit  
       End If 
    On Error Goto 0  
    '----------------------------------------------------------------------------------------------------  
    Function ProcessScript  
       Dim hostName, model  
       hostName = wshNetwork.ComputerName  
       If Not EnumerateMotherBoardModel(hostName, model) Then 
          Exit Function 
       End If 
       If Not UpdateSystemBios(hostName, model) Then 
          Exit Function 
       End If 
    End Function 
    '-----------------------------------------------------------------------------------------------------  
    'Name       : EnumerateMotherBoard -> Enumerates the motherboard model on the specified hostname.  
    'Parameters : hostName             -> Hostname of computer system to enumerate the motherboard model.  
    '           : model                -> Output : variable that is assigned the system motherboard model.  
    'Return     : EnumerateMotherBoard -> Returns False or True and the model of the systems motherboard.  
    '-----------------------------------------------------------------------------------------------------  
    Function EnumerateMotherBoardModel(hostName, model)  
       Dim wmi  
       Dim items, item  
       EnumerateMotherBoardModel = False 
       On Error Resume Next 
          Set wmi   = GetObject("winmgmts:\\" & hostName & "\root\cimv2")  
          Set items = wmi.ExecQuery("Select model From Win32_ComputerSystem")  
          If Err.Number <> 0 Then 
             Exit Function 
          End If 
          For Each item In items  
             model = item.model  
          Next 
       On Error Goto 0  
       EnumerateMotherBoardModel = True 
    End Function 
    '-----------------------------------------------------------------------------------------------------  
    'Name       : ProcessSystem -> Enumerates the motherboard model on the specified hostname.  
    'Parameters : hostName      -> Hostname of computer system to enumerate the motherboard model.  
    '           : model         -> String containing the model name of the systems motherboard.  
    'Return     : ProcessSystem -> Returns False or True and the model of the systems motherboard.  
    '-----------------------------------------------------------------------------------------------------  
    Function UpdateSystemBios(hostName, model)  
       MsgBox "Insert your code in this Function to update the " & model & " motherboard BIOS on " & _  
               hostName, vbInformation, scriptBaseName  
    End Function 
    '----------------------------------------------------------------------------------------------------- 

    Hope that helps...

    Cheers :)
    Thursday, December 04, 2008 11:37 PM
    Moderator

All replies

  • Hi, try modifying this (assuming wmi, vbscript and your bios update utility are available from your preboot environment)...

    Option Explicit  
    Dim objFSO, wshNetwork, scriptBaseName  
    Set objFSO     = CreateObject("Scripting.FileSystemObject")  
    Set wshNetwork = CreateObject("Wscript.Network")  
    scriptBaseName = objFSO.GetBaseName(Wscript.ScriptFullName)  
    On Error Resume Next 
       ProcessScript  
       If Err.Number <> 0 Then 
          MsgBox "An Unknown Error occurred!", vbCritical, scriptBaseName  
          Wscript.Quit  
       End If 
    On Error Goto 0  
    '----------------------------------------------------------------------------------------------------  
    Function ProcessScript  
       Dim hostName, model  
       hostName = wshNetwork.ComputerName  
       If Not EnumerateMotherBoardModel(hostName, model) Then 
          Exit Function 
       End If 
       If Not UpdateSystemBios(hostName, model) Then 
          Exit Function 
       End If 
    End Function 
    '-----------------------------------------------------------------------------------------------------  
    'Name       : EnumerateMotherBoard -> Enumerates the motherboard model on the specified hostname.  
    'Parameters : hostName             -> Hostname of computer system to enumerate the motherboard model.  
    '           : model                -> Output : variable that is assigned the system motherboard model.  
    'Return     : EnumerateMotherBoard -> Returns False or True and the model of the systems motherboard.  
    '-----------------------------------------------------------------------------------------------------  
    Function EnumerateMotherBoardModel(hostName, model)  
       Dim wmi  
       Dim items, item  
       EnumerateMotherBoardModel = False 
       On Error Resume Next 
          Set wmi   = GetObject("winmgmts:\\" & hostName & "\root\cimv2")  
          Set items = wmi.ExecQuery("Select model From Win32_ComputerSystem")  
          If Err.Number <> 0 Then 
             Exit Function 
          End If 
          For Each item In items  
             model = item.model  
          Next 
       On Error Goto 0  
       EnumerateMotherBoardModel = True 
    End Function 
    '-----------------------------------------------------------------------------------------------------  
    'Name       : ProcessSystem -> Enumerates the motherboard model on the specified hostname.  
    'Parameters : hostName      -> Hostname of computer system to enumerate the motherboard model.  
    '           : model         -> String containing the model name of the systems motherboard.  
    'Return     : ProcessSystem -> Returns False or True and the model of the systems motherboard.  
    '-----------------------------------------------------------------------------------------------------  
    Function UpdateSystemBios(hostName, model)  
       MsgBox "Insert your code in this Function to update the " & model & " motherboard BIOS on " & _  
               hostName, vbInformation, scriptBaseName  
    End Function 
    '----------------------------------------------------------------------------------------------------- 

    Hope that helps...

    Cheers :)
    Thursday, December 04, 2008 11:37 PM
    Moderator
  • Hey...if you want to extend the script to run the bios update command too then try modifying this...
     
    (i don't know the command syntax of your bios update utility so you would need to edit the "command" variable in the UpdateSystemBios function to match the correct command syntax)

    Once you have the command syntax the script will then run that command using the shell object for you and prompt you if it was sucessful.

    you may want to consider increasing the "timeOut" variable from "60" seconds to a few minutes depending on how long it normally takes for your bios to update and include all the motherboard models you have in your company that your bios update utility supports within the case statement...

    Option Explicit  
    Dim objFSO, wshNetwork, wshShell, scriptBaseName  
    Set objFSO     = CreateObject("Scripting.FileSystemObject")  
    Set wshShell   = CreateObject("Wscript.Shell")  
    Set wshNetwork = CreateObject("Wscript.Network")  
    scriptBaseName = objFSO.GetBaseName(Wscript.ScriptFullName)  
    On Error Resume Next 
       ProcessScript  
       If Err.Number <> 0 Then 
          MsgBox "An Unknown Error occurred!", vbCritical, scriptBaseName  
          Wscript.Quit  
       End If 
    On Error Goto 0  
    '-----------------------------------------------------------------------------------------------------  
    'Name       : ProcessScript -> Primary Function that controls all other script processing.  
    'Parameters : None          ->   
    'Return     : None          ->  
    '----------------------------------------------------------------------------------------------------  
    Function ProcessScript  
       Dim hostName, model  
       hostName = wshNetwork.ComputerName  
       If Not EnumerateMotherBoardModel(hostName, model) Then 
          Exit Function 
       End If 
       If Not UpdateSystemBios(hostName, model) Then 
          Exit Function 
       Else 
          MsgBox "The BIOS was successfully updated on " & hostName, vbInformation, scriptBaseName  
       End If 
    End Function 
    '-----------------------------------------------------------------------------------------------------  
    'Name       : EnumerateMotherBoard -> Enumerates the motherboard model on the specified hostname.  
    'Parameters : hostName             -> Hostname of computer system to enumerate the motherboard model.  
    '           : model                -> Output : variable that is assigned the system motherboard model.  
    'Return     : EnumerateMotherBoard -> Returns False or True and the model of the systems motherboard.  
    '-----------------------------------------------------------------------------------------------------  
    Function EnumerateMotherBoardModel(hostName, model)  
       Dim wmi  
       Dim items, item  
       EnumerateMotherBoardModel = False 
       On Error Resume Next 
          Set wmi   = GetObject("winmgmts:\\" & hostName & "\root\cimv2")  
          Set items = wmi.ExecQuery("Select model From Win32_ComputerSystem")  
          If Err.Number <> 0 Then 
             Exit Function 
          End If 
          For Each item In items  
             model = item.model  
          Next 
       On Error Goto 0  
       EnumerateMotherBoardModel = True 
    End Function 
    '-----------------------------------------------------------------------------------------------------  
    'Name       : UpdateSystemBios -> Enumerates the motherboard model on the specified hostname.  
    'Parameters : hostName         -> Hostname of computer system to update the BIOS on.  
    '           : model            -> String containing the model name of the systems motherboard.  
    'Return     : UpdateSystemBios -> Returns True or False.
    '-----------------------------------------------------------------------------------------------------  
    Function UpdateSystemBios(hostName, model)  
       Dim command, timeOut  
       UpdateSystemBios = False 
       timeOut = "60" 
       Select Case model  
          Case "Tecra S1" 
             command = "UpdataBios.exe /h " & hostName & " /f:X:\biosUpdates\tecraS1.bin" 
          Case "D865GLC" 
             command = "UpdataBios.exe /h " & hostName & " /f:X:\biosUpdates\D865GLC.bin"
          Case Else
             Exit Function
       End Select 
       If Not RunCommand(command, timeOut) Then 
          Exit Function 
       End If 
       UpdateSystemBios = True 
    End Function 
    '-----------------------------------------------------------------------------------------------------  
    'Name       : RunCommand -> Executes a command.  
    'Parameters : command    -> String of the command to execute.  
    '           : timeout    -> Timeout value in seconds to wait for the command to complete.  
    'Return     : RunCommand -> Returns True if command was successful else returns False.  
    '-----------------------------------------------------------------------------------------------------  
    Function RunCommand(command, timeOut)  
       Dim waited, result  
       RunCommand = False 
       waited     = 0  
       On Error Resume Next 
          Set result = wshShell.Exec(command)  
          If Err.Number <> 0 Then 
             Exit Function 
          End If 
       On Error Goto 0  
       Do Until result.status = 1 Or (waited >= timeOut And timeOut > 0)  
          Wscript.Sleep 1000  
          waited = waited + 1000  
       Loop 
       RunCommand = True 
    End Function 
    '----------------------------------------------------------------------------------------------------- 

    Hope that helps

    Cheers :)
    Friday, December 05, 2008 12:37 AM
    Moderator