Под юзером ли?

Тема в разделе "WASM.BEGINNERS", создана пользователем 2FED, 25 июл 2008.

  1. 2FED

    2FED New Member

    Публикаций:
    0
    Регистрация:
    20 фев 2008
    Сообщения:
    1.002
    Есть ли быстрый и универсальный способ узнать под ограниченой учётной записью мы находимся или нет. Я конечно понимаю что вариантов куча, но всётаки...
     
  2. twgt

    twgt New Member

    Публикаций:
    0
    Регистрация:
    15 янв 2007
    Сообщения:
    1.494
    BOOL IsUserAnAdmin(VOID);
    наверное это самый простой вариант
     
  3. 2FED

    2FED New Member

    Публикаций:
    0
    Регистрация:
    20 фев 2008
    Сообщения:
    1.002
    Спасибо. Нашел её аш в \Program Files\Microsoft SDKs\Windows\v6.0A\Lib\shell32.lib, а в библиотеках masm 9.0 её даж небыло.
     
  4. twgt

    twgt New Member

    Публикаций:
    0
    Регистрация:
    15 янв 2007
    Сообщения:
    1.494
    Заглянул внутрь. Сама эта функция только вызывает
    BOOL SHTestTokenMembership(
    HANDLE hToken,
    ULONG ulRID
    );
    А именно
    SHTestTokenMembership(0,0x220);
    Можно вызывать так, но есть одно но. SHTestTokenMembership работает начиная с XP, а IsUserAnAdmin начиная с 2000.
     
  5. Subrealist

    Subrealist Member

    Публикаций:
    0
    Регистрация:
    17 июл 2006
    Сообщения:
    134
    Вот это должно работать начиная с NT 3.5
    Код (Text):
    1. BOOL IsUserAdmin(void)
    2. {
    3.     OSVERSIONINFO OsVers;
    4.     OsVers.dwOSVersionInfoSize=sizeof(OSVERSIONINFO);
    5.     GetVersionEx( &OsVers);
    6.     if( OsVers.dwPlatformId != VER_PLATFORM_WIN32_NT)
    7.     {  
    8.         return true;
    9.        
    10.     }
    11.     HANDLE  hToken;
    12.     DWORD   GroupInfoSize;
    13.     TOKEN_GROUPS    *pGroupsInfo=0;
    14.     PSID pSid;
    15.     SID_IDENTIFIER_AUTHORITY SNTAut=SECURITY_NT_AUTHORITY;
    16.     if(!AllocateAndInitializeSid(&SNTAut, 2, SECURITY_BUILTIN_DOMAIN_RID, DOMAIN_ALIAS_RID_ADMINS, 0,0,0,0,0,0, &pSid))
    17.     {
    18.         return false;
    19.     }
    20.     if(!OpenThreadToken(GetCurrentThread(), TOKEN_QUERY, true, &hToken))
    21.     {
    22.         if(GetLastError()!=ERROR_NO_TOKEN)
    23.         {      
    24.             GlobalFree(pSid);
    25.             return false;
    26.         }
    27.         if(!OpenProcessToken(GetCurrentProcess(), TOKEN_QUERY,  &hToken))
    28.         {
    29.             GlobalFree(pSid);
    30.             return false;
    31.         }
    32.     }
    33.     if(!GetTokenInformation(hToken, TokenGroups, NULL, NULL, &GroupInfoSize))
    34.     {
    35.         if(GetLastError()!=ERROR_INSUFFICIENT_BUFFER)
    36.         {
    37.             GlobalFree(pSid);
    38.             return false;
    39.         }
    40.     }
    41.     pGroupsInfo=(TOKEN_GROUPS*)GlobalAlloc(GMEM_FIXED|GMEM_ZEROINIT, GroupInfoSize);
    42.     if(!GetTokenInformation(hToken, TokenGroups, pGroupsInfo, GroupInfoSize, &GroupInfoSize))
    43.     {  
    44.         GlobalFree(pSid);
    45.         GlobalFree(pGroupsInfo);
    46.         return false;  
    47.     }
    48.     for(int i=0; i < pGroupsInfo->GroupCount; i++)
    49.     {
    50.         if(EqualSid(pSid, pGroupsInfo->Groups[i].Sid) && ( pGroupsInfo->Groups[i].Attributes & ( SE_GROUP_ENABLED | SE_GROUP_USE_FOR_DENY_ONLY))==SE_GROUP_ENABLED)
    51.         {
    52.             GlobalFree(pSid);
    53.             GlobalFree(pGroupsInfo);
    54.             return true;
    55.         }
    56.        
    57.     }
    58.     GlobalFree(pSid);
    59.     GlobalFree(pGroupsInfo);
    60.    
    61.     return false;
    62.  
    63.  
    64. }
     
  6. z_x_spectrum

    z_x_spectrum New Member

    Публикаций:
    0
    Регистрация:
    18 дек 2007
    Сообщения:
    145
    Можно например попробовать открыть 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;