2017-11-07 15 views
0

권한이없는 응용 프로그램에서 권한이 부여 된 응용 프로그램을 실행하려고합니다. 하지만 응용 프로그램을 시작하기 전에 사용자가 관리자인지 확인하고 싶습니다.사용자가 Win32를 사용하는 권한이없는 응용 프로그램의 관리자인지 확인하는 방법은 무엇입니까?

Win32는 IsUserAnAdmin()IsUserAdmin()을 제공하지만 권한이없는 프로세스에서 호출 할 경우 0을 반환합니다. 이는 실제로 사용자가 \ Administrators 그룹의 구성원 인 경우 프로세스에 관리 액세스 권한이 있는지 묻는 것입니다.

사용자가 권한이없는 프로세스의 관리자 그룹에 속하는지 확인할 수 있습니까?

이미 이와 비슷한 몇 가지 질문이 있지만 중복되지는 않습니다. 특히, 사용자가 PROCESS가 관리 권한을 상속했는지 여부가 아니라 USER 그룹에 속하는지 알고 싶습니다. Win32 (.NET이 아닌)로 할 수 있다면.

+0

'이 NetUserGetLocalGroups()'아마. –

답변

1

사용자 토큰 (OpenProcessToken 등)을 처리하는 경우 "거부 전용"그룹을 무시하는 기본 관리자 확인을 수행 할 수 있습니다. GetTokenInformation(..., TokenGroups, ...)으로 전화를 걸어 관리자 그룹 SID를 찾습니다.

사용자 이름/SID 만있는 경우 NetUserGetLocalGroups 또는 NetLocalGroupGetMembers을 사용할 수 있습니다.

0

먼저 토큰을 확인하십시오. TOKEN_ELEVATION_TYPE.

당신은 TokenElevationTypeDefault 또는 TokenElevationTypeFull 가지고 있다면 - 당신이 상승하고 이미 토큰에있는이 사용자 계정에서 가질 수있는 최대 수 있습니다. 쿼리에 대한 토큰은 admin이거나 일부 권한이 있습니까? 현재 토큰을 그대로 쿼리해야합니다.

당신이 TokenElevationTypeLimited을 가지고있는 경우 - 때문에 고도 특권 신청 후이 토큰을 사용하는 것입니다 - 당신이 TokenLinkedToken 통해 연결 토큰에 대해 질의하고이 토큰 대신 현재 토큰을 연결 확인해야합니다. 예를 들어

:

ULONG IsTokenAdmin(HANDLE hToken, PBOOL pbIsAdmin) 
{ 
    ULONG cbSid = MAX_SID_SIZE; 
    PSID pSid = alloca(cbSid); 
    return CreateWellKnownSid(::WinBuiltinAdministratorsSid, 0, pSid, &cbSid) && 
     CheckTokenMembership(hToken, pSid, pbIsAdmin) ? NOERROR : GetLastError(); 
} 

ULONG IsUserAnAdminEx(PBOOL pbIsAdmin, PBOOL pbNeedElevate) 
{ 
    ULONG dwError = NOERROR; 

    HANDLE hToken; 
    if (OpenProcessToken(GetCurrentProcess(), TOKEN_QUERY|TOKEN_DUPLICATE, &hToken)) 
    { 
     ULONG cb; 
     union { 
      TOKEN_ELEVATION_TYPE tet; 
      TOKEN_LINKED_TOKEN tlt; 
     }; 

     if (GetTokenInformation(hToken, ::TokenElevationType, &tet, sizeof(tet), &cb)) 
     { 
      switch (tet) 
      { 
      case TokenElevationTypeLimited: 
       *pbNeedElevate = TRUE; 
       if (GetTokenInformation(hToken, ::TokenLinkedToken, &tlt, sizeof(tlt), &cb)) 
       { 
        dwError = IsTokenAdmin(tlt.LinkedToken, pbIsAdmin); 
        CloseHandle(tlt.LinkedToken); 
       } 
       else 
       { 
        dwError = GetLastError(); 
       } 
       break; 
      case TokenElevationTypeFull: 
      case TokenElevationTypeDefault: 
       *pbNeedElevate = FALSE; 
       // only because CheckTokenMembership want an impersonation token. 
       // really most query can be and must be done direct with this token 
       if (DuplicateToken(hToken, ::SecurityIdentification, &tlt.LinkedToken)) 
       { 
        dwError = IsTokenAdmin(tlt.LinkedToken, pbIsAdmin); 
        CloseHandle(tlt.LinkedToken); 
       } 
       else 
       { 
        GetLastError(); 
       } 
       break; 
      default: 
       dwError = ERROR_GEN_FAILURE; 
      } 
     } 
     else 
     { 
      dwError = GetLastError(); 
     } 

     CloseHandle(hToken); 
    } 

    return dwError; 
}