閱讀483 返回首頁    go 技術社區[雲棲]


C# 係統應用之清除Cookies、IE臨時文件、曆史記錄

本文主要是項目"個人電腦使用記錄清除軟件"係類文章中關於清除瀏覽器Cookies、IE臨時文件、最近使用曆史記錄等內容.該篇文章的基本思想路線是首先了解上網曆史記錄的Windows中常用文件路徑,再通過文件delete方法刪除該文件下內容,但是很多文件不能讀取的;最後的解決方案是借助RunDll32.exe的Internet實現刪除緩存功能.

一. IE曆史記錄文件路徑

Internet Explorer中有指定的文件夾存儲上網記錄所有信息,包括IE緩存文件、Cookies文件、最近瀏覽的曆史記錄、訪問過的網址、地址欄網址及IE表格/密碼記錄、臨時文件等.在講述刪除IE緩存之前,先簡單介紹Cookie、Internet臨時文件、IE曆史記錄的文件路徑.
1.Windows中Cookie保存位置為"C:\Users\dell\AppData\Roaming\Microsoft\Windows\Cookies".Cookie記錄用戶ID、密碼、瀏覽器過的網頁、停留時間等信息.如下圖所示:

2.Windows中Internet臨時文件位置為"C:\Users\dell\AppData\Local\Microsoft\Windows\Temporary Internet Files",它存放著最近瀏覽過的網頁的內容(網頁|圖像|媒體副本等)以便以後快速查詢並提高速度.

3.Windows中IE曆史記錄位置為"C:\Users\dell\AppData\Local\Microsoft\Windows\History",曆史記錄是存放最近時間訪問過的網站地址,它以時間和站點存儲.如下圖所示:

IE通常清除曆史記錄還包括:下載曆史記錄、表單數據、密碼、ActiveX等數據,如下圖:

二. 采用文件delete刪除

通過Environment.GetFolderPath(Environment.SpecialFolder.InternetCache)獲取Temporary Internet Files文件(Internet臨時文件),並獲取其中的.dat文件路徑.

//獲取IE臨時文件
private void button2_Click(object sender, EventArgs e)
{
    listBox1.Items.Clear();
    string dirPath = Environment.GetFolderPath(Environment.SpecialFolder.InternetCache);
    this.textBox1.Text = dirPath.ToString();
    DirectoryInfo dir = new DirectoryInfo(dirPath);    
    //遍曆所有的文件夾 顯示.dat的文件
    foreach (FileInfo file in dir.GetFiles("*.jpg", SearchOption.AllDirectories))
    {
        try 
        {
            listBox1.Items.Add(file.DirectoryName + "\\"+ file);
            //file.Delete();
        }
        catch(Exception msg)     //異常處理
        {
            MessageBox.Show(msg.Message);
        }
    }
}

同時引用命名空間using System.IO;運行結果如下所示:

這樣,似乎清空該文件夾下所有文件就實現了清除Internet臨時文件的功能,但是使用File.Delete(FileName)刪除文件夾中文件會遇到"該文件正在另一進程使用,因此該進程無法訪問此文件"或"文件訪問被拒絕".因為Temporary Internet Files目錄是係統文件夾,讀取不到有些文件.
(該資源關於IE臨時文件獲取查看刪除,供大家學習https://download.csdn.net/detail/jee89731/3465688)

三. 調用rundll32.exe實現

 借助RunDll32.exe運行Internet選項對應dll文件,實現清除IE緩存(Internet臨時文件、Cookies、瀏覽器曆史記錄、表單記錄、用戶名密碼等).
<一>.rundll32.exe
rundll32.exe(運行32位dll文件)的作用是執行DLL文件中的內部函數,通過命令行方式調用動態鏈接程序庫,其命令行的使用方法是:Rundll32.exe DLLname,Functionname [Arguments].(其中DLLname為需要執行DLL文件名,Functionname為執行DLL文件的具體引用函數,[Arguments]為引出函數的具體參數).
Ctrl+R調用運行輸入指令執行,可運行相應的操作.如rundll32.exe shell32.dll,Control_RunDLL功能就是執行顯示控製麵板.其中關於清除IE緩存操作如下:

//1.History (曆史記錄)
RunDll32.exe InetCpl.cpl,ClearMyTracksByProcess 1
//2.Cookies
RunDll32.exe InetCpl.cpl,ClearMyTracksByProcess 2
//3.Temporary Internet Files (Internet臨時文件)
RunDll32.exe InetCpl.cpl,ClearMyTracksByProcess 8
//4.Form. Data (表單數據)
RunDll32.exe InetCpl.cpl,ClearMyTracksByProcess 16
//5.Passwords (密碼)
RunDll32.exe InetCpl.cpl,ClearMyTracksByProcess 32
//6.Delete All (全部刪除)
RunDll32.exe InetCpl.cpl,ClearMyTracksByProcess 255
//7.Delete All - "Also delete files and settings stored by add-ons"
RunDll32.exe InetCpl.cpl,ClearMyTracksByProcess 4351

<二>.ShellExecute

采用調用Win32 API函數ShellExecute()執行上麵命令行實現清除功能的.ShellExecute的功能是運行一個外部程序或者是打開一個已注冊的文件、打開一個目錄、打印一個文件等等,並對外部程序有一定的控製.它的函數原型及參數定義如下:

//ShellExecute函數運行一個外部程序並對程序進行控製(執行成功返回應用程序句柄)
static extern IntPtr ShellExecute(
    IntPtr hwnd,           //用於指定父窗口句柄
    string lpOperation,    //用於指定要進行的操作.其中open打開FileName指定文件或文件夾 print打印 explore瀏覽(runas edit find)
    string lpFileName,     //用於指定要操作的文件名或要執行的程序文件名
    string lpParameters,   //給要打開程序指定參數.若FileName是可執行程序,則此參數指定命令行參數.否則打開的是文件此處參數為nil
    string lpDirectory,    //缺省目錄,用於指定默認目錄
    ShowCommands nShowCmd  //打開選項.若FileName參數是可執行程序,則此參數指定程序窗口的初始顯示方式,否則此參數為0
);

//ShellExecute函數ShowCmd參數可選值
public enum ShowCommands : int
{
    SW_HIDE = 0,            //隱藏窗口並活動狀態另一個窗口(激活)
    SW_SHOWNORMAL = 1,      //用原來的大小和位置顯示窗口,激活
    SW_NORMAL = 1,          //同SW_SHOWNORMAL
    SW_SHOWMINIMIZED = 2,   //最小化窗口,激活
    SW_SHOWMAXIMIZED = 3,   //最大化窗口,激活
    SW_MAXIMIZE = 3,        //同SW_SHOWMAXIMIZED
    SW_SHOWNOACTIVATE = 4,  //用最近的大小和位置顯示,不改變活動窗口(不激活)
    SW_SHOW = 5,            //同SW_SHOWNORMAL
    SW_MINIMIZE = 6,        //最小化窗口,不激活
    SW_SHOWMINNOACTIVE = 7, //同SW_MINIMIZE
    SW_SHOWNA = 8,          //同SW_SHOWNOACTIVATE
    SW_RESTORE = 9,         //同SW_SHOWNORMAL
    SW_SHOWDEFAULT = 10,    //同SW_SHOWNORMAL
    SW_FORCEMINIMIZE = 11,  //最小化窗口
    SW_MAX = 11             //同SW_SHOWNORMAL
}

通過[DllImport("shell32.dll")]來調用Win32 API(這些API是微軟提供的程序接口),導入後才能調用API聲明形式所在類庫.而shell32.dll該係統文件是存放在Windows係統文件夾中的重要文件,通常情況下安裝操作係統過程中自定創建.程序源代碼如下:

//ShellExecute函數ShowCmd參數可選值
public enum ShowCommands : int
{
    SW_HIDE = 0,
    SW_SHOWNORMAL = 1,
    SW_NORMAL = 1,
    SW_SHOWMINIMIZED = 2,
    SW_SHOWMAXIMIZED = 3,
    SW_MAXIMIZE = 3,
    SW_SHOWNOACTIVATE = 4,
    SW_SHOW = 5,
    SW_MINIMIZE = 6,
    SW_SHOWMINNOACTIVE = 7,
    SW_SHOWNA = 8,
    SW_RESTORE = 9,
    SW_SHOWDEFAULT = 10,
    SW_FORCEMINIMIZE = 11,
    SW_MAX = 11
}

//調用Win32 API
[DllImport("shell32.dll")]
static extern IntPtr ShellExecute(IntPtr hwnd, string lpOperation, string lpFile, 
    string lpParameters, string lpDirectory, ShowCommands nShowCmd);

//點擊button1刪除IE臨時文件
private void button1_Click(object sender, EventArgs e)
{
    ShellExecute(IntPtr.Zero, "open", "rundll32.exe",
        "InetCpl.cpl,ClearMyTracksByProcess 255", "", ShowCommands.SW_SHOWMAXIMIZED);
}

其中DllImport需要引用命名控件using System.Runtime.InteropServices;同時它RunDll32.exe InetCpl.cpl,ClearMyTracksByProcess 255刪除所有文件.IntPtr結構用於表示指針或句柄特定類型,IntPtr.Zero初始化為零的句柄.運行結果如下圖所示:

注意:雖然學習了ShellExecute的具體使用方法,但是還是關於ShowCommands參數沒有弄明白它具體的變化;同時相關方麵書籍太少,希望大家提供些這方麵書籍和更好的方法.

<三>.ShellExecute功能擴展
ShellExecute()函數還用很多功能可以給大家帶來方便,下麵介紹簡單幾個用法.(替換上麵button1代碼)

//調用rundll32.exe清除曆史記錄
ShellExecute(IntPtr.Zero, "open", "rundll32.exe",
    "InetCpl.cpl,ClearMyTracksByProcess 255", "", ShowCommands.SW_SHOWMAXIMIZED);
//訪問csdn eastmount博客
ShellExecute(this.Handle, "open", "https://blog.csdn.net/eastmount", 
    null, null, ShowCommands.SW_SHOW);
//發送郵件
ShellExecute(this.Handle, "open", "mailto:eastmount@163.com",
    null, null, ShowCommands.SW_SHOW);
//調用calc.exe打開計算器
ShellExecute(this.Handle, "open", "calc.exe", null, null, ShowCommands.SW_FORCEMINIMIZE);
//調用NOTEPAD.EXE打開記事本
ShellExecute(this.Handle, "open", "NOTEPAD.EXE", null, null, ShowCommands.SW_SHOWNORMAL);

<四>.調用Process啟動RunDll32.exe

借助RunDll32,exe運行Internet選項實現刪除臨時文件也可以調用Process啟動RunDll32.exe實現.下麵代碼僅供參考,我沒有研究該方法,僅作為在線筆記供自己查看:

//清除ie緩存、cookie以及一切記錄
private void IEclear()
{    
    Process process = new Process();
    process.StartInfo.FileName = "RunDll32.exe";
    process.StartInfo.Arguments = "InetCpl.cpl,ClearMyTracksByProcess 255";
    process.StartInfo.UseShellExecute = false;        //關閉Shell的使用
    process.StartInfo.RedirectStandardInput = true;   //重定向標準輸入
    process.StartInfo.RedirectStandardOutput = true;  //重定向標準輸出
    process.StartInfo.RedirectStandardError = true;   //重定向錯誤輸出
    process.StartInfo.CreateNoWindow = true;
    process.Start();
}  

四. 總結

該文章主要結合自己的項目清除瀏覽器的Cookies、IE臨時文件、最近曆史記錄,文章很好的展現了我的思想:
1.首先作者想到獲取相應的指定文件的路徑,清空該路徑下的文件即可實現該功能;
2.但是由於係統文件不能訪問或停止,所以作者尋找到了借助RunDll32.exe實現,主要講述調用Win32 API函數ShellExecute刪除IE緩存;
3.最後補充了ShellExcute()函數的功能和其他操作、調用Process啟動RunDll32.exe的代碼.
同時作者在係列文章中先講述了獲取Windows最近使用曆史記錄文章、Cookies和Session的使用,最後才完成該文章實現清除曆史記錄操作(其他方法同理).
文章引用了百度百科C#清除IE臨時文件緩存cookies的方法 |xueer8835的文章 | zjw的文章 | Adam Viki的文章 |CSDN刪除cookie討論 感謝這些作者,也希望大家可以通過該鏈接學習.
最後希望該文章對大家有所幫助,如果有錯誤或不足之處,請大家海涵!

(By:Eastmount 2014-1-28 夜1點https://blog.csdn.net/eastmount)

最後更新:2017-04-03 12:54:53

  上一篇:go snmp 修改默認 127.0.0.1 地址為 0.0.0.0
  下一篇:go uva 11825 - Hackers&#39; Crackdown dp