Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Win Api
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 18.02.2008, 02:34   #1
eks-s
Пользователь
 
Регистрация: 15.01.2008
Сообщений: 64
По умолчанию Как узнать какими права обладает уч.запись

Здравствуйте! Подскажите пожалуйста, как узнать имя текущей запущенной учётной записи, и какими правами она обладает (администратор или Ограниченная). Как узнать имена всех учётных записей в системе и их права?!
eks-s вне форума Ответить с цитированием
Старый 18.02.2008, 05:18   #2
B_N
Новичок
Джуниор
 
Регистрация: 18.01.2008
Сообщений: 1,720
По умолчанию

Это, на самом деле, очень обширная тема и к ней можно подойти с разных сторон, например со стороны NetApi. Могу предложить вот такой кусочек, который очень простенько решает именно сформулированную проблему. Сорри, что не на Delphi, нету у меня её , но принцип, наверное, ясен, тем более, что здесь сплошной API.

Код:
#include <windows.h> 
#include <lm.h>
#include <lmcons.h>
#include <stdio.h>

WCHAR pszUser[]		= L"User";
WCHAR pszAdmin[]	= L"Admin";
WCHAR pszGuest[]	= L"Guest";
WCHAR pszUnknown[]	= L"Unknown";
WCHAR pszError[]	= L"Error";

int wmain()
{
   NET_API_STATUS	nStatus;

   DWORD			dwAccountsRead = 0;
   DWORD			dwTotalAccounts = 0;
   ULONG			i;

   LPUSER_INFO_0	pLevel0Buf = NULL;
   LPUSER_INFO_1	pLevel1Buf = NULL;

   LPWSTR			pwszServerName = NULL;
   LPWSTR			pwszStr;
   
   DWORD			dwUNBufLen = 0;
   LPWSTR			pwszCurUserName = NULL;

	__try {
		// берем имя пользователя для текущего потока
		GetUserNameW(NULL, &dwUNBufLen);
		pwszCurUserName = (LPWSTR)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, dwUNBufLen + sizeof(WCHAR));
		
		GetUserNameW(pwszCurUserName, &dwUNBufLen);

		wprintf(L"Thread UserName : %s\n\n", pwszCurUserName);
		HeapFree(GetProcessHeap(), 0, pwszCurUserName);

		do {
			nStatus = NetUserEnum(pwszServerName, 0, 0, (LPBYTE*)&pLevel0Buf,
									MAX_PREFERRED_LENGTH, &dwAccountsRead, &dwTotalAccounts, NULL);
			// берем информацию нулевого уровня о зарегистрированных учетных записях
			if ((NERR_Success == nStatus) || (ERROR_MORE_DATA == nStatus)) {
				if (NULL != pLevel0Buf) {
					for (i = 0; (i < dwAccountsRead); i++){
						// берем информацию первого уровня (в частности об уровне привилегий) для 
						// очередной учетной записи
						nStatus = NetUserGetInfo(pwszServerName, pLevel0Buf[i].usri0_name, 1, (LPBYTE*)&pLevel1Buf);
						if(NERR_Success == nStatus){
							switch(pLevel1Buf->usri1_priv){
								case USER_PRIV_GUEST	: pwszStr = pszGuest; break;
								case USER_PRIV_USER		: pwszStr = pszUser; break;
								case USER_PRIV_ADMIN	: pwszStr = pszAdmin; break;
								default					: pwszStr = pszUnknown; break;
							}
							NetApiBufferFree(pLevel1Buf);
						}
						else pwszStr = pszError;
						wprintf(L"%-20s : %s\n", pLevel0Buf[i].usri0_name, pwszStr);
					}
				}
			}
			else wprintf(L"Error\n");

			if (NULL != pLevel0Buf){
				NetApiBufferFree(pLevel0Buf);
				pLevel0Buf = NULL;
			}
		} while (nStatus == ERROR_MORE_DATA);
	}
	__except(EXCEPTION_EXECUTE_HANDLER){
		wprintf(L"Что-то не так :( ... \n");
		//...........
	}
	if(NULL != pLevel0Buf) NetApiBufferFree(pLevel0Buf);
	if(NULL != pLevel1Buf) NetApiBufferFree(pLevel1Buf);

	return 0;
}
Очень советую почитать MSDN по теме. Может пригодиться, например, NetQueryDisplayInformation или что-нибудь из LSA-функций, скажем LsaEnumerateAccountsWithUserRight
B_N вне форума Ответить с цитированием
Старый 18.02.2008, 05:55   #3
eks-s
Пользователь
 
Регистрация: 15.01.2008
Сообщений: 64
По умолчанию

Спасибо Если честно, для меня выглядил сложновато, но куда двигаться понял Буду разбираться... Ещё бы примерчик на знакомом языке.
eks-s вне форума Ответить с цитированием
Старый 18.02.2008, 06:02   #4
B_N
Новичок
Джуниор
 
Регистрация: 18.01.2008
Сообщений: 1,720
По умолчанию

Цитата:
Сообщение от Алексей eks-s ^ii^ Посмотреть сообщение
Ещё бы примерчик на знакомом языке.
Ну попробуйте на Delphi перевести, там ведь в основном операторы, да пара циклов, а всё остальное - стандартные виндовские типы и вызовы. Я бы и сам перевел, но не представляю, есть ли там и где объявления этих функций, а потом не хочется давать пример, который сам не проверил
B_N вне форума Ответить с цитированием
Старый 18.02.2008, 06:36   #5
eks-s
Пользователь
 
Регистрация: 15.01.2008
Сообщений: 64
По умолчанию

Всё равно спасибо, буду разбираться ))
eks-s вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Какими бы вы хотели видеть Онлайновые Игры OrdJONY Gamedev - cоздание игр: Unity, OpenGL, DirectX 18 02.01.2011 11:32
Какими Linux/Unix дистрибутивами вы пользуйтесь?... Sota Операционные системы общие вопросы 15 04.06.2008 16:19
Личные права пользователей!!! Nemesisking О форуме и сайтах клуба 12 23.04.2008 22:51
Права доступа usera Anna_fors Компьютерное железо 0 28.03.2008 14:06
нет права доступа Rio309 Общие вопросы Delphi 7 17.02.2008 09:38