首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> VC >> 關於VC++

VC++ 實作全方位歷史記錄清除工具:從 IE 快取到系統登錄的完整解決方案

     編輯:關於VC++

前言:為什麼需要自動化清除歷史記錄?

在共用電腦的環境下,使用者往往不希望他人發現自己的操作痕跡——瀏覽過的網址、輸入過的表單資料、執行過的指令等。雖然 Windows 提供手動清除功能,但項目分散、步驟繁瑣,極不方便。本文整理並整合多方資料,提供一個較為全面的 VC++ 實作方案,可一次性清除 17 類常見歷史記錄,並附完整原始碼供下載參考。

程式架構與必要設定

標頭檔與連結庫

在 stdafx.h 中加入:

#include <atlbase.h>

專案屬性 → Link → 輸入 → 附加相依性,加入:

Wininet.lib shlwapi.lib

對話方塊類別宣告

#include <wininet.h>
#include <UrlHist.h>
#define SWEEP_BUFFER_SIZE 10000

public:
    enum DEL_CACHE_TYPE { File, Cookie };

輔助函式宣告(實作請參考原始碼)

BOOL DeleteUrlCache(DEL_CACHE_TYPE type);
BOOL EmptyDirectory(LPCTSTR szPath, BOOL bDeleteDesktopIni = FALSE, BOOL bWipeIndexDat = FALSE);
BOOL IsWindowsNT();
BOOL IsWindows2k();
BOOL GetUserSid(PSID* ppSid);
void GetSidString(PSID pSid, LPTSTR szBuffer);
BOOL GetOldSD(HKEY hKey, LPCTSTR pszSubKey, BYTE** pSD);
BOOL CreateNewSD(PSID pSid, SECURITY_DESCRIPTOR* pSD, PACL* ppDacl);
BOOL RegSetPrivilege(HKEY hKey, LPCTSTR pszSubKey, SECURITY_DESCRIPTOR* pSD, BOOL bRecursive);
BOOL WipeFile(LPCTSTR szDir, LPCTSTR szFile);

17 項清除功能逐項實作

1. 清除 IE 暫存檔

TCHAR szPath[MAX_PATH];
DeleteUrlCache(File);
if (SHGetSpecialFolderPath(NULL, szPath, CSIDL_INTERNET_CACHE, FALSE))
    EmptyDirectory(szPath);

替代方案:直接呼叫 WinInet API 列舉並刪除快取項目(略)。

2. 清除 Cookie

TCHAR szPath[MAX_PATH];
DeleteUrlCache(Cookie);
if (SHGetSpecialFolderPath(NULL, szPath, CSIDL_COOKIES, FALSE))
    EmptyDirectory(szPath);

3. 清除 IE 位址列歷史

SHDeleteKey(HKEY_CURRENT_USER,
    _T("Software\\Microsoft\\Internet Explorer\\TypedURLs"));

4. 清除表單自動完成紀錄

涉及受保護的儲存體,需先取得使用者 SID、調整登錄權限後刪除:

// 核心邏輯:NT/2000/XP 需修改安全描述子,Win9x 直接用使用者名稱
// 詳細程式碼請見原文,關鍵路徑:
// Software\\Microsoft\\Protected Storage System Provider\\<SID>\\Data\\e161255a-37c3-11d2-bcaa-00c04fd929db

5. 清除自動完成密碼

SHDeleteKey(HKEY_CURRENT_USER,
    _T("Software\\Microsoft\\Internet Explorer\\IntelliForms"));

6. 清除我的最愛

TCHAR szPath[MAX_PATH];
if (SHGetSpecialFolderPath(NULL, szPath, CSIDL_FAVORITES, FALSE))
    EmptyDirectory(szPath);

7. 清除 RAS 自動撥號紀錄

SHDeleteKey(HKEY_CURRENT_USER,
    _T("Software\\Microsoft\\RAS Autodial\\Addresses"));

8. 清除系統暫存資料夾

TCHAR szPath[MAX_PATH];
if (GetTempPath(MAX_PATH, szPath))
    EmptyDirectory(szPath, TRUE);

9. 清空資源回收筒

SHEmptyRecycleBin(NULL, NULL,
    SHERB_NOCONFIRMATION | SHERB_NOPROGRESSUI | SHERB_NOSOUND);

10. 清除「執行」對話方塊歷史

SHDeleteKey(HKEY_CURRENT_USER,
    _T("Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\RunMRU"));

11. 清除「我的文件」最近使用清單

TCHAR szPath[MAX_PATH];
if (SHGetSpecialFolderPath(NULL, szPath, CSIDL_RECENT, FALSE))
    EmptyDirectory(szPath);
SHDeleteKey(HKEY_CURRENT_USER,
    _T("Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\RecentDocs"));

12. 清除上次登入使用者名稱

SHDeleteValue(HKEY_CURRENT_USER,
    _T("Software\\Microsoft\\Windows NT\\CurrentVersion\\Winlogon"),
    _T("DefaultUserName"));
SHDeleteValue(HKEY_CURRENT_USER,
    _T("Software\\Microsoft\\Windows NT\\CurrentVersion\\Winlogon"),
    _T("AltDefaultUserName"));
SHDeleteValue(HKEY_LOCAL_MACHINE,
    _T("Software\\Microsoft\\Windows\\CurrentVersion\\Winlogon"),
    _T("DefaultUserName"));

13. 清除「搜尋檔案」歷史

SHDeleteKey(HKEY_CURRENT_USER,
    _T("Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\Doc Find Spec MRU"));
SHDeleteKey(HKEY_CURRENT_USER,
    _T("Software\\Microsoft\\Internet Explorer\\Explorer Bars\\{C4EE31F3-4768-11D2-BE5C-00A0C9A83DA1}\\ContainingTextMRU"));
SHDeleteKey(HKEY_CURRENT_USER,
    _T("Software\\Microsoft\\Internet Explorer\\Explorer Bars\\{C4EE31F3-4768-11D2-BE5C-00A0C9A83DA1}\\FilesNamedMRU"));

14. 清除「搜尋電腦」歷史

SHDeleteKey(HKEY_CURRENT_USER,
    _T("Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\FindComputerMRU"));
SHDeleteKey(HKEY_CURRENT_USER,
    _T("Software\\Microsoft\\Internet Explorer\\Explorer Bars\\{C4EE31F3-4768-11D2-BE5C-00A0C9A83DA1}\\ComputerNameMRU"));

15. 清除網路連線歷史

TCHAR szPath[MAX_PATH];
if (SHGetSpecialFolderPath(NULL, szPath, CSIDL_NETHOOD, FALSE))
    EmptyDirectory(szPath);

16. 清除遠端登入歷史

CString sKey;
for (int i = 1; i <= 8; i++) {
    sKey.Format(_T("Machine%d"), i);
    SHDeleteValue(HKEY_CURRENT_USER, _T("Software\\Microsoft\\Telnet"), sKey);
    sKey.Format(_T("Service%d"), i);
    SHDeleteValue(HKEY_CURRENT_USER, _T("Software\\Microsoft\\Telnet"), sKey);
    sKey.Format(_T("TermType%d"), i);
    SHDeleteValue(HKEY_CURRENT_USER, _T("Software\\Microsoft\\Telnet"), sKey);
}
SHDeleteValue(HKEY_CURRENT_USER, _T("Software\\Microsoft\\Telnet"), _T("LastMachine"));
SHDeleteValue(HKEY_CURRENT_USER, _T("Software\\Microsoft\\Telnet"), _T("LastService"));
SHDeleteValue(HKEY_CURRENT_USER, _T("Software\\Microsoft\\Telnet"), _T("LastTermType"));

17. 清除瀏覽網址歷史記錄

方法一:使用 IUrlHistoryStg2::ClearHistory()

#include <SHLGUID.H>
HRESULT ClearHistory() {
    HRESULT hr;
    CoInitialize(NULL);
    IUrlHistoryStg2* pUrlHistoryStg2 = NULL;
    hr = CoCreateInstance(CLSID_CUrlHistory, NULL, CLSCTX_INPROC_SERVER,
        IID_IUrlHistoryStg2, (void**)&pUrlHistoryStg2);
    if (SUCCEEDED(hr)) {
        hr = pUrlHistoryStg2->ClearHistory();
        pUrlHistoryStg2->Release();
    }
    CoUninitialize();
    return hr;
}

方法二:直接刪除 History 資料夾內容(不完美但有效)

TCHAR szPath[MAX_PATH];
GetWindowsDirectory(szPath, MAX_PATH);
_tcscat(szPath, _T("\\History"));
EmptyDirectory(szPath, FALSE, TRUE);
if (SHGetSpecialFolderPath(NULL, szPath, CSIDL_HISTORY, FALSE))
    EmptyDirectory(szPath, FALSE, TRUE);

結語

至此,一個功能完整的歷史記錄清除工具已實作完成。細節請參考作者提供的完整原始碼。此工具在 Windows 98/2000/XP 下測試通過,對於維護共用電腦隱私極具實用價值。

作者:陳亮 (cl7986@etang.com)

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved