检查 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 以标准模式而不是 Quirks 模式呈现?