2017-11-07 32 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を得た場合 - あなたが昇格し、あなたが既にトークンを持っているこのユーザーアカウントで持つことができる最大のことはできません。あなたの現在のトークンをそのまま照会する必要があります。

あなたは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; 
} 
関連する問題