성태의 닷넷 이야기
홈 주인
모아 놓은 자료
프로그래밍
질문/답변
사용자 관리
사용자
메뉴
아티클
외부 아티클
유용한 코드
온라인 기능
MathJax 입력기
최근 덧글
[정성태] 아쉽게도, 커뮤니티는 아니고 개인 블로그입니다. ^^
[정성태] 질문이 잘 이해가 안 됩니다. 우선, 해당 소스코드에서 ILis...
[양승조
] var대신 dinamic으로 선언해서 해결은 했습니다. 맞는 해...
[양승조
] 또 막혔습니다. ㅠㅠ var list = props[i].Ge...
[양승조
] 아. 감사합니다. 어제는 안됐던것 같은데....정신을 차려야겠네...
[정성태] "props[i].GetValue(props[i])" 코드에서 ...
[정성태] 저렇게 조각 코드 말고, 실제로 재현이 되는 예제 프로젝트를 압...
[정성태] Modules 창(Ctrl+Shift+U)을 띄워서, 해당 Op...
[정성태] 만드실 수 있습니다. 단지, Unity 엔진 내의 스크립트와 W...
[공진영] 안녕하세요 좋은글 감사합니다. 현재 제가 wpf로 관제 모...
글쓰기
제목
이름
암호
전자우편
HTML
홈페이지
유형
닷넷
.NET 3.0
.NET 3.5
.NET 4.0
COM 개체 관련
Win32
Vista
Windows 7
Windows 8
Windows 서버
데이터베이스
웹폼 코딩 규약
윈폼 코딩 규약
공통 코딩 규약
명령행
레지스트리
기타
부모글 보이기/감추기
내용
<span> How to tell if the current user is in administrators group programmatically<br /> ; <a target='_tab' href='https://learn.microsoft.com/en-us/archive/blogs/junfeng/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</a><br /> <br /> 기존에는 <a target='_tab' href='https://learn.microsoft.com/en-us/windows/win32/api/securitybaseapi/nf-securitybaseapi-checktokenmembership'>CheckTokenMembership</a> API를 이용해서 현재 로그인한 계정이 관리자 그룹에 속해 있는지 알아내기 위해서 다음과 같은 예제 코드를 제시하고 있습니다.<br /> <br /> <pre class='code'> BOOL IsUserAdmin(VOID) { BOOL b; SID_IDENTIFIER_AUTHORITY NtAuthority = SECURITY_NT_AUTHORITY; PSID AdministratorsGroup; b = <b>AllocateAndInitializeSid</b>( &NtAuthority, 2, SECURITY_BUILTIN_DOMAIN_RID, DOMAIN_ALIAS_RID_ADMINS, 0, 0, 0, 0, 0, 0, &AdministratorsGroup); if(b) { if (!<b>CheckTokenMembership</b>( NULL, AdministratorsGroup, &b)) { b = FALSE; } FreeSid(AdministratorsGroup); } return(b); } </pre> <br /> 그런데, Vista에서는 "filtered user token"의 값으로 CheckTokenMembership에 의해 체크되기 때문에 정상적으로 검사가 안 될 테니, 대신에 다음과 같은 코드를 이용해서 확인을 하라고 합니다. (Windows SDK가 설치되어져 있어야 빌드가 됩니다.)<br /> <br /> <pre class='code'> 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 (!<b>GetTokenInformation</b>( 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 (!<b>CheckTokenMembership</b>( 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; } </pre> <br /><br /><hr /><span style='color: Maroon'>[이 토픽에 대해서 여러분들과 의견을 공유하고 싶습니다. 틀리거나 미흡한 부분 또는 의문 사항이 있으시면 언제든 댓글 남겨주십시오.]</span> </span>
첨부파일
스팸 방지용 인증 번호
1523
(왼쪽의 숫자를 입력해야 합니다.)