![]() |
Re: Unicode Eingabe einlesen
Ich glaube das war dann wmain. Muesstest du dir mal die Definition fuer _tmain anschauen.
|
Re: Unicode Eingabe einlesen
So. So sieht es bisher aus:
Code:
Allerdings kennt er die API-Funktion ConvertSidToStringSidW nicht, obwohl ich die Sddl.h eingebunden und die Advapi32.lib mit gelinkt wird. Benutzen tue ich das Visual Studio 2005.
#include "stdafx.h"
#include <windows.h> #include <Sddl.h> #define INFO _T("Ausgabe der SIDs zu einem Principal\n") #define QUERYINPUT _T("Principal (z.B. Benutzername): ") DWORD GetStrSID(LPCWSTR server, LPCWSTR principal, LPWSTR &StrSID) { // SID ermitteln und in lesbare Form umwandeln // in StrSID zurückgeben PSID Sid; DWORD cbSize = 0; if (LookupAccountNameW(NULL, principal, NULL, &cbSize, NULL, NULL, NULL)) { Sid = (PSID) new BYTE[256]; LookupAccountNameW(NULL, principal, Sid, &cbSize, NULL, NULL, NULL); //ConvertSidToStringSidW(Sid, StrSID); delete Sid; } return GetLastError(); } int wmain(int argc, _TCHAR* argv[]) { WCHAR principal[80], *StrSID = principal; DWORD LastError; wprintf(INFO); wprintf(QUERYINPUT); wscanf(L"%s", &principal); wprintf(L"%s\n", principal); LastError = GetStrSID(NULL, principal, StrSID); if (LastError == 0) { wprintf(L"%s", StrSID); } else { wprintf(L"%i", LastError); } getchar(); return 0; } Ich habe die Funktion erstmal auskommentiert, aber trotzdem kommt es noch zu einer AV beim Aufruf von if (LookupAccountNameW(NULL, principal, NULL, &cbSize, NULL, NULL, NULL)). |
Re: Unicode Eingabe einlesen
Es muss wscanf(L"%S", &principal); und nicht wscanf(L"%s", &principal); heißen also ein "%S" statt "%s".
Mit "%s" ließt man char* ein. Mit "%S" wchar_t* |
Re: Unicode Eingabe einlesen
Wenn ich das grosse S nehme, dann kommt in der Funktion GetStrSID nur Mist an.
Ich habe jetzt mal die standard Aufrufkonvention in den Projekteigenschaften von __cdecl auf __stdcall umgestellt, aber das hilft leider auch nicht. |
Re: Unicode Eingabe einlesen
Zitat:
Zitat:
Code:
in der sddl.h hattest du aber gesehen?
#if(_WIN32_WINNT >= 0x0500)
|
Re: Unicode Eingabe einlesen
Den Adressoperator hatte ich noch übersehen. Mit %S und ohne Adressoperator geht es jetzt. Und ich bekomme auch keine AV mehr. Allerdings ist cbSize immer null:
Code:
DWORD GetStrSID(LPCWSTR server, LPCWSTR principal, LPWSTR &StrSID)
{ // SID ermitteln und in lesbare Form umwandeln // in StrSID zurückgeben PSID Sid; DWORD cbSize = 0; LookupAccountNameW(NULL, principal, NULL, &cbSize, NULL, 0, NULL); if (cbSize > 0) { Sid = (PSID) new BYTE[256]; LookupAccountNameW(NULL, principal, Sid, &cbSize, NULL, 0, NULL); wprintf(L"%i", cbSize); //ConvertSidToStringSidW(Sid, StrSID); delete Sid; } return GetLastError(); } Zitat:
Mann ist das kompliziert. :roll: |
Re: Unicode Eingabe einlesen
Liste der Anhänge anzeigen (Anzahl: 1)
... bla bla bla ...
Code:
Den ersten Teil kannste weglassen wenn du die korrekte Zielplatform (mind. W2K waehlst). ConvertSidToStringSid, das steht auch in der Doku (PSDK) alloziert den String selber, was du gemacht hast, war also gelinde gesagt Mist.
#include <stdio.h>
#include <tchar.h> #include <Windows.h> #ifndef ConvertSidToStringSid #ifdef __cplusplus extern "C" { #endif BOOL WINAPI ConvertSidToStringSidA( IN PSID Sid, OUT LPSTR *StringSid ); BOOL WINAPI ConvertSidToStringSidW( IN PSID Sid, OUT LPWSTR *StringSid ); #ifdef UNICODE #define ConvertSidToStringSid ConvertSidToStringSidW #else #define ConvertSidToStringSid ConvertSidToStringSidA #endif // !UNICODE #ifdef __cplusplus }; #endif #endif // ConvertSidToStringSid #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); } } delete Sid; } else { SetLastError(ERROR_NOT_ENOUGH_MEMORY); } } return GetLastError(); } int __cdecl _tmain(int argc, _TCHAR* argv[]) { WCHAR principal[80] = {0}; DWORD LastError; wprintf(INFO); wprintf(QUERYINPUT); wscanf(L"%S", principal); wprintf(L"%S\n", principal); if (ERROR_SUCCESS == (LastError = GetStrSID(NULL, principal, principal))) { wprintf(L"%s", principal); } else { wprintf(L"Error %d", LastError); } getchar(); return 0; } In einer Domaene funzt dein Ansatz logischerweise so nicht. Wer GetLastError() auswertet sollte im Erfolgsfall auch explizit den Erfolg signalisieren. "new BYTE[256]" war wohl Quark, wenn du offenbar zuvor die exakte Groesse zu ermitteln versuchtest. Also warum nicht auch diese benutzen? |
Re: Unicode Eingabe einlesen
Stoer dich nicht am _tmain, liegt an bestimmten Projekteinstellungen meines Testprojektes (hab's mit dem DDK getestet).
|
Re: Unicode Eingabe einlesen
Welche Zielplatform muss ich denn wie, wo einstellen, damit er ConvertSidToStringSidW kennt?
Ansonsten danke erstmal. Da ist ja nicht all zuviel von meinem Code übrig geblieben, da werde ich mich erstmal durchwühlen müssen. |
Re: Unicode Eingabe einlesen
Zitat:
Alternativ uebernimmst du den Teil zwischen "#ifndef ConvertSidToStringSid" und "#endif // ConvertSidToStringSid" in deinen Code. Selbst wenn es dann schon woanders deklariert wurde, wird das nicht stoeren und du brauchst Sddl.h nicht mehr explizit einbinden. Statt der ersten beiden Includes waere es bei dir dann wohl nur stdafx.h ... Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:02 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