Benutzerkonten auflisten
-
Moin,
langsam bin ich am Verzweifeln. Ich weiß, dass ich mit GetUserName den aktuell eingeloggten User ermitteln kann. Wie aber kann ich alle Benutzerkonten ermitteln?Flo
-
Guck dir mal mein Programm XP Usermanager an: http://xpusermanager.luckie-online.de Ist zwar in Delphi geschrieben aber die APIs sind die gleichen. Interassent sind für dich die Dateien: NTUser.pas und eventuell noch MpuWinNT.pas.
-
hmm... ok, ich bin jetzt wesentlich weiter... dennnoch taucht ein Fehler auf, bei dem ich grad net weiß, wie ich ihn beheben soll...
wchar_t *servername = L"\\\\AMD3200"; DWORD read, totalremaining, resumeh, rc, i; resumeh = 0; USER_INFO_1 *buf, *cur; resumeh = 0; do { buf = NULL; rc = NetUserEnum(servername , 0, FILTER_NORMAL_ACCOUNT, (BYTE **) &buf, 1024, &EntriesRead, &EntriesTotal, &resumeh); // rc = NetUserEnum(PWideChar("\\AMD3200"), 0, FILTER_NORMAL_ACCOUNT, (BYTE **) &buf, 1024, &EntriesRead, &EntriesTotal, &resumeh); if ( rc != ERROR_MORE_DATA && rc != ERROR_SUCCESS ){ break; } for ( i = 0, cur = buf; i < read; ++ i, ++ cur ){ //print_user( cur->usri1_name, cur->usri1_flags ); String UserName = cur->usri1_name; clbUsers->Items->Add( (UserName) );//cur->usri1_flags ); } if ( buf != NULL ) NetApiBufferFree( buf ); } while ( rc == ERROR_MORE_DATA );Solange in usril_name was drin steht, gehts. Das is dummerweise nur einmal. Dann taucht in der ComboListBox Administrator auf. Beim nächsten Durchlauf ist die Var leer?, also "" steht bei der Info da... und dann steigt er beim Zuweis auf UserName aus... wieso, was kann ich machen, was mach ich falsch?
Flo
-
So... nach vielem Ändern hab ich nun diesen wunderbaren Code
clbUsers->Clear(); /*typedef*/ struct TUserInfo1{ LPWSTR usri1_name; LPWSTR usri1_password; DWORD usri1_password_age; DWORD usri1_priv; LPWSTR usri1_home_dir; LPWSTR usri1_comment; DWORD usri1_flags; LPWSTR usri1_script_path; }; TUserInfo1* PUserInfo1; Pointer ui1, pWork; DWORD EntriesRead, EntriesTotal; DWORD NetError; Integer Loop; // TStringArray Result; String Result[1]; const WideString Server = "\\\\AMD3200"; DWORD filter = FILTER_NORMAL_ACCOUNT; DWORD resumeh; USER_INFO_1 *buf, *cur; pWork = NULL; if( Server.Length() != 0){ try{ // NetError = NetUserEnum(PWideChar(Server), 0, filter, ui1,&MAX_PREFERRED_LENGTH, &EntriesRead, &EntriesTotal, NULL); // rc = NetUserEnum(servername , 0, FILTER_NORMAL_ACCOUNT, (BYTE **) &buf, 1024, &read, &totalremaining, &resumeh ); // NetError = NetUserEnum(PWideChar(Server), 0, filter, (BYTE **) &ui1, 1024, &EntriesRead, &EntriesTotal, &resumeh); NetError = NetUserEnum(PWideChar(Server), 0, filter, (BYTE **) &buf, 1024, &EntriesRead, &EntriesTotal, &resumeh); // if( (NetError == NERR_SUCCESS) && (EntriesRead > 0)){ if( (NetError == ERROR_SUCCESS) && (EntriesRead > 0)){ pWork = &ui1; Result->SetLength(EntriesRead); for( Loop = 0, cur = buf; Loop < (int)(EntriesRead-1); buf+= sizeof(Pointer), Loop++){ // Result[Loop] = PUserInfo1(ui1)^.usri1_name; // Result[Loop] = PUserInfo1(ui1)->usri1_name; // Result[Loop] = PUserInfo1->usri1_name; // ui1->usri1_name; // clbUsers->Items->Add( Result[Loop] ); clbUsers->Items->Add( cur->usri1_name ); // Inc(Integer(ui1), sizeof(Pointer)); Integer(ui1) += sizeof(Pointer); } } } __finally { NetApiBufferFree(pWork); } }Ich hab versucht, dein Delphi-Code nach C++ zu portieren. Allerdings ist mir nicht so ganz klar, was an der Original-Result-Stelle passiert. Wahrscheinlich hab ich jetzt gnadenlos in dem Code rumgepfuscht... Steht in der For-Schleife der buf += drin, bekomm ich 2mal Hilfeassistent ausgegeben; stell ich den cur rein, kommt der Hilfeassistent nur einmal, beim 2. Durchlauf schmiert's mir wieder ab... eigentlich das gleiche Problem, wie mit dem 'alten' Code. Nur, vorher stand Administrator drin und schmierte ab. Klär mich bitte auf... ich hab jetzt erst mal Hunger... vor lauter programmieren hab ich heute seit 11 Uhr nur nen Liter Milch intus...
-
Äh sorry, aber das C-Gewurschtel übersteigt doch etwas meine C-Kenntnisse. Allerdings solltets du die Struktur nicht noch mal selber deklarieren müssen, die sollte schon in einer Header-Datei deklariert sein. Ich musste sie nur selber deklarieren, weil Delphi sie nicht kannte.
-
boar... ich glaub ich krieg die Motten! Ich habs.... wie's scheint.
kann mich wer schlagen...?Im letzten Codefragment hab ich USER_INFO_1 *buf definiert... sprech aber Level 0 statts 1 an. Alle USER_INFO_x Zahlen, sowie usriX_name Zahl und das Level müssen gleich sein.... unglaublich... demnach hab ich schon seit 2 Tagen eigentlich nen richtigen Code, nur die falschen Levelangaben, deswegen ich ein Absturz nach dem andren hatte... *puhh* ne 0 statts ne 1... meine Güte... das is ja net zu fassen... ich glaub, ich muss gleich weinen, ne ne ne... ok. Ich würd sagen, damit komm ich jetzt erst mal nen rießen Schritt weiter...
Flo
-
eine Frage hätt ich jetzt doch noch

Ich hab mich jetzt doch erst mal für das INFO_USER_2 entschieden (also Level 2), mal schaun, ob das hinterher auf nem eingeschränkten Benutzerkonto immer noch tut. Als Auflistung der Benutzerkonten bekomme ich nunAdministrator
ASPNET
Florian
Kasia
LNSS_MONITOR...heraus, wenn ich mit
NetError = NetUserEnum(ServerName, 2, filter, (BYTE **) &buf, 2048, &EntriesRead, &EntriesTotal, &resumeh); for( Loop = 0, cur = (USER_INFO_2*)buf; Loop < EntriesRead; ++cur, ++Loop){ if( (cur->usri2_priv == 1)|(cur->usri2_priv == 2)){ clbUsers->Items->Add( cur->usri2_name ); CheckListBox1->Items->Add(cur->usri2_priv); }in der if Typ 0 filtere. Das ist mir eigentlich nicht genug. Das Prog soll, wie schon erwähnt, die Konten auf einen eingeschränkten Konto ermitteln können, aber nur eingeschränkte und vollwertige Konten ausgeben, die als Personen sich anmelden. Also, Florian als Admin und Kasia als eingeschränktes Konto sollen angezeigt werden... der Rest net. Ich hab nur das Problem: Wie kann ich erkennen, was ich filtern muss?