Username auslesen bei Vista



  • Moin Moin,

    ich brauche für ein Programm, die Möglichkeit Username des jeweiligen Kontos auszulesen, ich wurde im Internet auch fündig, jedoch funktionierten die Codes da entweder garnicht oder nicht wie sie sollen. Also versuchte ich mich darin diese so abzuwandeln das es geht. Was mir gelang, aber nun standen hinter dem Username dann ein haufen eigenartiger Sonderzeichen.
    Demzufolge musste ein Filter rein der schaut ab wann die Sonderzeichen anfangen. Mein Problem ist nun, dass er anscheinend schon vor dem ersten Zeichen des Namens abbricht. Er gibt mir aus

    Username:
    Laenge: 0

    Hier der Quellcode, vielleicht haben meine noobigen Augen ja was übersehen oder ich hab's grundsätzlich falsch gemacht.

    int main()
    	{
    	char acUserName[100];
    	DWORD nUserName=sizeof(acUserName);
    	cout<<"Username: ";
    	string Name;
    	char SArray[70]={'a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z','ä','ö','ü','A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z','Ä','Ö','Ü','1','2','3','4','5','6','7','8','9','0','0'};
    	int length=0;
    	bool cp=false;
    	for(int i=0;i<100;++i)
    	{
    		for(int b=0;b<70;++b)
    		{
    			if(acUserName[i]!=SArray[b]&&cp==false)
    			{
    				length=i;
    				cp=true;
    			}
    		}
    	}
    	for(int i=0; i<length; ++i)
    	{
    		if(GetUserName((LPWSTR)acUserName,&nUserName))
    		{
    			if((LPWSTR)acUserName[i]!='\0')
    			{
    				cout<<acUserName[i];
    			}
    		}
    	}
    	cout<<"\nLaenge: "<<length<<endl;
    	system("pause");
            }
    

    MfG
    Snow 🙂





  • Du hast ganz klar ein Problem mit dem Durcheinander von ANSI und Unicode Zeichen!
    (d.h. das hat gar nix mit Vista zu tun)

    char acUserName[100]; //Das ist char (ANSI)
    
    if(GetUserName((LPWSTR)acUserName,&nUserName))
    

    mit LPWSTR castest Du auf Unicode (w = wide char)
    [cpp]
    Also entweder den Compiler auf Ansi umstellen, oder Dein Code und Deine Variablen auf Unicode (oder TCHAR) umstellen!

    HTH
    Martin



  • Mmacher schrieb:

    Du hast ganz klar ein Problem mit dem Durcheinander von ANSI und Unicode Zeichen!
    (d.h. das hat gar nix mit Vista zu tun)

    char acUserName[100]; //Das ist char (ANSI)
    
    if(GetUserName((LPWSTR)acUserName,&nUserName))
    

    mit LPWSTR castest Du auf Unicode (w = wide char)
    [cpp]
    Also entweder den Compiler auf Ansi umstellen, oder Dein Code und Deine Variablen auf Unicode (oder TCHAR) umstellen!

    HTH
    Martin

    Weisst du welches Argument ich da an den Compiler übergeben muss?

    *Edit: Ich habe in die Überschrift nur das mti Vista geschrieben weil ich nicht weiss in wie fern ein Unterschied im Auslesen des Namens unter Vista oder einem anderen beliebigem MS-BS besteht.



  • Ich würde gleich das char in wchar (oder alternativ TCHAR) ändern.

    Denn: Aktuelle Windows-Systeme (2k, XP, Vista, ... ) arbeiten intern nur noch mit Unicode-Zeichen.

    D.h. wenn Deine Applikation noch mit ANSI-char's arbeitet, werden diese Strings oder Zeichen bei jedem API-Aufruf intern erstmal in Unicode umgewandelt und bei Rückgabe natürlich wieder zurück in ANSI.

    Deshalb sollte man bei neuen Programmen besser gleich mit Unicode anfangen, um unnötige String-Konvertierungen zu vermeiden:

    wchar awcUserName[100]; //Das ist wide char (Unicode)
                            //D.h. Array kann 100 Unicode-Zeichen (inl. Nullterminirung!) aufnehmen und ist 200 Bytes "groß".
    

    Und der überflüssig gewordene cast-Operator (LPWSTR) kann entfallen, z.B.:

    if(GetUserName(awcUserName,&nUserName))
    

    Martin


Anmelden zum Antworten