2009-02-19 6 views

Répondre

2

C'était un problème intéressant à essayer de résoudre. J'ai fait référence à Writing Secure Code for Windows Vista de Microsoft Press. Essentiellement, lorsque IE est en mode protégé, il fonctionne dans le niveau d'intégrité "Low". Si le niveau d'intégrité est supérieur à faible (par exemple, moyen ou élevé), le processus IE ne s'exécute pas en mode protégé. Le niveau d'intégrité par défaut pour les processus sur Vista est "Moyen". Voici un code qui vous permettra d'obtenir le niveau d'intégrité d'un processus étant donné que c'est un pid ou un handle de processus. Si vous avez IWebBrowser2, vous pouvez obtenir le pid à partir du HWND en utilisant GetWindowThreadProcessId.

DWORD GetProcessIntegrityLevel(HANDLE hProcess, 
           wchar_t __out_ecount_z(cbIl) *wszIl, 
           size_t cbIl) 
{ 
    if (!wszIl) return 0xffffffff; 
    memset(wszIl,0,cbIl); 
    DWORD err = 0; 
    try { 
     HANDLE hToken = NULL; 
     if (!OpenProcessToken(hProcess, TOKEN_QUERY, &hToken)) 
      throw GetLastError(); 

     DWORD cbBuf = 0; 
     if (GetTokenInformation(hToken,TokenIntegrityLevel,NULL,0,&cbBuf) != 0) 
      throw GetLastError(); 
     TOKEN_MANDATORY_LABEL * pTml = 
      reinterpret_cast<TOKEN_MANDATORY_LABEL*> (new char[cbBuf]); 
     if (pTml && 
      GetTokenInformation(
      hToken, 
      TokenIntegrityLevel, 
      pTml, 
      cbBuf, 
      &cbBuf)) { 
       CloseHandle(hToken); 
       hToken = NULL; 
       DWORD ridIl = *GetSidSubAuthority(pTml->Label.Sid, 0); 
       if (ridIl < SECURITY_MANDATORY_LOW_RID) 
        wcscpy_s(wszIl,cbIl,L"?"); 
       else if (ridIl >= SECURITY_MANDATORY_LOW_RID && 
        ridIl < SECURITY_MANDATORY_MEDIUM_RID) 
        wcscpy_s(wszIl,cbIl,L"Low"); 
       else if (ridIl >= SECURITY_MANDATORY_MEDIUM_RID && 
        ridIl < SECURITY_MANDATORY_HIGH_RID) 
        wcscpy_s(wszIl,cbIl,L"Medium"); 
       else if (ridIl >= SECURITY_MANDATORY_HIGH_RID && 
        ridIl < SECURITY_MANDATORY_SYSTEM_RID) 
        wcscpy_s(wszIl,cbIl,L"High"); 
       else if (ridIl >= SECURITY_MANDATORY_SYSTEM_RID) 
        wcscpy_s(wszIl,cbIl,L"System"); 
       if (ridIl > SECURITY_MANDATORY_LOW_RID && 
        ridIl != SECURITY_MANDATORY_MEDIUM_RID && 
        ridIl != SECURITY_MANDATORY_HIGH_RID && 
        ridIl != SECURITY_MANDATORY_SYSTEM_RID) 
        wcscat_s(wszIl,cbIl,L"+"); 
       delete [] reinterpret_cast<char*>(pTml); 
       pTml = NULL; 
     } else { 
      throw GetLastError(); 
     } 
    } catch(DWORD dwErr) { 
     err = dwErr; 
     wprintf(L"Error %d",GetLastError()); 
    } catch(std::bad_alloc e) { 
     err = ERROR_OUTOFMEMORY; 
     wprintf(L"Error %d",err); 
    } 
    return err; 
} 



DWORD GetProcessIntegrityLevel(long pid, 
           wchar_t __out_ecount_z(cbIl) *wszIl, 
           size_t cbIl) 
{ 
    HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, pid); 
    if (hProcess != NULL) 
     return GetProcessIntegrityLevel(hProcess, wszIl, cbIl); 
    else 
     return -1; 
} 

DWORD GetProcessIntegrityLevel(wchar_t __out_ecount_z(cbIl) *wszIl, 
           size_t cbIl) 
{ 
    HANDLE currentProcess = GetCurrentProcess(); 
    return GetProcessIntegrityLevel(currentProcess, wszIl, cbIl); 
} 
+0

Telle est l'approche qui a fonctionné pour moi aussi, mais comme je devais le code en C#, j'ai utilisé la méthode 'GetProcessIntegrityLevel' de Microsoft All-In-One Code de cadre, qui est décrit plus en détail [dans cet article CodeProject] (http://www.codeproject.com/Articles/66016/A-Quick-Start-Guide-of-Process-Mandatory-Level-Che) –

Questions connexes