Есть ли быстрый и универсальный способ узнать под ограниченой учётной записью мы находимся или нет. Я конечно понимаю что вариантов куча, но всётаки...
Спасибо. Нашел её аш в \Program Files\Microsoft SDKs\Windows\v6.0A\Lib\shell32.lib, а в библиотеках masm 9.0 её даж небыло.
Заглянул внутрь. Сама эта функция только вызывает BOOL SHTestTokenMembership( HANDLE hToken, ULONG ulRID ); А именно SHTestTokenMembership(0,0x220); Можно вызывать так, но есть одно но. SHTestTokenMembership работает начиная с XP, а IsUserAnAdmin начиная с 2000.
Вот это должно работать начиная с NT 3.5 Код (Text): BOOL IsUserAdmin(void) { OSVERSIONINFO OsVers; OsVers.dwOSVersionInfoSize=sizeof(OSVERSIONINFO); GetVersionEx( &OsVers); if( OsVers.dwPlatformId != VER_PLATFORM_WIN32_NT) { return true; } HANDLE hToken; DWORD GroupInfoSize; TOKEN_GROUPS *pGroupsInfo=0; PSID pSid; SID_IDENTIFIER_AUTHORITY SNTAut=SECURITY_NT_AUTHORITY; if(!AllocateAndInitializeSid(&SNTAut, 2, SECURITY_BUILTIN_DOMAIN_RID, DOMAIN_ALIAS_RID_ADMINS, 0,0,0,0,0,0, &pSid)) { return false; } if(!OpenThreadToken(GetCurrentThread(), TOKEN_QUERY, true, &hToken)) { if(GetLastError()!=ERROR_NO_TOKEN) { GlobalFree(pSid); return false; } if(!OpenProcessToken(GetCurrentProcess(), TOKEN_QUERY, &hToken)) { GlobalFree(pSid); return false; } } if(!GetTokenInformation(hToken, TokenGroups, NULL, NULL, &GroupInfoSize)) { if(GetLastError()!=ERROR_INSUFFICIENT_BUFFER) { GlobalFree(pSid); return false; } } pGroupsInfo=(TOKEN_GROUPS*)GlobalAlloc(GMEM_FIXED|GMEM_ZEROINIT, GroupInfoSize); if(!GetTokenInformation(hToken, TokenGroups, pGroupsInfo, GroupInfoSize, &GroupInfoSize)) { GlobalFree(pSid); GlobalFree(pGroupsInfo); return false; } for(int i=0; i < pGroupsInfo->GroupCount; i++) { if(EqualSid(pSid, pGroupsInfo->Groups[i].Sid) && ( pGroupsInfo->Groups[i].Attributes & ( SE_GROUP_ENABLED | SE_GROUP_USE_FOR_DENY_ONLY))==SE_GROUP_ENABLED) { GlobalFree(pSid); GlobalFree(pGroupsInfo); return true; } } GlobalFree(pSid); GlobalFree(pGroupsInfo); return false; }
Можно например попробовать открыть HKLM на полный доступ, или function IsAdmin: Boolean; var hHandle: THandle; begin hHandle:=CreateFile('\\.\PHYSICALDRIVE0', GENERIC_READ, FILE_SHARE_READ OR FILE_SHARE_WRITE, nil, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0); CloseHandle(hHandle); result:=hHandle <> INVALID_HANDLE_VALUE; end;