необходимо для каждого юзера определить свои настройки. какими API можно узнать имена пользователей ??
Code (Text): #include "stdafx.h" #include <tchar.h> #include <ntsecapi.h> #define __ErrorHandler(x, y) \ { \ WEKernelErrorMessage((x), (y)); \ return 0; \ } DWORD WEKernelErrorMessage(DWORD errcode, LPTSTR tszTitle); int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) { // TODO: Place code here. #define __MAX_DOMAIN_NAME_LEN 0x1000 #define __MAX_ACCOUNT_NAME_LEN 0x1000 PLSA_ENUMERATION_INFORMATION lpAccountsArray= NULL; DWORD dwAccountsCount; TCHAR tszName[__MAX_ACCOUNT_NAME_LEN]; DWORD dwNameLen; LSA_HANDLE hPolicy= NULL; LSA_OBJECT_ATTRIBUTES stObjectAttributes; HANDLE hToken= NULL; NTSTATUS nts; LUID ldLuid; TOKEN_PRIVILEGES stTokenPrivilege; TCHAR tszDomainName[__MAX_DOMAIN_NAME_LEN]; DWORD dwDomainNameLen; SID_NAME_USE psnuNameUse; __try { ZeroMemory(&stObjectAttributes, sizeof(stObjectAttributes)); if(nts=LsaOpenPolicy(NULL, &stObjectAttributes, POLICY_LOOKUP_NAMES | POLICY_VIEW_LOCAL_INFORMATION , &hPolicy)) { __ErrorHandler(LsaNtStatusToWinError(nts), TEXT("Cannot open policy")); } if(!OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken)) { __ErrorHandler(GetLastError(), TEXT("Cannot open process access token")); } if(!LookupPrivilegeValue(NULL, SE_SECURITY_NAME, &ldLuid)) { __ErrorHandler(GetLastError(), TEXT("Cannot get privilegie value")); } stTokenPrivilege.PrivilegeCount= 1; stTokenPrivilege.Privileges[0].Attributes= SE_PRIVILEGE_ENABLED; stTokenPrivilege.Privileges[0].Luid= ldLuid; if(!AdjustTokenPrivileges(hToken, FALSE, &stTokenPrivilege, 0, NULL, NULL)) { __ErrorHandler(GetLastError(), TEXT("Cannot set privilegies")); } if ( nts= LsaEnumerateAccountsWithUserRight ( hPolicy, NULL, (LPVOID*)&lpAccountsArray, &dwAccountsCount ) ) { __ErrorHandler(LsaNtStatusToWinError(nts), TEXT("Cannot enumerate accounts")); } for(DWORD i= 0; i<dwAccountsCount; i++) { dwNameLen= __MAX_ACCOUNT_NAME_LEN; dwDomainNameLen= __MAX_DOMAIN_NAME_LEN; if ( LookupAccountSid ( NULL, lpAccountsArray[i].Sid, tszName, &dwNameLen, tszDomainName, &dwDomainNameLen, &psnuNameUse ) ) { MessageBox(NULL, tszName, TEXT("Account name"), 0); } else { WEKernelErrorMessage(GetLastError(), TEXT("Cannot get name")); } } // LsaFlpAccountsArray } __finally { if(lpAccountsArray) LsaFreeMemory(lpAccountsArray); if(hPolicy) LsaClose(hPolicy); if(hToken) LsaClose(hToken); } return 0; } DWORD WEKernelErrorMessage(DWORD errcode, LPTSTR tszTitle) { TCHAR lpBuffer[0x100]; TCHAR lpMes[0x100]; lpMes[0]= 0; if(FormatMessage(FORMAT_MESSAGE_IGNORE_INSERTS | FORMAT_MESSAGE_FROM_SYSTEM, NULL, errcode, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), lpBuffer, 0x100, (va_list*)NULL)) { _tcscat(lpMes, lpBuffer); } else { _tcscat(lpMes, TEXT("Unknown error.")); } return MessageBox(NULL, lpMes, tszTitle?tszTitle:TEXT("Error"), MB_OK); }
NouZui твой код перечисляет привелегии пользователя, надо составить список login'ов пользователей PC. Есть API : NetUserEnum и NetQueryDisplayInformation, но у меня ничего не выходит. Если кто-нить может помочь подскажите
Можно через Code (Text): NET_API_STATUS NetUserEnum( LPCWSTR servername, DWORD level, DWORD filter, LPBYTE* bufptr, DWORD prefmaxlen, LPDWORD entriesread, LPDWORD totalentries, LPDWORD resume_handle ); и её братьев