Computer Daten auslesen [Fehler beim schreiben in eine .txt]



  • Ich hab deine Rat befolgt!
    Ich nehme jetzt fstream und bleibe dann bei C++.
    Muss halt noch viel lernen und noch mehr fragen xD.

    #include <iostream>
    #include <fstream> 
    #include <windows.h>
    #include <conio.h>
    
    using namespace std;
    
    char Filename[20];
    
    int main()
    {
        //Computernamen ermitteln
        //**************************************************************************  
        char  ComputerName [MAX_COMPUTERNAME_LENGTH + 1];
        DWORD cbComputerName = sizeof ( ComputerName );
        if ( GetComputerName ( ComputerName, &cbComputerName ));
        //**************************************************************************
    
         //Systemdatum ermitteln  
        //**************************************************************************
        SYSTEMTIME tm;
        GetSystemTime(&tm); 
        //**************************************************************************
    
        //Test der Ausgabe
        //**************************************************************************
         cout << "Der Wert: " << ComputerName << endl;
         cout << "Das Datum: " << tm.wDay << "." << tm.wMonth << "." << tm.wYear << endl;
         //*************************************************************************
    
         //Eingabe des Dateinames
         //*************************************************************************
         cout << "Bitte den Dateinamen angeben: ";
         cin >> Filename;
         //*************************************************************************
    
         ofstream Computerdaten(Filename, ios::out);
         Computerdaten << ComputerName << " " << tm.wDay << "." << tm.wMonth << "." << tm.wYear << endl;
    
         getch();
    }
    

    So schaut das ganze bisher aus.
    Computername und das aktuelle Datum werden ermittelt und in eine Datei gespeichert. Coole Sache!

    Die nächste Fragen:
    Ich benötige noch die MAC-Adresse, den aktuell angemeldeten Benutzer und den Dell Service Tag.

    Der Service Tag wird wohl am schwirigsten werden.
    Habe da schon so manche Sachen drüber gelesen!
    Über die MSDN von Microsoft -> wurde ich aber nicht schlau draus!
    Irgendso ne Bios Klasse... ohne ordentliches Beispiel.
    Oder den Wert im Speicher auslesen. Dieser muss dann aber erst auf den virtuellen gemapped werden. Würd ich ja gern... kann ich nur noch nicht.
    Irgendeiner eine Idee? zu einer der 3 offenen Fragen???

    Schonmal danke!



  • Für den aktuell angemeldeten Benutzer kannst du die Funktion

    GetUserName(LPTSTR buffer, LPDWORD lpbufsize);
    

    verwenden, also zum Beispiel folgendermaßen:

    TCHAR username[256];
    DWORD dwbufferSize = sizeof(username);
    GetUserName(username, &dwBufferSize);
    std::cout << "Benutzername: " << username << std::endl;
    

    Außerdem würde ich noch vorschlagen, die Variable "Filename" lokal zu deklarieren und das getch(); am ende durch folgendes zu ersetzen (ist dann "schöneres" C++; außerdem brauchst du dann die "conio.h" nicht mehr):

    cin.clear();
    cin.ignore(numeric_limits<streamsize>::max(), '\n');
    cin.get();
    

    Zum Thema MAC-Adresse hab ich folgendes gefunden: http://www.codeguru.com/cpp/i-n/network/networkinformation/article.php/c5451

    Beim Service Tag kann ich dir nicht genau helfen



  • Hi, deine Funktion für den Benutzer funktioniert super!
    Danke!

    Hab auch die Schönheitsfehler korregiert und verwende jetzt am Ende ein cin.get();

    Für die MAC-Adresse hab ich ähnliche Vorschläge gefunden. Allerdings benötige ich noch die SDK-Platform, welche mir eben Probleme bereitet hat.

    Der Code sieht jetzt folgendermaße aus:

    #include <iostream>
    #include <fstream> 
    #include <windows.h>
    
    using namespace std;
    
    int main()
    {
        //Computernamen ermitteln
        //**************************************************************************  
        char  ComputerName [MAX_COMPUTERNAME_LENGTH + 1];
        DWORD cbComputerName = sizeof ( ComputerName );
        if ( GetComputerName ( ComputerName, &cbComputerName ));
        //**************************************************************************
    
         //Systemdatum ermitteln  
        //**************************************************************************
        SYSTEMTIME tm;
        GetSystemTime(&tm); 
        //**************************************************************************
    
        //Aktuell angemeldeten Benutzer herausfinden
        //**************************************************************************
        TCHAR username[256];
        DWORD dwBufferSize = sizeof(username);
        GetUserName(username, &dwBufferSize);
        //**************************************************************************
    
        //Test der Ausgabe
        //**************************************************************************
         std::cout << "Der Name des Computers ist: " << ComputerName << endl;
         std::cout << "Das aktuelle Datum ist: " << tm.wDay << "." << tm.wMonth << "." << tm.wYear << endl;
         std::cout << "Der Benutzername lautet: " << username << std::endl;
         std::cout << "" << endl;
         std::cout << "Die Daten werden in die " << ComputerName << " Datei gespeichert!" << endl;
         //*************************************************************************
    
         //Dateianlegen und mit Daten füllen
         //*************************************************************************
         ofstream Computerdaten(ComputerName, ios::out);
         Computerdaten << ComputerName << " " << tm.wDay << "." << tm.wMonth << "." << tm.wYear << " " << username << endl;
         //*************************************************************************
    
     cin.get();
     return 0; 
    }
    

    Noch eine kleine Denkfrage...
    Ich speichere momentan die Datei als "ComputerName" ab.
    Schön wäre "ComputerName.txt".
    Hab da schon etwas rumprobiert indem ich erstmal das ganze zu einem String mache und dort dann ein ".txt" dran hänge.
    Mit cout kann ich das ganze ausgeben.
    Als Dateinamen angeben funktioniert nicht.

    Mhm... gibts da ne einfache Lösung für?

    thx und gruß
    Last-Boyscout



  • Ich glaube, das was du suchst, ist die Funktion c_str() 🙂

    Also:

    string outfile = ComputerName + ".txt";
    ofstream Computerdaten(outfile.c_str(), ios::out); // anstatt ofstream Computerdaten(outfile, ios::out);
    


  • Deli1 schrieb:

    Ich glaube, das was du suchst, ist die Funktion c_str() 🙂

    Also:

    string outfile = ComputerName + ".txt";
    ofstream Computerdaten(outfile.c_str(), ios::out); // anstatt ofstream Computerdaten(outfile, ios::out);
    

    So was ähnliches habe ich schon probiert.

    Bekomme aber diese Fehlermeldung:
    invalid operands of types `char[16]' and `const char[5]' to binary `operator+'

    gruß
    Last-Boyscout



  • Last-Boyscout schrieb:

    Deli1 schrieb:

    Ich glaube, das was du suchst, ist die Funktion c_str() 🙂

    Also:

    string outfile = ComputerName + ".txt";
    ofstream Computerdaten(outfile.c_str(), ios::out); // anstatt ofstream Computerdaten(outfile, ios::out);
    

    So was ähnliches habe ich schon probiert.

    Bekomme aber diese Fehlermeldung:
    invalid operands of types `char[16]' and `const char[5]' to binary `operator+'

    gruß
    Last-Boyscout

    datentypen anpasssen.
    gruß
    t.l.w.



  • Wie 😉

    Oder besser gesagt, wie mach ich das richtig?

    gruß
    Last-Boyscout



  • Hab gerade keinen Compiler hier. Das geht in etwa so:

    string ComputerName;
    ComputerName.resize(MAX_COMPUTERNAME_LENGTH + 2);
    DWORD cbComputerName = MAX_COMPUTERNAME_LENGTH +1;
    if ( GetComputerName ( &ComputerName[0], &cbComputerName ) == false )
    {
        cout << "Kagge!" << endl;
        ComputerName.clear();
    }
    else
    ComputerName += ".txt";
    

    Geht aber nur gut, wenn du nicht Unicode compilierst. Sonst gibts eventuell nen Pufferüberlauf ( 1 wchar_t Zeichen benötigt mehr Bytes als ein char ). Besser, gleich TCHAR nehmen, bzw. wstring.



  • es ist illegal direkt in den string einzulesen!!! du musst den umweg über ein std::vector gehen!!!



  • !!! schrieb:

    es ist illegal direkt in den string einzulesen!!! du musst den umweg über ein std::vector gehen!!!

    Kommt dann die Bohlizei? 😃

    Habe festgestellt, das bei meinem Beispiel Schrott rauskommt. Hier ne Korrektur:

    string computer_name;
    	char buf[MAX_COMPUTERNAME_LENGTH +1] = {0};
    	DWORD cbComputerName = sizeof(buf); 
    	if ( GetComputerNameA ( buf, &cbComputerName ) == false ) 
    	{ 
    		cout << "Kagge!" << endl; 
    		return 1;
    
    	} 
    	else 
    	{
    		computer_name = buf;
    		cout << computer_name << " is a computer !" << endl;
    		computer_name += ".txt";
    	}
    
    	cout << "I am a textfile name now :( " <<  computer_name << endl;
    
    	return 0;
    

    Nen vector kann man sich sparen. MfG,
    t.l.w.



  • Nen vector kann man sich sparen.

    nur wenn man gegen den c++ standard anproggt 😃



  • achso hast jetzt ein char array genommen. dann ist es ja okay.



  • class Win32_BIOS : CIM_BIOSElement
    {
      uint16   BiosCharacteristics[];
      string   BIOSVersion[];
      string   BuildNumber;
      string   Caption;
      string   CodeSet;
      string   CurrentLanguage;
      string   Description;
      string   IdentificationCode;
      uint16   InstallableLanguages;
      datetime InstallDate;
      string   LanguageEdition;
      String   ListOfLanguages[];
      string   Manufacturer;
      string   Name;
      string   OtherTargetOS;
      boolean  PrimaryBIOS;
      datetime ReleaseDate;
      string   SerialNumber;
      string   SMBIOSBIOSVersion;
      uint16   SMBIOSMajorVersion;
      uint16   SMBIOSMinorVersion;
      boolean  SMBIOSPresent;
      string   SoftwareElementID;
      uint16   SoftwareElementState;
      string   Status;
      uint16   TargetOperatingSystem;
      string   Version;
    };
    

    Hi, mir fehlen noch die Infos zum Service Tag von Dell.
    Ich habe hier eine Bios Klasse von der MSDN von Microsoft.
    Bräuchte aber noch Hilfe mit dem Umgang damit.

    Eigentlich interessiert mich da der string Serial Number am meisten!^^

    Wie binde ich diese Klasse überhaupt richtig an, sodass ich die Elemente richtig ansprechen kann?



  • Last-Boyscout schrieb:

    class Win32_BIOS : CIM_BIOSElement
    {
      uint16   BiosCharacteristics[];
      string   BIOSVersion[];
      string   BuildNumber;
      string   Caption;
      string   CodeSet;
      string   CurrentLanguage;
      string   Description;
      string   IdentificationCode;
      uint16   InstallableLanguages;
      datetime InstallDate;
      string   LanguageEdition;
      String   ListOfLanguages[];
      string   Manufacturer;
      string   Name;
      string   OtherTargetOS;
      boolean  PrimaryBIOS;
      datetime ReleaseDate;
      string   SerialNumber;
      string   SMBIOSBIOSVersion;
      uint16   SMBIOSMajorVersion;
      uint16   SMBIOSMinorVersion;
      boolean  SMBIOSPresent;
      string   SoftwareElementID;
      uint16   SoftwareElementState;
      string   Status;
      uint16   TargetOperatingSystem;
      string   Version;
    };
    

    Hi, mir fehlen noch die Infos zum Service Tag von Dell.
    Ich habe hier eine Bios Klasse von der MSDN von Microsoft.
    Bräuchte aber noch Hilfe mit dem Umgang damit.

    Eigentlich interessiert mich da der string Serial Number am meisten!^^

    Wie binde ich diese Klasse überhaupt richtig an, sodass ich die Elemente richtig ansprechen kann?

    Hat einer dazu eine Idee?
    Hab gegoogelt, verschiedene Threads angeguckt und finde jedesmal ein schönes vb.net Beispiel.

    strComputer = "."
    Set objWMIService = GetObject("winmgmts:" _
    & "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")
    
    Set colBIOS = objWMIService.ExecQuery _
    ("Select * from Win32_BIOS")
    
    For each objBIOS in colBIOS
    Wscript.Echo "Build Number: " & objBIOS.BuildNumber
    Wscript.Echo "Current Language: " & objBIOS.CurrentLanguage
    Wscript.Echo "Installable Languages: " & objBIOS.InstallableLanguages
    Wscript.Echo "Manufacturer: " & objBIOS.Manufacturer
    Wscript.Echo "Name: " & objBIOS.Name
    Wscript.Echo "Primary BIOS: " & objBIOS.PrimaryBIOS
    Wscript.Echo "Release Date: " & objBIOS.ReleaseDate
    Wscript.Echo "Serial Number: " & objBIOS.SerialNumber
    Wscript.Echo "SMBIOS Version: " & objBIOS.SMBIOSBIOSVersion
    Wscript.Echo "SMBIOS Major Version: " & objBIOS.SMBIOSMajorVersion
    Wscript.Echo "SMBIOS Minor Version: " & objBIOS.SMBIOSMinorVersion
    Wscript.Echo "SMBIOS Present: " & objBIOS.SMBIOSPresent
    Wscript.Echo "Status: " & objBIOS.Status
    Wscript.Echo "Version: " & objBIOS.Version
    For i = 0 to Ubound(objBIOS.BiosCharacteristics)
    Wscript.Echo "BIOS Characteristics: " & _
    objBIOS.BiosCharacteristics(i)
    Next
    Next
    

    Sowas habe ich leider aber nicht ansatzweise in C++ gefunden.
    Hat da keiner eine Idee?

    gruß
    Last-Boyscout



  • Hallo,

    das ist etwas komplizierter in C++, siehe z.B. unter "BIOS Seriennummer mit WMI auslesen (Win32_BIOS-Klasse)" hier:

    http://fatman98.fa.funpic.de/builder_tricks.php

    Musst du natürlich etwas anpassen (AnsiString gibt's z.B. nicht in Visual C++), und die richtigen Header einbinden usw...

    MfG,

    Probe-Nutzer


Anmelden zum Antworten