Computer Daten auslesen [Fehler beim schreiben in eine .txt]
-
**Hi,
also zum kurzen Verständnis:**
Ich möchte ein Programm schreiben welches beim ausführen den "Rechnernamen", "Service Tag", "aktuelles Datum", "MAC-Adresse" und den "Angemeldeter Benutzer" auf dem eingesetzten Rechner erkennt, ausliest und in ein Textdokument zur weiteren Verarbeitung speichert.
Erstmal klein anfangen:
Den Rechnernamen und das aktuelle Datum kann ich bereits auslesen.
Den Rechnernamen kriege ich auch in ein Textdokument gespeichert.Allerdings habe ich das Problem das ich das Datum nicht gespeichert kriege.
invalid conversion from `WORD' to `const charIch weiß aber auch nach googlen und FAQ lesen nicht wie ich den Typen umwandeln kann.
Hier der bisherige Code:
#include <iostream> #include <windows.h> #include <conio.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); //************************************************************************** cout << "Der Wert: " << ComputerName << endl; cout << "Das Datum: " << tm.wDay << " " << tm.wMonth << " " << tm.wYear << endl; //Werte in ein Textdokument übertragen //************************************************************************** freopen ("Computername.txt","w",stdout); //Datei anlegen/ überschreiben printf (ComputerName); //Wird in die Datei geschrieben printf (tm.wDay); //geht nicht fclose (stdout); //Schließen //************************************************************************** getch(); }
Wahrscheinlihc liegt mein Problem aber ganz woanders^^ und mir fehlt nur das nötige Hintergrundwissen.
gruß
Last-Boyscout
-
wie wärs, wenn du dich für eine sprache festlegst, c oder c++. dieses mixen ist kagge.
hmmm...ja und printf schreibt auf stdout, d.h. ins konsolenfenster und nicht in eine datei. für dateien gibt es fprintf.
fprintf ist eine c-funktion. wennze die nehmen willst, dann guck mal nach was ein formatstring ist.
-
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-Boyscoutdatentypen 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