Announcement

Collapse
No announcement yet.

BIOS-Datum unter XP auslesen?

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • BIOS-Datum unter XP auslesen?

    Hallo,

    unter Win98SE konnte ich das BIOS-Datum durch einen Direktzugriff auf dessen Adresse auslesen (Datum:=String(PChar(PTR($FFFF5)))).
    Bei dem gleichen Versuch unter XP wird aber eine Exception ausgelöst. Kann man das unter XP nicht mehr?
    Wie macht man das unter XP? (In der Registry möchte ich nicht nachgucken, weil die Daten gerade zum Bios da nicht immer stimmen!)

    (Das gleiche gilt übrigens auch für alle anderen bekannten Biosadressen!)

    Gruß
    Matthias

  • #2
    Hallo,

    >Wie macht man das unter XP

    über die Klassen von WMI (Windows Management Instrumentation). WMI ist eine universelle Treiberschicht, die Informationen aus den unterschiedlichsten Bereichen (Hardware, Treiber, BIOS, Anwendungseinstellungen, Ereignisanzeige usw.) bereitstellen kann, indem alle diese Detail-APIs verborgen und durch ein univerelles API ersetzt werden. Ein Anwendungsentwickler muss sich nur noch in ein API (WMI) einarbeiten, um die verschiedenen Aufgaben erfüllen zu können. WMI steht ab Windows 2000 sofort zur Verfügung, unter Windows 9x und Windows NT 4 jedoch nur als optional nachinstallierbare Komponente.

    Die WMI-Klasse <b>Win32_BIOS</b> stellt die Attribute des BIOS dar, die auf dem Computer installiert sind.

    Wenn mit .NET gearbeitet wird, ist die Sache dank der Klassen aus dem Namespace <i>System.Mangement</i> ganz einfach (hinter <i>Bios1</i> verbirgt sich die vom .NET Framework beim Zugriff automatisch generierte .NET-Komponente vom Type ROOT.CIMV2.BIOS):
    <pre>
    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    MessageBox.Show(Bios1.ReleaseDate.ToString())
    End Sub
    </pre>
    Wenn mit Delphi 5/6/7 gearbeitet wird, greift man am elegantesten über die die Typbibliothek <i>Microsoft WMI Scripting V 1.1 Library</i> zu, um von Delphi die VCL-Wrapperklassen generieren zu lassen. Die Suche nach der Zeichenkette <b>ISWbemServices</b> sollte hier im FORUM eine Handvoll Delphi-Beispiele für WMI finden

    Comment


    • #3
      Oder über die Funktion GetBIOSDate aus der Jedi.

      Diese Funktion verläßt sich jedoch darauf, das die entsprechenden Infos in der Registry stehen, hat aber den Vorteil das sie ohne Installation auf dem Client-PC funktionieren sollte

      Comment


      • #4
        Hallo,<br>

        @Andreas: Eine Frage und ein Hilferuf:<br>
        Bei mir ist die entsprechende Unit WbemScriptig_TLB.Pas. Da finde ich aber nichts zum Bioas drin. Was mache ich falsch?<br>
        Und nun der Hilferuf: Ich habe ausversehen diese TLB (?) aus der Liste der in Delphi angezeigten gelöscht.<br>
        Woher kriege ich die wieder? (Genauer: Welche Datei verbirgt sich dahinter?)<br>

        Gruß
        Matthia

        Comment


        • #5
          Hallo,

          &gt;Was mache ich falsch?

          Nichts - aber den Komport der automatisch generierten Komponente gibt es nur in der .NET-Welt, da dort das .NET-Framework das Teil je nach Wunsch in den Sprachen C# oder VB.NET zusammenbaut. In der "alten Welt" müssen wir mit Delphi direkt mit den WMI-Klassen hantieren und die WQL-Abfrage (WMI Query Language) <b>SELECT ReleaseDate FROM Win32_BIOS</b> auf die Klasse abschicken. Das folgende Beispiel demonstriert dies:
          <pre>
          uses ActiveX;

          procedure TForm1.Button1Click(Sender: TObject);
          var
          aSrv : ISWbemServices;
          aObjSet : ISWbemObjectSet;
          vNVS : OleVariant;
          aNVSDummy : IDispatch;
          pEnum : IEnumVARIANT;
          vOut : OleVariant;
          dwRetrieved : LongWord;
          hRes : HResult;
          vValue : OleVariant;
          begin
          aSrv := SWbemLocator1.ConnectServer('','','','','','',0,vN VS);
          aObjSet := aSrv.ExecQuery('SELECT ReleaseDate FROM Win32_BIOS',
          'WQL', 0, aNVSDummy);
          pEnum := aObjSet.Get__NewEnum as IEnumVARIANT;
          while (TRUE) do
          begin
          hRes := pEnum.Next(1, vOut, dwRetrieved);
          if hRes <> S_OK then
          Break;
          ListBox1.Items.Add(VarToStr(vOut.ReleaseDate));
          end;
          end;
          </pre>

          &gt;Woher kriege ich die wieder?

          Über den Menüpunkt <i>Projekt | Typbibliothek importieren...</i>, indem der Eintrag <i>Microsoft WMI Scripting V 1.1 Library</i> ausgewählt und dann der Button <i>Installieren</i> bei angekreuzter Wrapper-Checkbox angeklickt wird. Delphi generiert dann die Komponente <b>TSWbemLocator</b>, die in meinem Beispiel als <i>SWbemLocator1</i> über den <b>ConnectServer</b>-Aufruf die Verbindung zum lokalen WMI herstellt. Ab diesem Punkt gibt es dann aber mit Delphi keine weitere Unterstützen - so dass der Zugriff über WQL am universellsten (und einfachsten) ist. Anstelle WQL könnte man aber auch direkt mit den Eigenschaften der Klasse hantieren - aber das ist dann weniger universell

          Comment


          • #6
            Hallo Andreas,

            vielen Dank für das Beispiel. (Und für Deine Bücher!)
            Probiere ich gleich aus, weil ich die Unit ja noch habe.
            Aber:
            Ich habe ja was schlimmeres vollbracht!
            Im Fenster zum Importieren der Typbibliothek gibt es doch unterhalb der Listbox zwei Schalter: "Hinzufügen..." und "Löschen". Da habe ich das Scripting gelöscht. Das wieder hinzuzufügen ist kein Proble - wenn man weiß, in welcher Datei das Ding steckt. Und genau das weiß ich nicht und suche mir inzwischen die Finger wund...
            Normalerweise wird die Datei bei Anwahl in der Listbox ja sogar angezeigt. Kannst Du mir sagen, in welcher Datei das Scripting steckt?

            Vielen Dank!
            Matthia

            Comment


            • #7
              Hallo Andreas,<br>

              Dein Beispiel klappt natürlich einwandfrei. Ich habe nur das Problem,<br>
              dass ich nicht weiß, wie ich das als Datum interpretieren soll.<br>
              Bei mir zeigt er "20010402******.******+***" an.<br>

              Außerdem möchte ich natürlich auch noch alle anderen Bios-Daten, die man bekommen kann.<br>
              Und wenn schon WMI, von dem ich bisher gar nichts wusste, denn schon etwas genauer drauf gucken!<br>
              Wo findet man denn eine Beschreibung zur WMI (für Delphi)?<br>
              Dann würde ich mich schon durchfressen...<br>

              Danke!<br>
              Matthia

              Comment


              • #8
                Hallo,

                &gt;..welcher Datei das Scripting steckt?

                In <b>wbemdisp.TLB</b> aus dem <i>System32\wbem</i>-Unterverzeichnis von Windows.

                &gt;..RelaseDate...

                Auf der Hilfesseite <i>Platform SDK: Windows Management Instrumentation | Win32_BIOS</i> wird der folgende Aufbau dokumentiert:
                <pre>
                ReleaseDate
                Data type: datetime
                Access type: Read-only
                Release date of the Windows BIOS in the Coordinated Universal Time (UTC) format of YYYYMMDDHHMMSS.MMMMMM(+-)OOO.
                </pre>

                &gt;..Wo findet man denn eine Beschreibung zur WMI?

                in der Hilfe zum <i>Microsoft Platform SDK</i> (ca. 200 MByte CHM-Hilfedateien), auf der DVD der <i>MSDN Library</i> oder auf der MSDN-Webseite <i>http://msdn.microsoft.com/library/default.asp</i> - wobei allerdings die lokalen Hilfedateien wegen der Suchoption deutlich effektiver sind :-)

                &gt;..(für Delphi)?

                Da gibt es meines Wissens nach nichts.

                P.S: WMI ist ständig am wachsen. WMI ist Plattformunabhängig, ein Hardware-Hesteller liefert nur eine Textdatei im Managed Object Format (MOF) aus und das Betriebssystem baut daraus eine WMI-Klasse, die im Fall von Windows unter Win32 nur über die späte Bindung abrufbar ist. Erst in der .NET-Welt kann das Framework aus diesen Informationen eine komplette Klasse generieren, die alles über Properties und Methoden veröffentlicht

                Comment


                • #9
                  Hallo Andreas,<br>

                  vielen Dank! Alles wieder da und das Datum ist natürlich auch inzwischen "decodiert"<br>.
                  Mein "20010402******.******+***" ist natürlich der 02.04.2001.<br>
                  In einem js-Quelltext wir allerdings vom Monat noch 1 abgezogen. Warum, weiß ich nicht.<br>
                  Andererseits stimmt das Datum nicht mit dem beim Systemstart (und in der Registry eingetragenen)<br>
                  Datum überein. Leider ist auch das Feld "InstallDate" nicht anders ausgefüllt - womit wir da wären,<br>
                  dass die Bios-Infos doch sehr bruchstückhaft sind. Name, Description und Caption lauten bei mir<br>
                  z. Bsp. alle "Version 1.00".<br>
                  Allerdings kann das auch ein Fehler des Biosherstellers (AMI) sein. Wir werden sehen...<br>

                  Ich weiß zwar leider nicht. wie ich die DVD bekommen kann, aber das ist nicht weiter schlimm.<br>
                  Sie dürfte auf jeden Fall den Rahmen meines privaten Budgets um einiges sprengen.<br>

                  Nun muss ich leider erst mal ins Krankenhaus. Danach geht's weiter...<br>

                  Gruß<br>
                  Matthia

                  Comment


                  • #10
                    Ich habe für dieses Problem eine Unit geschrieben, die das ROM-BIOS unter allen Win32-Versionen (auch ohne WMI) aulesen kann.<br>
                    Im Beispiel Projekt wird auch gezeigt, wie man die SMBIOS-Informationen ausliest anstatt hartcodierte Offsets zu verwenden (F000:FFF5 ist zwar üblich, aber nicht standardisiert - bei einigen ist es F000:FFF6).

                    http://www.bendlins.de/nico/delphi/ <br>
                    BiosHelp (aktuell v2.1)

                    - nic

                    Comment

                    Working...
                    X