Microsoft MVP성태의 닷넷 이야기
글쓴 사람
정성태 (techsharer at outlook.com)
홈페이지
첨부 파일
 
(연관된 글이 1개 있습니다.)
How to tell if the current user is in administrators group programmatically
; https://learn.microsoft.com/en-us/archive/blogs/junfeng/how-to-tell-if-the-current-user-is-in-administrators-group-programmatically

기존에는 CheckTokenMembership API를 이용해서 현재 로그인한 계정이 관리자 그룹에 속해 있는지 알아내기 위해서 다음과 같은 예제 코드를 제시하고 있습니다.

BOOL IsUserAdmin(VOID)
{
BOOL b;
SID_IDENTIFIER_AUTHORITY NtAuthority = SECURITY_NT_AUTHORITY;
PSID AdministratorsGroup; 
b = AllocateAndInitializeSid(
    &NtAuthority,
    2,
    SECURITY_BUILTIN_DOMAIN_RID,
    DOMAIN_ALIAS_RID_ADMINS,
    0, 0, 0, 0, 0, 0,
    &AdministratorsGroup); 
if(b) 
{
    if (!CheckTokenMembership( NULL, AdministratorsGroup, &b)) 
    {
         b = FALSE;
    } 
    FreeSid(AdministratorsGroup); 
}

return(b);
}

그런데, Vista에서는 "filtered user token"의 값으로 CheckTokenMembership에 의해 체크되기 때문에 정상적으로 검사가 안 될 테니, 대신에 다음과 같은 코드를 이용해서 확인을 하라고 합니다. (Windows SDK가 설치되어져 있어야 빌드가 됩니다.)

HRESULT IsUserAdmin(BOOL *pIsAdmin)
{
    int b;
    HANDLE hProcess = NULL;
    HANDLE hProcessToken = NULL;
    HANDLE hLinkedToken = NULL;
    BOOL fIsAdmin = FALSE;
    DWORD dwLength = 0;
    OSVERSIONINFO osver = {sizeof(OSVERSIONINFO)};
    HRESULT hr = S_OK;

    *pIsAdmin = FALSE;

    hProcess = GetCurrentProcess();
    if (!OpenProcessToken(hProcess, TOKEN_QUERY, &hProcessToken))
    {
        hr = HRESULT_FROM_WIN32(GetLastError());
        goto Exit;
    }

    char AdminSID[SECURITY_MAX_SID_SIZE];
    dwLength = sizeof(AdminSID);
    if(!CreateWellKnownSid(WinBuiltinAdministratorsSid, NULL, &AdminSID, &dwLength)) 
    {
        hr = HRESULT_FROM_WIN32(GetLastError());
        goto Exit;
    } 

    if (!CheckTokenMembership( NULL, &AdminSID, &fIsAdmin)) 
    {
        hr = HRESULT_FROM_WIN32(GetLastError());
        goto Exit;
    }

    if (fIsAdmin) 
    {
        *pIsAdmin = TRUE;
        goto Exit;
    }

    if (!GetVersionEx(&osver))
    {
        hr = HRESULT_FROM_WIN32(GetLastError());
        goto Exit;
    }

    if (osver.dwMajorVersion < 6) 
    {
        goto Exit;        
    }

    if (!GetTokenInformation(   hProcessToken,
                                TokenLinkedToken,
                                (VOID*) &hLinkedToken,
                                sizeof(HANDLE),
                                &dwLength) )
    {
        b = GetLastError();
        if  (   b == ERROR_NO_SUCH_LOGON_SESSION
            ||  b == ERROR_PRIVILEGE_NOT_HELD)
        {
            goto Exit;
        }

        hr = HRESULT_FROM_WIN32(b); // a real error
        goto Exit;
    } 

    if (!CheckTokenMembership(   hLinkedToken, &AdminSID, &fIsAdmin))
    {
        hr = HRESULT_FROM_WIN32(GetLastError());
        goto Exit;
    }

    if (fIsAdmin)
    {
        *pIsAdmin = TRUE;
    }
    else 
    {
    }

Exit:
    if (hProcess) 
    {
        CloseHandle(hProcess);
    }

    if (hProcessToken)
    {
        CloseHandle(hProcessToken);
    }

    if (hLinkedToken)
    {
        CloseHandle(hLinkedToken);
    }

    return hr;
}



[이 토픽에 대해서 여러분들과 의견을 공유하고 싶습니다. 틀리거나 미흡한 부분 또는 의문 사항이 있으시면 언제든 댓글 남겨주십시오.]

[연관 글]






[최초 등록일: ]
[최종 수정일: 12/22/2022]

Creative Commons License
이 저작물은 크리에이티브 커먼즈 코리아 저작자표시-비영리-동일조건변경허락 2.0 대한민국 라이센스에 따라 이용하실 수 있습니다.

비밀번호

댓글 작성자
 




1  2  3  4  [5]  6  7  8 
NoWriterDateCnt.TitleFile(s)
95정성태2/23/20074970.NET : 20. .Net Zip Library/Utility updates and fixes
94정성태2/23/20074760COM : 2. VC++ - OneNote Addin 제작
93정성태2/3/20075593공통 코딩 규약 : 2. 프로퍼티와 공용 필드에 대한 선택 [1]
92정성태2/1/20074745공통 코딩 규약 : 1. HMACSHA512 / HMACSHA384 클래스 사용시 주의사항
91정성태1/27/20075027.NET : 19. HTML InnerText 구하기
90정성태1/27/20076670Vista : 3. 현재 사용자가 관리자 그룹에 속해 있는지 결정하는 코드
89정성태1/24/20074200.NET : 18. ASP.NET - AspNetHostingPermissionLevel 알아내기
88정성태1/22/20074474.NET : 17. 지역화된 폰트명 구하기
87정성태1/21/20075818.NET : 16. 클립보드 - HTML 텍스트 복사/붙여넣기
86정성태1/21/20074723.NET : 15. BinaryFormatter 에서의 진행 상태바 구현
85정성태1/20/20075661COM : 1. IE 7의 다중 탭을 이용한 네비게이션 [1]
84정성태1/19/20074565.NET : 14. 웹 서비스를 이용한 머신 간의 클립보드 공유
83정성태1/12/20074500.NET : 13. SafeHandles 를 적용한 GetProcAddress 래퍼
82정성태1/12/20074203.NET : 12. Cardspace 를 위한 ASP.NET 서버 컨트롤파일 다운로드1
81정성태1/12/20074530.NET : 11. 파일 확장자에 따른 아이콘 그려주는 HttpHandler [2]파일 다운로드1
80정성태1/10/20075248SQL : 1. SQL 2005 - 대소문자 구분없이 검색하도록 구현 [1]
79정성태1/10/20074147.NET : 10. Config 설정을 .NET Class 로 매핑
78정성태1/3/20074606.NET : 9. 텍스트 꾸미는 코드
77정성태12/13/20064803.NET : 8. C# - VARIANT 관련 마샬링 코드
76정성태12/6/20065377.NET : 7. 휴대 장치 열람하는 코드
75정성태12/6/20064478.NET : 6. 웹 서비스 메서드에 대해 완료 제한 시간 설정하는 방법
74정성태11/6/20064540.NET : 5. How to Decrypt an ASP.NET Encrypted Data
73정성태11/2/20065421.NET : 4. 콘솔 프로그램 실행시간 측정
72정성태11/1/20064685.NET : 3. System Monitoring 예제
70정성태11/1/20064238.NET : 2. System.Net.NetworkInformation.Ping 클래스 사용 예제
69정성태10/27/20064542.NET : 1. Typed DataSet 에서의 ExcludeSchema 사용
1  2  3  4  [5]  6  7  8