Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C++ Builder > Имя пользователя


Автор: Gordon 19.8.2006, 12:58
Ребята, подскажите пожалуйста, как можно узнать имена учетных записей пользователей,  которые которые есть в системе  smile 

Автор: Romikgy 19.8.2006, 13:45
в командной строке 
net user

Добавлено @ 13:47 
NetQueryDisplayInformation

Автор: Gordon 19.8.2006, 18:23
Romikgy, не хочу показаться навязчивым, но не мог бы примерчик подкинуть smile 

Автор: Romikgy 19.8.2006, 18:33
Цитата(Gordon @  19.8.2006,  17:23 Найти цитируемый пост)
не хочу показаться навязчивым

уже показался smile
ЗЫ нет у меня ща в данный момент на чем писать пример, бери мсдн и читай пиши

Автор: Gordon 19.8.2006, 18:48
Понятно, буду пробовать... 

Автор: Damarus 20.8.2006, 09:47
Цитата(Gordon @  19.8.2006,  19:23 Найти цитируемый пост)
Romikgy, не хочу показаться навязчивым, но не мог бы примерчик подкинуть 

Код

#pragma comment(lib, "NetApi32.lib")
#include <windows.h>
#include <lm.h>
#include <iostream>

int wmain(int argc, wchar_t *argv[], wchar_t *envp[])
{
    _wsetlocale(LC_ALL, L"Russian");
    PNET_DISPLAY_USER lpUsers = NULL;
    NET_API_STATUS status = ERROR_SUCCESS;
    DWORD dwUsersCount = 0, dwIndex = 0;

    do
    {
        status = NetQueryDisplayInformation(NULL, 1, dwIndex, 100,
            MAX_PREFERRED_LENGTH, &dwUsersCount, (PVOID*)&lpUsers);
        if (status == ERROR_SUCCESS || status == ERROR_MORE_DATA)
        {
            for (DWORD n = 0; n < dwUsersCount; n++)
            {
                wprintf(L"Name:      %s\n"
                        L"Full Name: %s\n"
                        L"Comment:   %s\n"
                        L"User ID:   %u\n"
                        L"Flags: 0x%08X\n"
                        L"--------------------------------\n",
                        lpUsers[n].usri1_name,
                        lpUsers[n].usri1_full_name,
                        lpUsers[n].usri1_comment,
                        lpUsers[n].usri1_user_id,
                        lpUsers[n].usri1_flags);
                dwIndex = lpUsers[n].usri1_next_index;
            }
            NetApiBufferFree(lpUsers);
        }
    }
    while (status == ERROR_MORE_DATA);
}

Автор: Gordon 20.8.2006, 11:17
Damarus, что-то не работает...Ошибка:

Цитата

[Linker Fatal Error] Fatal: Unable to open file 'NETAPI32.LIB'

Автор: Damarus 20.8.2006, 12:02
Попробуй поискать у себя Netapi32.lib. Если нет, то вот:

PS. А к Builder'у либы вообще подключаются smile 
PPS. Пример написан в VS2005.

Автор: Romikgy 20.8.2006, 12:28
Цитата(Damarus @  20.8.2006,  11:02 Найти цитируемый пост)

PS. А к Builder'у либы вообще подключаются  


да , но можно это сделать и через менюшки

Добавлено @ 12:41 
Код

//---------------------------------------------------------------------------

#pragma hdrstop
#pragma comment(lib, "NetApi32.lib")
#include <windows.h>    
#include <lm.h>    
#include <iostream>
#include <stdio.h>
//---------------------------------------------------------------------------

#pragma argsused
int main(int argc, char* argv[])
{
        _wsetlocale(LC_ALL, L"Russian");    
    PNET_DISPLAY_USER lpUsers = NULL;    
    NET_API_STATUS status = ERROR_SUCCESS;    
    DWORD dwUsersCount = 0, dwIndex = 0;    
    do    
    {    
        status = NetQueryDisplayInformation(NULL, 1, dwIndex, 100,    
            MAX_PREFERRED_LENGTH, &dwUsersCount, (PVOID*)&lpUsers);    
        if (status == ERROR_SUCCESS || status == ERROR_MORE_DATA)    
        {    
            for (DWORD n = 0; n < dwUsersCount; n++)    
            {    
                wprintf(L"Name:      %s\n"
                        L"Full Name: %s\n"    
                        L"Comment:   %s\n"    
                        L"User ID:   %u\n"    
                        L"Flags: 0x%08X\n"    
                        L"--------------------------------\n",    
                        lpUsers[n].usri1_name,    
                        lpUsers[n].usri1_full_name,    
                        lpUsers[n].usri1_comment,    
                        lpUsers[n].usri1_user_id,    
                        lpUsers[n].usri1_flags);
                dwIndex = lpUsers[n].usri1_next_index;    
            }    
            NetApiBufferFree(lpUsers);    
        }    
    }    
    while (status == ERROR_MORE_DATA);
    getchar();
        return 0;
}
//---------------------------------------------------------------------------


си билдер 6 работает
только я библиотеку NetApi32 из папки lib\Psdk перенес (скопировал) в \lib

Автор: Gordon 20.8.2006, 13:00
Спасибо большое!!! Все работает!!!! smile 

Автор: Gordon 21.8.2006, 15:09
Ребята, вот нашел еще инфу:

Код

char lpBuffer1[100],lpBuffer2[100];
LPDWORD nSize1 = new DWORD(99);
LPDWORD nSize2 = new DWORD(99);
GetUserName(lpBuffer1,nSize1); // имя пользователя
GetComputerName(lpBuffer2,nSize2); // имя компьютера
Label1->Caption = "Имя пользователя: " + AnsiString(lpBuffer1);
Label2->Caption = "Имя компьютера: " + AnsiString(lpBuffer2);
delete nSize1; delete nSize2;


Тоже работает и вроде попроще, но эта простота немного настараживает, подскажите какой способ лучше  smile 

Автор: 586 21.8.2006, 16:28
Цитата(Gordon @  21.8.2006,  16:09 Найти цитируемый пост)
LPDWORD nSize1 = new DWORD(99);
LPDWORD nSize2 = new DWORD(99);

Для чего здесь этот массив???

Код
char buff[100];
DWORD dw=100;
GetUserName(buff, &dw);
Caption=buff;


Цитата
подскажите какой способ лучше

GetUserName выводит имя пользователя текущего потока, а пример выше всех пользователей.
Тебе как надо?

Автор: Gordon 21.8.2006, 16:58
586, вполне можно и так, просто я эту инфу наше в FAQ'ке и в исходном виде записал, обрезав один кусок (там еще было получение информации об использовании ОЗУ памяти...) 

P.S. А как можно вывести имена определенных пользователей?

 

Автор: Damarus 22.8.2006, 16:42
Цитата(Gordon @  21.8.2006,  17:58 Найти цитируемый пост)
P.S. А как можно вывести имена определенных пользователей?

Чем определенных smile 

Автор: Gordon 22.8.2006, 20:57
Цитата

Чем определенных 


Например только администратора компа (например)... 

Автор: Damarus 22.8.2006, 22:42
Цитата(Gordon @  22.8.2006,  21:57 Найти цитируемый пост)
Например только администратора компа (например)... 

Тоесть по группе. Можно так:
Код

#pragma comment(lib, "NetApi32.lib")
#include <windows.h>
#include <lm.h>
#include <iostream>

int wmain(int argc, wchar_t *argv[], wchar_t *envp[])
{
    _wsetlocale(LC_ALL, L"Russian");

    PLOCALGROUP_MEMBERS_INFO_1 lpGroupUsers = NULL;
    NET_API_STATUS status = ERROR_SUCCESS;
    DWORD dwGroupUsersRead = 0, dwGroupUsersTotal = 0;
    DWORD_PTR ResumeHandle = 0;
    LPCWSTR GroupName = L"Администраторы";

    wprintf(L"Группа \"%s\":\n", GroupName);
    do
    {
        status = NetLocalGroupGetMembers(NULL, GroupName, 1,
            (LPBYTE*)&lpGroupUsers,    MAX_PREFERRED_LENGTH, 
            &dwGroupUsersRead, &dwGroupUsersTotal, &ResumeHandle);
        if (status == ERROR_SUCCESS || status == ERROR_MORE_DATA)
        {
            for (DWORD n = 0; n < dwGroupUsersRead; n++)
                wprintf(L"    %s\n", lpGroupUsers[n].lgrmi1_name);
            NetApiBufferFree(lpGroupUsers);
        }
    }
    while (status == ERROR_MORE_DATA);
}

Автор: Gordon 23.8.2006, 10:12
Damarus, спасибо большое, т.е. так я смогу получить имена пользователей любой группы?

Автор: Damarus 23.8.2006, 12:41
Цитата(Gordon @  23.8.2006,  11:12 Найти цитируемый пост)
Damarus, спасибо большое, т.е. так я смогу получить имена пользователей любой группы?

Да. Любой локальной группы (Панель управления -> Администрирование -> Управление компьютером -> Локальные пользователи и группы -> Группы). Если нужны пользователи глобальной группы, замени NetLocalGroupGetMembers на NetGroupGetUsers.

Автор: Gordon 23.8.2006, 15:37
Спасибо большое, Damarus, я твою помощь НЕ ЗАБУДУ... smile 

Автор: bigscorp 4.12.2006, 06:29
а изменить имя пользователя можно?

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)