[c++] unerklärlicher fehler beim Dateieinlesen

Big_Bertinator

Grünschnabel
Mein Problem ist folgendes, ich verwende Dev C++ und lass mit mit einer erstellten Bat Datei die SID des Users in eine .txt Datei speichern. Doch diese Datei wird nur fehlerhaft ausgelesen.

PHP:
char buffer[1000];
             char sid[50];
             
                       
             system("wmic useraccount where name=\"\%USERNAME\%\" >safe.txt");     
             
                       
             cmd=fopen("safe.txt", "rb"); 
             //if(cmd != NULL)
             //{
                            fscanf(cmd,"%1000c",buffer);
             //}
             fclose(cmd);
             
             remove("safe.txt");               
     
             cout<<buffer<<endl;
     
             system("pause");
     
             for(int i=0;i<1000;i++)
             {
                     if(buffer[i]=='S' && buffer[i+1]=='-' && buffer[i+2]=='1' && buffer[i+3]=='5' && buffer[i+4]=='-')
                     {
                                     for(int j=0;j<50;j++)
                                     {
                                                          if(buffer[i]!=' ')
                                                          {
                                                                          buffer[i]=sid[j];
                                                                          i++;
                                                          }
                                                          else
                                                          {
                                                                          break;
                                                          }
                                     }
                     }
             }
             cout<<sid<<endl;
 
Hi.

Du schreibst groß [c++] in die Titelzeile - warum verwendest du denn zum Dateiauslesen C?

Du versuchst dort 1000 Zeichen einzulesen. Was ist denn wenn gar nicht 1000 Zeichen in der Datei drin stehen? Es wird ja auch kein \0 Terminierungszeichen angehängt, so das du nicht weißt wieviel Zeichen überhaupt eingelesen wurden. Wieso verarbeitest du dann alle 1000 Zeichen aus buffer? Das funktioniert spätestens für i = 996 nicht mehr da du dann auf
Code:
buffer[996 + 4] == buffer[1000]
zugreifst - und dieses Element gibt es im Array gar nicht.

Um ein Wort aus einer Datei in C++ zu lesen:
C++:
#include <fstream>

ifstream file("safe.txt");

if (file.is_open()) {
  string sid;
  
  if (file >> sid) {
    cout << sid << endl;
  }
  file.close();
}

Evtl. solltest du einfach die WinAPI Funktionen LookupAccountNameetc. verwenden.

Gruß
 
Danke schon mal für deine Hilfe deepthroat.

Also das mit dem null Terminieren hatte ich schon im Code, aber weil ich nicht wuste warum der das nun nicht ausliest, hatte ich es als test rausgenommen und vergessen wieder reinzunehmen.

Wie du auch mitbekommen hast, bin ich noch ein Anfänger in C++. Doch mein Problem besteht immer noch, es werden nur die ersten Zeichen ausgelsen und nicht die ganze Datei.

Ich würde auch eine WinAPI Funktion nehmen, aber kann ich die überhaupt bei Dev C++ verwenden?
 
Doch mein Problem besteht immer noch, es werden nur die ersten Zeichen ausgelsen und nicht die ganze Datei.
Evlt. solltest du dein Problem mal besser erklären. ;-] Wie sieht die Ausgabe des wmic Befehls aus? Diese Ausgabe müßtest du dann parsen.
Ich würde auch eine WinAPI Funktion nehmen, aber kann ich die überhaupt bei Dev C++ verwenden?
Dev C++ hat damit wenig zu tun - das ist ja nur ein Editor. Dev C++ nutzt den MinGW GCC Compiler und dieser bietet auch ein winapi32 Paket. Falls dies installiert ist und du erfolgreich die windows.h Headerdatei einbinden kannst, dann kannst du selbstverständlich auch WinAPI Funktionen aufrufen.

Die LookupAccountName Funktion benötigt allerdings mindestens Windows 2000, so das du die Präprozessorvariable WINVER mindestens auf den Wert 0x0501 setzen mußt bevor du die Headerdatei windows.h einbindest:
C++:
#define WINVER  0x0501

#include <windows.h>
Außerdem mußt du noch die Bibliothek advapi32 zu deinem Program dazulinken. (siehe MSDN)

Gruß
 
Evlt. solltest du dein Problem mal besser erklären. Wie sieht die Ausgabe des wmic Befehls aus? Diese Ausgabe müßtest du dann parsen.

Du hast recht, also mein Endziel ist es die SID des angemeldeten Users in eine Variable zu haben.
Ich bin selber schon so weit gekommen, dass ich mit dem befehl
Code:
system("wmic useraccount where name=\"\%USERNAME\%\" >safe.txt");
die Aktuelle SID des Users in eine Text Datei stehen habe(safe.txt).
Der Inhalt sieht dann so aus
Code:
AccountType  Caption                 Description  Disabled  Domain   FullName  InstallDate  LocalAccount  Lockout  Name            PasswordChangeable  PasswordExpires  PasswordRequired  SID                                             SIDType  Status  
512          Roba-PC\Robert Schütte               FALSE     Roba-PC                         TRUE          FALSE    Robert Schütte  TRUE                FALSE            FALSE             S-1-5-21-2263729207-3534893018-2719823131-1000  1        OK
diese Datei wollte ich auslesen, und dann herausfiltern. Doch beim auslesen bekomme ich nur das in die Variable
Code:
?A c c o u n t T y p e

Ich muss nun zur lösung meines Problemes nun die Datei richtig auslesen können, oder die "Funktion LookupAccountName" benutzen, doch durch diese steige ich als Anfänger nicht durch.
 
Hi.
Ich bin selber schon so weit gekommen, dass ich mit dem befehl
Code:
system("wmic useraccount where name=\"\%USERNAME\%\" >safe.txt");
die Aktuelle SID des Users in eine Text Datei stehen habe(safe.txt).
Der Inhalt sieht dann so aus
Code:
AccountType  Caption                 Description  Disabled  Domain   FullName  InstallDate  LocalAccount  Lockout  Name            PasswordChangeable  PasswordExpires  PasswordRequired  SID                                             SIDType  Status  
512          Roba-PC\Robert Schütte               FALSE     Roba-PC                         TRUE          FALSE    Robert Schütte  TRUE                FALSE            FALSE             S-1-5-21-2263729207-3534893018-2719823131-1000  1        OK
diese Datei wollte ich auslesen, und dann herausfiltern. Doch beim auslesen bekomme ich nur das in die Variable
Code:
?A c c o u n t T y p e
Offensichtlich speichert wmic die Datei im Unicode (UCS-2) Format. Da müßtest du mit wide-character Unterstützung arbeiten. Dies wird von der MinGW C++ Bibliothek leider noch nicht unterstützt.
Ich muss nun zur lösung meines Problemes nun die Datei richtig auslesen können, oder die "Funktion LookupAccountName" benutzen, doch durch diese steige ich als Anfänger nicht durch.
Versuch's mal hiermit:
C++:
#define WINVER 0x0501

#include <windows.h>
#include <tchar.h>
#include <sddl.h>
#include <Lmcons.h>

#include <cstring>
#include <cstdio>

/*
 * 
 */
int main() {
    DWORD szAccount = UNLEN + 1;
    TCHAR lpAccountName[szAccount];

    if (!GetUserName(lpAccountName, &szAccount)) {
        // could not determine users account name
        return 1;
    }
    
    DWORD cbSid = 0;
    DWORD cchDomain = 0;
    SID_NAME_USE use;

    // at first, determine the required buffer size:

    // note: the function will fail anyways -- no need to check its return value
    LookupAccountName(NULL, lpAccountName, NULL, &cbSid, NULL, &cchDomain, &use);

    if (GetLastError() == ERROR_INSUFFICIENT_BUFFER) { // check the error code
        // allocate the necessary memory:

        BYTE* sid = new BYTE[cbSid];
        LPTSTR domain = new TCHAR[cchDomain];

        // after allocating enough memory, call the function again:

        if (LookupAccountName(NULL, lpAccountName, sid, &cbSid, domain, &cchDomain, &use)) {
            // convert SID structure to printable representation:

            LPTSTR string_sid;
            if (ConvertSidToStringSid(sid, &string_sid)) {
                _putts(string_sid);

                LocalFree(string_sid);
            }
        }
        delete[] domain;
        delete[] sid;
    } else {
        _tprintf(TEXT("first call failed: %d\n"), GetLastError());
    }
}
Gruß
 
Danke für deine Hilfe deepthroat,

Nun weiß ich erstmal warum ich die Datei nicht einlesen konnte und zweitens wie ich nun die SID bekomme.

Kann nun endlich weiter programmieren thx.
 
Zurück