HP Bioseinstellung mit WMI ändern

  • Hallo Gemeinde,

    weiss jemand wie man auf HP-Rechnern eine BIOS-Einstellung via WMI ändern kann bei gesetztem Admin-PWD?
    der folgende Code(die Option TPM Activation Policy soll auf "No Prompts" geändert werden) geht jedenfalls nicht:

    Bei Google finde ich leider nur Powershell-Beispiele. ;( Klar könnte ich das HP-Eigene Tool nutzen aber ich will lernen die Einstellungen direkt per wmi zu machen...
    UND: Für den mir vorgegebenen Einsatzzweck ist Powershell keine Lösung weil es die Runtimes dazu in unserem WINPE(und zwar unabänderlich!!!!) nicht gibt.

  • Nachtrag:

    Ich bin mit meiner Recherche etwas weiter gekommen:

    so sieht der funktionierende VBS-Code aus:

    Kann mir jemand sagen wie ich das in AutoIt korrekt "übersetze"?
    Mein Code führt immer zum Fehler 4 was "Failed" bedeutet.

  • Hallo!

    Ich kann Dir nicht direkt weiterhelfen, aber wir verwenden um die HP-Bios upzudaten bzw. auch die TPM-Settings zu machen ein Powershellscript. Vielleicht kannst Du da was heraus verwenden:

    Sledgehammer

    lg

    Racer

  • Hallo Racer,

    vielen lieben Dank für deine Antwort. Leider kann ich hierfür kein Powershell benutzen, weil die Runtimes dazu in unserer POE-Umgebung fehlen.
    Des weiteren benutzt PS dazu Commandlets, deren Code ich bis jetzt nicht finden konnte. Das Commandlet Getbios-... z.B. ist ja unter Autoit nicht nutzbar.
    da müsste ich erst mal den hinterlegten Code auch noch erst übersetzen. Da wäre das Umsetzen von VBS viel einfacher.

    Leider scheine ich aber i-was zu übersehen. Denn wie gesagt das VBS-Script funzt. Nur meine "Übersetzung" geht immer auf Fehler 4 (Failed)

    Kann jemand Helfen :?::?::?:

  • hipfzwirgel Hinweis: Sofern hinter deinm utf16 string ein Passwort kommt, solltest du das auch in Beitrag #2 im ersten Beispiel Code raus nehmen, denn dort steht es in Klartext drin!

    Tipp: Warum baust du dir deinen String so kompliziert zusammen?

    AutoIt
    ;Dein Code
    Local $strRequest = '"TPM Activation Policy"' & "," & '"No prompts"' & "," & "<utf-16/>" & $sPwd2
    
    ;Etwas besser lesbarer Code
    Local $strRequest = '"TPM Activation Policy","No prompts",<utf-16/>' & $sPwd2
    
    ;Je nach Handhabung ggf. auch mal so:
    Global $strRequest = '"TPM Activation Policy",' & _
                         '"No prompts",' & _
                         '<utf-16/>' & $sPwd2

    An welcher Stelle wird dir denn der Fehler ausgegeben?

    Einmal editiert, zuletzt von Moombas (29. Juni 2022 um 11:47)

  • Moin!

    Code
    objItem.SetBiosSetting oReturn, _
                           "TPM Activation Policy", _
                           "No prompts", _
                           "<utf-16/>itrepair"

    Wenn mich meine VBS-Erinnerungen nicht täuschen, sehe ich da oben 4 Parameter:

    1. eine nicht im eingestellten Scriptcode definierte Variable oReturn
    2. den String "TPM Activation Policy"
    3. den String "No prompts"
    4. und den String "<utf-16/>itrepair"
  • Moombas

    Ok, dann ergibt sich für mich daraus:

    AutoIt
    If IsObj($colItems) Then
        For $objItem In $colItems
            $strReturn = $objItem.SetBiosSetting("TPM Activation Policy", "No prompts", "<utf-16/>" & sPwd2) ; drei Parameter
        Next
    EndIf

    Edit: Überzähliges ' entfernt!

    Einmal editiert, zuletzt von Velted (29. Juni 2022 um 16:26) aus folgendem Grund: Code-Tag -> AUtoIt

  • Das wäre auch meine Idee, da ich aber mich weder besonders gut mit den Objekten noch mit deren Umgang auskenne, habe ich mich diebezüglich hier zurück gehalten.

  • Hallo Moombas,
    hallo Velted,

    zunächst vielen lieben Dank, das ihr euch dem Thema angenommen habt.

    Leider funktionieren die von euch vorgeschlagenen Lösungen ebenfalls nicht. Ich bekomme als Fehlermeldung immer Failed(=4) egal wie ich den Code umstelle.
    Der Vorschlag von Velted mit $strReturn = $objItem.SetBiosSetting... führt auch dazu, das die Rückgabewerte nicht stimmen.
    Damit kommt also die Methode SetBiosSetting scheinbar nicht zurecht


    Hätte vielleicht noch jemand eine Idee? Es scheint der Aufruf des Objektes zu sein, denn wenn die Parameter falsch wären, müsste Invalid Parameter kommen und nicht Failed
    Hier nochmal mein Code den ich um den Switch ergänzt habe. Dadurch wird in der Ausgabe auch der zur Fehlerzahl zugeordnete Text ausgegeben:

  • Hast Du es mal so probiert:

  • Hallo Oscar,

    leider funzt dein Vorschlag auch nicht. Auch da bekomme ich Failed.
    Ich habe eben die Methode SetBIOSSetting mit dem WMIexplorer getestet. Da war der Aufruf mit

    "TPM Activation Policy", "No prompts", "<utf-16/>"Passwort erfolgreich.

    Selbst wenn ich den Aufruf SetBiosSetting mit totalem Nonsens aufrufe(z.B. anderer BIOS-Parameter mit falschem Value) bekomme ich Failed.

    Da sollte dann eig. not Supportedd, Invalid Parameter oder sonst was kommen...

    Was macht AutoIt, dass es damit nicht geht :?:


    ;(;(;(

  • Da war der Aufruf mit

    "TPM Activation Policy", "No prompts", "<utf-16/>"Passwort erfolgreich.

    Wenn das der Fall ist, ändere deinen Code:

    Code
    ;Deins:
    Local $strRequest = '"TPM Activation Policy"' & "," & '"No prompts"' & "," & "<utf-16/>" & $sPwd2
    
    ;Versuch mal:
    Local $strRequest = '"TPM Activation Policy","No prompts","<utf-16/>"' & $sPwd2
  • Hallo Moombas,

    danke vielmals für deinen Versuch aber auch da kommt Failed. So wie ich das sehe liegt das nicht an der Parameterzeile sondern am Aufruf SetBiosSetting itself oder an der Objekterzeugung
    Denn wenn ich, wie schon gesagt, den Aufruf mit komplettem Nonsens starte kommt ja ebenfalls Failed. Daraus schleiße ich, das die Parameter gar nicht ausgewertet werden.
    Es müsste ja bei falschen Parametern "Invalid Parameter" kommen. Ich interpretiere, das Autoit warum auch immer die Methode nicht ausgeführt bekommt...

    Nur WARUM :?:

  • Laut folgendem (https://www.autoitscript.com/forum/topic/15…-to-a-wmi-call/) müsste Oscars Variante andersherum sein:

    AutoIt
    ;Oscar:
    $objItem.SetBiosSetting($strReturn, "TPM Activation Policy", "No prompts", "<utf-16/>" & $sPwd2)
    
    ;Laut oben genanntem Link:
    $strInParamValue = '"TPM Activation Policy","No prompts","<utf-16/>"' & $sPwd2
    $objItem.SetBiosSetting($strInParamValue, $strReturn)

    Andererseits wäre laut https://www.autoitscript.com/forum/topic/14…ript-to-autoit/ Oscars Variante korrekt... ich bin verwirrt.

  • HP BIOS Settings

    HP BIOS Settings Management

    PowerShell
    #Set a specific value for a specific setting when a BIOS password is set
    $Interface.SetBIOSSetting("PARAMETER","VALUE","<utf-16/>" + "Password")

    Somit muss deine Befehlszeile lauten, wie in @Oscars Bsp.

    Es müsste ja bei falschen Parametern "Invalid Parameter" kommen.

    Kommt drauf an, wie du "falsch" interpretierst:

    For reference, these are the possible return codes for the SetBIOSSetting method:

    • 0 – Success
    • 1 – Not Supported
    • 2 – Unspecified Error
    • 3 – Timeout
    • 4 – Failed (Usually caused by a typo in the setting value)
    • 5 – Invalid Parameter
    • 6 – Access Denied (Usually caused by an incorrect BIOS password)

    Was durch die Return Codes jedoch nicht abgedeckt wird, ist ein möglicher Security Konflikt. Rechte Probleme im Bereich der BIOS Manipulation (durch ein AutoIt-Skript) könnte ich mir gut vorstellen

    Configuring WMI Security

    HP Client Management Interface Technical White Paper

  • Moin,

    wenn Return tatsächlich der erste Parameter des Methodenaufrufs ist, wären es 4 Parameter und @Oscars Vorschlag sollte eigentlich funktionieren:

    Code
            $objItem.SetBiosSetting($strReturn, "TPM Activation Policy", "No prompts", "<utf-16/>" & $sPwd2)

    Wenn ich mir allerdings die anderen Beispiele so ansehe, habe ich Zweifel, ob $SB_UTF16BE die korrekte Codierung liefert.

    Code
    $sPwd2 = StringToBinary($sPwd2, $SB_UTF16BE) ; <- nach UTF-16 oder so
  • hipfzwirgel Was ist wenn du dir via Powershell einfach mal ausgibst was überhaupt möglich ist? Siehe dazu: https://www.configjon.com/hp-bios-settings-management/

    Shau auch mal hier: http://h20331.www2.hp.com/Hpsub/downloads/cmi_whitepaper.pdf

    Demnach solltest du kein Komma, sondern Leerzeichen nutzen, also:

    AutoIt
    $objItem.SetBiosSetting($strReturn, '"TPM Activation Policy" "No prompts" "<utf-16/>' & $sPwd2 & '"')

    Einmal editiert, zuletzt von Moombas (1. Juli 2022 um 11:44)

  • Aus Beitrag #16:

    Code
    [implemented] void SetBIOSSetting(  
    [out, ...] uint32 Return,
    [in] string Name,
    [in] string Value,
    [in, optional] string Password); 

    Für den Namensraum root\HP\InstrumentedBios hat die Methode SetBIOSSetting 4 Parameter. Der letzte ist optional und wird nicht benötigt, wenn kein BIOS-Passwort vergeben wurde. Der Rückgabewert Return ist eine Zahl (32 Bit ohne Vorzeichen).

    Im Netz findet man auch Beispiele mit 2 Parametern, die beziehen sich aber nicht auf HP. Für Lenovo z.B gibt es den Aufruf SetBIOSSetting($strRequest, $strReturn).

    Moombas : Das von Dir gefundene Beispiel mit den Leerzeichen bezieht sich auf die Parameterübergabe für ein Batch-Script.