![]() |
Re: Unicode Eingabe einlesen
Zitat:
Code:
Jetzt steht in principal wieder nur ein eckiges Kästchen drinne, anstatt der eingegebenen Zeichenkette. :wall:
int wmain(int argc, _CHAR* argv[])
{ WCHAR principal[80] = {0}; DWORD LastError; wprintf(INFO); wprintf(QUERYINPUT); wscanf(L"%S", principal); if (ERROR_SUCCESS == (LastError = GetStrSID(NULL, principal, principal))) { wprintf(L"%s", principal); } else { wprintf(L"Error %d", LastError); } getchar(); return 0; } PS: Ich bin hier in einer Domäne. Aber wenn ich einen lokalen Account angebe, sollte es doch funktionieren oder? PPS: Wo kann ich beim VS die Zielplattfiorm angegeben? Ich finde da nichts in den Projektoptionen. :gruebel: |
Re: Unicode Eingabe einlesen
Zitat:
Zitat:
Zitat:
Ich schaue nochmal ueber den Code und teste aus an einem lokalen Account. Paar Minuetchen. Muss ja wohl in GetStrSID() haengen. |
Re: Unicode Eingabe einlesen
Glaube ich nicht. Es hängt an der Eingabe, dass er da die Eingabe nicht richtig liest, warum auch immer.
Code:
Ich hatte auch schon WINNT=0x0500 bei den Präprozessiranweisungen hinzugefügt, das hat aber auch nicht geholfen. Und mit #define WINNT 0x0500 geht es auch nicht. Das kann doch einfach nicht so schwer sein. :wall:
#include "stdafx.h"
#include <windows.h> #define WINNT 0x0500 #define INFO L"Ausgabe der SIDs zu einem Principal\n" #define QUERYINPUT L"Principal (z.B. Benutzername): " DWORD GetStrSID(LPCWSTR server, LPCWSTR principal, WCHAR StrSID[80]) { PSID Sid = NULL; DWORD cbSize = 0; if (LookupAccountNameW(NULL, principal, NULL, &cbSize, NULL, NULL, NULL)) { if(Sid = PSID(new BYTE[cbSize])) { LPWSTR lpwszTemp = NULL; if(LookupAccountNameW(NULL, principal, Sid, &cbSize, NULL, NULL, NULL)) { if(ConvertSidToStringSidW(Sid, &lpwszTemp)) { // Fill with zeros memset(StrSID, 0, sizeof(StrSID)); // Copy string into buffer memcpy(StrSID, lpwszTemp, sizeof(StrSID) - sizeof(WCHAR)); // Free the string allocated by ConvertSidToStringSidW LocalFree(HLOCAL(lpwszTemp)); SetLastError(ERROR_SUCCESS); } wprintf(L"%i", cbSize); } delete Sid; } else { SetLastError(ERROR_NOT_ENOUGH_MEMORY); } } return GetLastError(); } int wmain(int argc, _TCHAR* argv[]) { WCHAR principal[80] = {0}; DWORD LastError; wprintf(INFO); wprintf(QUERYINPUT); wscanf(L"%S", principal); if (ERROR_SUCCESS == (LastError = GetStrSID(NULL, principal, principal))) { wprintf(L"%s", principal); } else { wprintf(L"Error %d", LastError); } getchar(); return 0; } |
Re: Unicode Eingabe einlesen
"#define _WIN32_WINNT 0x0500" (bzw. _WIN32_WINNT=0x0500)
Ich habe noch zwei subtile Dinge bei deinem Code uebersehen. 1. new fuer Arrays erfordert delete[], niemals delete! 2. new kann eine Exception werfen. Solltest du also danach noch im Zweifelsfall handeln. Uebrigens, wenn wir schon bei C++ sind, solltest du eventuell lieber I/O Streams benutzen und bei den Formatstrings sollte natuerlich die Puffergroesse Beachtung finden ... also 79 in unserem Fall. Bei mir liest er die Eingabe voellig korrekt. Also duerftest du nur wieder irgendwelche eigenen Aenderungen gemacht haben. Ich kapier nicht, wieso du nicht einfach meine Aenderungen 1:1 uebernimmst und dann als Ausgangspunkt nimmst. Aber ich mache ohnehin gerade noch ein paar Aenderungen. PSDK lesen hilft uebrigens ... die Funktionsaufrufe sind zT hanebuechen ... |
Re: Unicode Eingabe einlesen
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:
|
Re: Unicode Eingabe einlesen
Siehe Anhang mit EXE-Datei. Bitte mal testen ob er einen Fehler bringt. Bei mir kommt leider immer Fehler 1332 (ERROR_NONE_MAPPED), weshalb ich nicht weiter als bis zum ersten LookupAccountName komme :(
|
Re: Unicode Eingabe einlesen
Liste der Anhänge anzeigen (Anzahl: 1)
Autsch. Der letzte Fehler ging auf mich - dank pitti platsch - auf den ich ungeprueft gehoert hatte. Es muss naemlich nicht %S (was bei printf Unicode und bei wprintf ANSI bedeutet), sondern %ws heissen. (%S ist sozusagen immer der "entgegengesetzte" Stringtyp)
Danach funzt der Input und der Rest. Auf die Spur dessen bin ich dann auch erst gekommen, nachdem ich mal ein Literal uebergeben habe. Siehe Anhang mit EXE und Source. Ausser der Behandlung der Exceptions welche von new() geworfen werden koennten, wird eigentlich alles gecheckt. |
Re: Unicode Eingabe einlesen
Puh jetzt geht es endlich. Mann war das eine schwere Geburt. :? Jetzt muss ich mir nur noch angucken, was da genau passiert, um es zu verstehen.
Allerdings verstehe ich nicht, warum du da solche Probleme hattest, ich dachte so was machst du Tag täglich. :gruebel: |
Re: Unicode Eingabe einlesen
Zitat:
Zitat:
Ein Teil der Probleme ergab sich allerdings daraus, daß ich den Fehler eben an einer anderen Stelle vermutet hatte (nämlich beim Lookup). Aber durch deinen Hinweis bzgl. der Eingabe habe ich mich dann auf den anderen Teil gestürzt und prompt den Fehler gefunden. Übrigens gibt's im Kernelmode auch relativ selten Eingabeaufforderungen ... soviel zum tagtäglichen ... :zwinker: |
Re: Unicode Eingabe einlesen
OK, ich versuche dass dann noch mal mit Streams hinzubekommen, damit es ein sauberes C++ wird. Und dann poste ich es nochmal hier.
Irgendwann muss ich das doch mit den Zeichenketten und C/C++ in den Kopf bekommen. :wall: |
Alle Zeitangaben in WEZ +1. Es ist jetzt 05:14 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz