In C: Win-Systemaufruf in String speichern



  • Hi,

    Habe folgendes Problem:
    Ich möchte einen WINAPI-Systemaufruf z.B. systeminfo oder whoami in einen String abspeichern um mit diesen dann im Programm arbeiten zu können und das in C.

    Gefunden hatte ich zwar was mit popen(), aber irgendwie stand das immer im Zusammenhang mit Linux/Unix-Systemen.

    Suche also eine "saubere" Lösung oder einen Lösungsansatz zu dem Problem.

    Danke schon mal.

    Gruß
    Evil



  • Deine Beschreibung ist ziemlich wirr. Das was Du beschreibst hat AFAICT nichts mit dem zu tun, was popen macht.

    Ich versuch's trotzdem mal: Suchst Du LoadLibrary/GetProcAddress? Aber das ist nichts für Anfänger.



  • SG1 schrieb:

    Deine Beschreibung ist ziemlich wirr. Das was Du beschreibst hat AFAICT nichts mit dem zu tun, was popen macht.

    Ich versuch's trotzdem mal: Suchst Du LoadLibrary/GetProcAddress? Aber das ist nichts für Anfänger.

    Hey,

    ich verstehe das ein bissle anders. So wie ich das verstehe will er den output von cmdline Tools parse.

    Man koennte "CreateProcess" nutzen, aber eigentich solltest du die jeweilige Funktion, die die gewuenschten Daten bereit haelt, aufrufen.
    Im Fall von "whoami": "GetUserNameEx"

    Gruessle



  • Ich bin eher auf Microcontrollern zu hause, bei solchen Dingen mit Betriebsystemen etc. besitze ich gefährliches Halbwissen ;)... Ich werde versuchen nochmal meine Problematik zu verdeutlichen:

    wenn ich in meinem C-Programm, welches bei mir eine consolen-Anwendung (also Ausgabe nur über cmd) ist, zum Beispiel den Befehl system("whoami") ausführe käme ja in der cmd console als Ausgabe der Computername oder so. und diese Information würde ich im Programm gerne auswerten und verwenden. Also irgendwie in einen String speichern.

    hier mein erster Ansatz:
    strcpy([MeinString],"system("whoami");");
    das geht allerdings nicht 😞

    und wichtig kein C++ sondern in "reinem" C.



  • EviloKnievel schrieb:

    wenn ich in meinem C-Programm, welches bei mir eine consolen-Anwendung (also Ausgabe nur über cmd) ist, zum Beispiel den Befehl system("whoami") ausführe käme ja in der cmd console als Ausgabe der Computername oder so. und diese Information würde ich im Programm gerne auswerten und verwenden. Also irgendwie in einen String speichern.

    Ein Beispiel:

    #include <windows.h>
    #include <stdio.h>
    #include <string.h>
    
    int main( void )
    {
        char   psBuffer[128] = {0};
    	char Username[256] = {0};
        char Message[65536] = {0};
    
        FILE   *pPipe;
    
        pPipe = _popen( "echo %USERNAME%", "rt" );		// = whoami
        if( !pPipe ) exit( 1 );
        while(fgets(psBuffer, 128, pPipe)) strcat(Username,psBuffer);
        _pclose (pPipe);
    	*strpbrk(Username, "\r\n") = 0; // 1. Zeilenvorschub wird Stringende;
    
        pPipe = _popen( "systeminfo", "rt" );
        if( !pPipe ) exit( 1 );
        while(fgets(psBuffer, 128, pPipe)) strcat(Message, psBuffer);
        _pclose (pPipe);
    
        MessageBox (NULL, Message, Username, MB_OK);
    
        return 0;
    }
    

    viele grüße
    ralph

    P.S: also, ich hatte Deine Frage schon am Anfang kapiert.



  • Hallo und nochmal herzlichen Dank an Euch. Funktioniert genauso wie ich mir das vorgestellt habe, danke ralph :).

    Ein kleines Problem habe ich allerdings noch und zwar starte ich ja meinprogramm.exe ja immer als 32-bit Anwendung egal ob ich mich auf einem 64-bit oder 32-bit System befinde, zumindestens ist das bei mir so.

    Nun habe ich folgendes bemerkt...

    win 7 (64-bit) --> cmd.exe (64) --> start c:\windows\system32\telnet.net --> programm startet kein Problem

    win 7 (64-bit) --> meinprogramm.exe (32) --> system("start c:\windows\system32\telnet.net") --> telnet.exe kann nicht gefunden weden usw...

    Lösung wäre c:\windows\sysnative\telnet.exe dann gehts aber warum? Also was bewirkt da "sysnative". Ich meine telnet.exe ist doch in system32.

    Ich hoffe es stellt kein Problem da, dass ich kein neues Thema eröffnet habe.

    MfG
    Evil

    EDIT:
    Und habe ich damit dann Kompatibilität in allen OS's (in meinem Fall: XP (32), XP (64), Vista, 7, 8)? Oder muss ich eine Abfrage nach 32 bit oder 64 bit machen und je nach dem sysnative oder system 32 öffnen?



  • Ruf telnet.exe doch einfach ohne absolute Pfadangabe auf?

    Statt _popen kann man auch CreateProcess verwenden:
    http://msdn.microsoft.com/en-us/library/windows/desktop/ms682499(v=vs.85).aspx

    (Hinweis: telnet ist in neueren Windows-Versionen häufig nicht mehr installiert und muss über Programme+Funktionen ggf. nachinstalliert werden)



  • hi geeky,

    (Hinweis: telnet ist in neueren Windows-Versionen häufig nicht mehr installiert und muss über Programme+Funktionen ggf. nachinstalliert werden)

    Ja das ist mir bekannt, genau deshalb rufe ich telnet nicht mit system("telnet") auf sondern absolut. Da hierbei nichts nachinstalliert werden muss, denn telnet.exe ist immer im system32 Ordner vorhanden ob installiert oder nicht.

    EDIT: okay ich war mir eigentlich sicher das es so war ... aber stimmt nicht


Anmelden zum Antworten