检查 Internet Explorer 保护模式

Posted

技术标签:

【中文标题】检查 Internet Explorer 保护模式【英文标题】:Checking Internet Explorer protected mode 【发布时间】:2009-02-19 18:32:08 【问题描述】:

我有几个问题: 1) 据我所知,IE 扩展中使用的函数 IEIsProtectedModeProcess 有没有办法以编程方式知道 Internet Explorer 是否在 IE 之外以保护模式运行?

谢谢

【问题讨论】:

【参考方案1】:

这是一个尝试解决的有趣问题。我提到了微软出版社的Writing Secure Code for Windows Vista。

基本上,当 IE 处于保护模式时,它运行在“低”完整性级别。如果完整性级别大于低(例如中或高),则 IE 进程未在保护模式下运行。 Vista 上进程的默认完整性级别为“中”。这里有一些代码可以让您在给定进程的 pid 或进程句柄的情况下获得进程的完整性级别。如果您有 IWebBrowser2,您可以使用 GetWindowThreadProcessId 从 HWND 获取 pid。

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);

【讨论】:

这也是对我有用的方法,但由于我需要在 C# 中编写代码,因此我使用了 Microsoft All-In-One Code Framework 中的 GetProcessIntegrityLevel 方法,该方法有更详细的描述in this CodeProject article

以上是关于检查 Internet Explorer 保护模式的主要内容,如果未能解决你的问题,请参考以下文章

Internet Explorer 盒子模型 - 啥是偏移量?

如果在 Internet Explorer 中安装了 Lync 插件,我如何检查 Javascript?

检测当前 Internet Explorer 安全区域

如何强制 Internet Explorer 以标准模式而不是 Quirks 模式呈现?

强制 Internet Explorer 9 使用 IE 9 模式

在 Intranet 中强制使用“Internet Explorer 8”浏览器模式