-6

如何以编程方式删除所有主流浏览器(IE、Firefox、Opera、Chrome 和 Safari)中的 cookie、缓存和历史记录(即所有浏览数据)?

我发现以下博客条目详细介绍了完成任务的批处理脚本:http: //www.catonmat.net/blog/clear-privacy-ie-firefox-opera-chrome-safari/

但我想将这些转换为 C#。


我有 WinINETCache 类,但我在这个命令附近有一些错误......

代码描述行

        long fileTime = (internet_cache_entry_infoa.LastModifiedTime.dwHighDateTime << 0x20) | ((long)((ulong)internet_cache_entry_infoa.LastModifiedTime.dwLowDateTime));
        long num5 = (internet_cache_entry_infoa.LastAccessTime.dwHighDateTime << 0x20) | ((long)((ulong)internet_cache_entry_infoa.LastAccessTime.dwLowDateTime));
        long num6 = (internet_cache_entry_infoa.LastSyncTime.dwHighDateTime << 0x20) | ((long)((ulong)internet_cache_entry_infoa.LastSyncTime.dwLowDateTime));
        long num7 = (internet_cache_entry_infoa.ExpireTime.dwHighDateTime << 0x20) | ((long)((ulong)internet_cache_entry_infoa.ExpireTime.dwLowDateTime));

我想知道我必须调用哪个库才能成功执行。课程如下 - 我该如何称呼这个课程?

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Runtime.InteropServices;

namespace watcher
{
    class WinINETCache
    {

        // Fields
        private const int CACHEGROUP_FLAG_FLUSHURL_ONDELETE = 2;
        private const int CACHEGROUP_SEARCH_ALL = 0;
        private const int ERROR_FILE_NOT_FOUND = 2;
        private const int ERROR_INSUFFICENT_BUFFER = 0x7a;
        private const int ERROR_NO_MORE_ITEMS = 0x103;

        // Methods
        public static void ClearCacheItems(bool bClearFiles, bool bClearCookies)
        {
            if (!bClearCookies && !bClearFiles)
            {
                throw new ArgumentException("You must call ClearCacheItems with at least one target");
            }
            if (Environment.OSVersion.Version.Major > 5)
            {
                VistaClearTracks(bClearFiles, bClearCookies);
            }
            else
            {
                if (bClearCookies)
                {
                    ClearCookiesForHost("*");
                }
                if (bClearFiles)
                {
                    long lpGroupId = 0L;
                    int lpdwFirstCacheEntryInfoBufferSize = 0;
                    int cb = 0;
                    IntPtr zero = IntPtr.Zero;
                    IntPtr hFind = IntPtr.Zero;
                    bool flag = false;
                    hFind = FindFirstUrlCacheGroup(0, 0, IntPtr.Zero, 0, ref lpGroupId, IntPtr.Zero);
                    int num4 = Marshal.GetLastWin32Error();
                    if (((hFind != IntPtr.Zero) && (0x103 != num4)) && (2 != num4))
                    {
                        do
                        {
                            flag = DeleteUrlCacheGroup(lpGroupId, 2, IntPtr.Zero);
                            num4 = Marshal.GetLastWin32Error();
                            if (!flag && (2 == num4))
                            {
                                flag = FindNextUrlCacheGroup(hFind, ref lpGroupId, IntPtr.Zero);
                                num4 = Marshal.GetLastWin32Error();
                            }
                        }
                        while (flag || ((0x103 != num4) && (2 != num4)));
                    }
                    hFind = FindFirstUrlCacheEntryEx(null, 0, WININETCACHEENTRYTYPE.ALL, 0L, IntPtr.Zero, ref lpdwFirstCacheEntryInfoBufferSize, IntPtr.Zero, IntPtr.Zero, IntPtr.Zero);
                    num4 = Marshal.GetLastWin32Error();
                    if ((IntPtr.Zero != hFind) || (0x103 != num4))
                    {
                        cb = lpdwFirstCacheEntryInfoBufferSize;
                        zero = Marshal.AllocHGlobal(cb);
                        hFind = FindFirstUrlCacheEntryEx(null, 0, WININETCACHEENTRYTYPE.ALL, 0L, zero, ref lpdwFirstCacheEntryInfoBufferSize, IntPtr.Zero, IntPtr.Zero, IntPtr.Zero);
                        num4 = Marshal.GetLastWin32Error();
                        do
                        {
                            INTERNET_CACHE_ENTRY_INFOA internet_cache_entry_infoa = (INTERNET_CACHE_ENTRY_INFOA)Marshal.PtrToStructure(zero, typeof(INTERNET_CACHE_ENTRY_INFOA));
                            lpdwFirstCacheEntryInfoBufferSize = cb;
                            if (WININETCACHEENTRYTYPE.COOKIE_CACHE_ENTRY != (internet_cache_entry_infoa.CacheEntryType & WININETCACHEENTRYTYPE.COOKIE_CACHE_ENTRY))
                            {
                                flag = DeleteUrlCacheEntry(internet_cache_entry_infoa.lpszSourceUrlName);
                            }
                            flag = FindNextUrlCacheEntryEx(hFind, zero, ref lpdwFirstCacheEntryInfoBufferSize, IntPtr.Zero, IntPtr.Zero, IntPtr.Zero);
                            num4 = Marshal.GetLastWin32Error();
                            if (!flag && (0x103 == num4))
                            {
                                break;
                            }
                            if (!flag && (lpdwFirstCacheEntryInfoBufferSize > cb))
                            {
                                cb = lpdwFirstCacheEntryInfoBufferSize;
                                zero = Marshal.ReAllocHGlobal(zero, (IntPtr)cb);
                                flag = FindNextUrlCacheEntryEx(hFind, zero, ref lpdwFirstCacheEntryInfoBufferSize, IntPtr.Zero, IntPtr.Zero, IntPtr.Zero);
                            }
                        }
                        while (flag);
                        Marshal.FreeHGlobal(zero);
                    }
                }
            }
        }

        public static void ClearCookies()
        {
            ClearCacheItems(false, true);
        }

        [CodeDescription("Delete all permanent WinINET cookies for sHost; won't clear memory-only session cookies. Supports hostnames with an optional leading wildcard, e.g. *example.com. NOTE: Will not work on VistaIE Protected Mode cookies.")]
        public static void ClearCookiesForHost(string sHost)
        {
            string str;
            INTERNET_CACHE_ENTRY_INFOA internet_cache_entry_infoa;
            bool flag;
            sHost = sHost.Trim();
            if (sHost.Length < 1)
            {
                return;
            }
            if (sHost == "*")
            {
                str = string.Empty;
                if (Environment.OSVersion.Version.Major > 5)
                {
                    VistaClearTracks(false, true);
                    return;
                }
            }
            else
            {
                str = sHost.StartsWith("*") ? sHost.Substring(1).ToLower() : ("@" + sHost.ToLower());
            }
            int lpdwFirstCacheEntryInfoBufferSize = 0;
            int cb = 0;
            IntPtr zero = IntPtr.Zero;
            IntPtr hFind = IntPtr.Zero;
            if ((FindFirstUrlCacheEntry("cookie:", IntPtr.Zero, ref lpdwFirstCacheEntryInfoBufferSize) == IntPtr.Zero) && (0x103 == Marshal.GetLastWin32Error()))
            {
                return;
            }
            cb = lpdwFirstCacheEntryInfoBufferSize;
            zero = Marshal.AllocHGlobal(cb);
            hFind = FindFirstUrlCacheEntry("cookie:", zero, ref lpdwFirstCacheEntryInfoBufferSize);
        Label_00C2:
            internet_cache_entry_infoa = (INTERNET_CACHE_ENTRY_INFOA)Marshal.PtrToStructure(zero, typeof(INTERNET_CACHE_ENTRY_INFOA));
            lpdwFirstCacheEntryInfoBufferSize = cb;
            if (WININETCACHEENTRYTYPE.COOKIE_CACHE_ENTRY == (internet_cache_entry_infoa.CacheEntryType & WININETCACHEENTRYTYPE.COOKIE_CACHE_ENTRY))
            {
                bool flag2;
                if (str.Length == 0)
                {
                    flag2 = true;
                }
                else
                {
                    string str2 = Marshal.PtrToStringAnsi(internet_cache_entry_infoa.lpszSourceUrlName);
                    int index = str2.IndexOf('/');
                    if (index > 0)
                    {
                        str2 = str2.Remove(index);
                    }
                    flag2 = str2.ToLower().EndsWith(str);
                }
                if (flag2)
                {
                    flag = DeleteUrlCacheEntry(internet_cache_entry_infoa.lpszSourceUrlName);
                }
            }
        Label_014A:
            flag = FindNextUrlCacheEntry(hFind, zero, ref lpdwFirstCacheEntryInfoBufferSize);
            if (flag || (0x103 != Marshal.GetLastWin32Error()))
            {
                if (flag || (lpdwFirstCacheEntryInfoBufferSize <= cb))
                {
                    goto Label_00C2;
                }
                cb = lpdwFirstCacheEntryInfoBufferSize;
                zero = Marshal.ReAllocHGlobal(zero, (IntPtr)cb);
                goto Label_014A;
            }
            Marshal.FreeHGlobal(zero);
        }

        public static void ClearFiles()
        {
            ClearCacheItems(true, false);
        }

        [return: MarshalAs(UnmanagedType.Bool)]
        [DllImport("wininet.dll", EntryPoint = "DeleteUrlCacheEntryA", CallingConvention = CallingConvention.StdCall, CharSet = CharSet.Ansi, SetLastError = true, ExactSpelling = true)]
        private static extern bool DeleteUrlCacheEntry(IntPtr lpszUrlName);
        [return: MarshalAs(UnmanagedType.Bool)]
        [DllImport("wininet.dll", CallingConvention = CallingConvention.StdCall, CharSet = CharSet.Unicode, SetLastError = true)]
        private static extern bool DeleteUrlCacheGroup(long GroupId, int dwFlags, IntPtr lpReserved);
        [DllImport("wininet.dll", EntryPoint = "FindFirstUrlCacheEntryA", CallingConvention = CallingConvention.StdCall, CharSet = CharSet.Ansi, SetLastError = true, ExactSpelling = true)]
        private static extern IntPtr FindFirstUrlCacheEntry([MarshalAs(UnmanagedType.LPTStr)] string lpszUrlSearchPattern, IntPtr lpFirstCacheEntryInfo, ref int lpdwFirstCacheEntryInfoBufferSize);
        [DllImport("wininet.dll", EntryPoint = "FindFirstUrlCacheEntryExA", CallingConvention = CallingConvention.StdCall, CharSet = CharSet.Ansi, SetLastError = true, ExactSpelling = true)]
        private static extern IntPtr FindFirstUrlCacheEntryEx([MarshalAs(UnmanagedType.LPTStr)] string lpszUrlSearchPattern, int dwFlags, WININETCACHEENTRYTYPE dwFilter, long GroupId, IntPtr lpFirstCacheEntryInfo, ref int lpdwFirstCacheEntryInfoBufferSize, IntPtr lpReserved, IntPtr pcbReserved2, IntPtr lpReserved3);
        [DllImport("wininet.dll", CallingConvention = CallingConvention.StdCall, CharSet = CharSet.Unicode, SetLastError = true)]
        private static extern IntPtr FindFirstUrlCacheGroup(int dwFlags, int dwFilter, IntPtr lpSearchCondition, int dwSearchCondition, ref long lpGroupId, IntPtr lpReserved);
        [return: MarshalAs(UnmanagedType.Bool)]
        [DllImport("wininet.dll", EntryPoint = "FindNextUrlCacheEntryA", CallingConvention = CallingConvention.StdCall, CharSet = CharSet.Ansi, SetLastError = true, ExactSpelling = true)]
        private static extern bool FindNextUrlCacheEntry(IntPtr hFind, IntPtr lpNextCacheEntryInfo, ref int lpdwNextCacheEntryInfoBufferSize);
        [return: MarshalAs(UnmanagedType.Bool)]
        [DllImport("wininet.dll", EntryPoint = "FindNextUrlCacheEntryExA", CallingConvention = CallingConvention.StdCall, CharSet = CharSet.Ansi, SetLastError = true, ExactSpelling = true)]
        private static extern bool FindNextUrlCacheEntryEx(IntPtr hEnumHandle, IntPtr lpNextCacheEntryInfo, ref int lpdwNextCacheEntryInfoBufferSize, IntPtr lpReserved, IntPtr pcbReserved2, IntPtr lpReserved3);
        [return: MarshalAs(UnmanagedType.Bool)]
        [DllImport("wininet.dll", CallingConvention = CallingConvention.StdCall, CharSet = CharSet.Unicode, SetLastError = true)]
        private static extern bool FindNextUrlCacheGroup(IntPtr hFind, ref long lpGroupId, IntPtr lpReserved);
        internal static string GetCacheItemInfo(string sURL)
        {
            int lpdwCacheEntryInfoBufferSize = 0;
            int cb = 0;
            IntPtr zero = IntPtr.Zero;
            bool flag = GetUrlCacheEntryInfoA(sURL, zero, ref lpdwCacheEntryInfoBufferSize);
            int num = Marshal.GetLastWin32Error();
            if (flag || (num != 0x7a))
            {
                return string.Format("This URL is not present in the WinINET cache. [Code: {0}]", num);
            }
            cb = lpdwCacheEntryInfoBufferSize;
            zero = Marshal.AllocHGlobal(cb);
            flag = GetUrlCacheEntryInfoA(sURL, zero, ref lpdwCacheEntryInfoBufferSize);
            num = Marshal.GetLastWin32Error();
            if (!flag)
            {
                Marshal.FreeHGlobal(zero);
                return ("GetUrlCacheEntryInfoA with buffer failed. 2=filenotfound 122=insufficient buffer, 259=nomoreitems. Last error: " + num.ToString() + "\n");
            }
            INTERNET_CACHE_ENTRY_INFOA internet_cache_entry_infoa = (INTERNET_CACHE_ENTRY_INFOA)Marshal.PtrToStructure(zero, typeof(INTERNET_CACHE_ENTRY_INFOA));
            lpdwCacheEntryInfoBufferSize = cb;
            long fileTime = (internet_cache_entry_infoa.LastModifiedTime.dwHighDateTime << 0x20) | ((long)((ulong)internet_cache_entry_infoa.LastModifiedTime.dwLowDateTime));
            long num5 = (internet_cache_entry_infoa.LastAccessTime.dwHighDateTime << 0x20) | ((long)((ulong)internet_cache_entry_infoa.LastAccessTime.dwLowDateTime));
            long num6 = (internet_cache_entry_infoa.LastSyncTime.dwHighDateTime << 0x20) | ((long)((ulong)internet_cache_entry_infoa.LastSyncTime.dwLowDateTime));
            long num7 = (internet_cache_entry_infoa.ExpireTime.dwHighDateTime << 0x20) | ((long)((ulong)internet_cache_entry_infoa.ExpireTime.dwLowDateTime));
            string[] strArray = new string[] { 
            "Url:\t\t", Marshal.PtrToStringAnsi(internet_cache_entry_infoa.lpszSourceUrlName), "\nCache File:\t", Marshal.PtrToStringAnsi(internet_cache_entry_infoa.lpszLocalFileName), "\nSize:\t\t", ((ulong) ((internet_cache_entry_infoa.dwSizeHigh << 0x20) + internet_cache_entry_infoa.dwSizeLow)).ToString("0,0"), " bytes\nFile Extension:\t", Marshal.PtrToStringAnsi(internet_cache_entry_infoa.lpszFileExtension), "\nHit Rate:\t", internet_cache_entry_infoa.dwHitRate.ToString(), "\nUse Count:\t", internet_cache_entry_infoa.dwUseCount.ToString(), "\nDon't Scavenge for:\t", internet_cache_entry_infoa._Union.dwExemptDelta.ToString(), " seconds\nLast Modified:\t", DateTime.FromFileTime(fileTime).ToString(), 
            "\nLast Accessed:\t", DateTime.FromFileTime(num5).ToString(), "\nLast Synced:  \t", DateTime.FromFileTime(num6).ToString(), "\nEntry Expires:\t", DateTime.FromFileTime(num7).ToString(), "\n"
         };
            string str = string.Concat(strArray);
            Marshal.FreeHGlobal(zero);
            return str;
        }

        [return: MarshalAs(UnmanagedType.Bool)]
        [DllImport("wininet.dll", CharSet = CharSet.Ansi, SetLastError = true, ExactSpelling = true)]
        private static extern bool GetUrlCacheEntryInfoA(string lpszUrlName, IntPtr lpCacheEntryInfo, ref int lpdwCacheEntryInfoBufferSize);
        private static void VistaClearTracks(bool bClearFiles, bool bClearCookies)
        {
            int num = 0;
            if (bClearCookies)
            {
                num = 2;
            }
            if (bClearFiles)
            {
                num = 0x100c;
            }
            try
            {
                using (Process.Start("rundll32.exe", "inetcpl.cpl,ClearMyTracksByProcess " + num.ToString()))
                {
                }
            }
            catch (Exception exception)
            {
                FiddlerApplication.DoNotifyUser("Failed to launch ClearMyTracksByProcess.\n" + exception.Message, "Error");
            }
        }

        // Nested Types
        [StructLayout(LayoutKind.Sequential)]
        private class INTERNET_CACHE_ENTRY_INFOA
        {
            public uint dwStructureSize;
            public IntPtr lpszSourceUrlName;
            public IntPtr lpszLocalFileName;
            public WinINETCache.WININETCACHEENTRYTYPE CacheEntryType;
            public uint dwUseCount;
            public uint dwHitRate;
            public uint dwSizeLow;
            public uint dwSizeHigh;
            public FILETIME LastModifiedTime;
            public FILETIME ExpireTime;
            public FILETIME LastAccessTime;
            public FILETIME LastSyncTime;
            public IntPtr lpHeaderInfo;
            public uint dwHeaderInfoSize;
            public IntPtr lpszFileExtension;
            public WinINETCache.WININETCACHEENTRYINFOUNION _Union;
        }

        [StructLayout(LayoutKind.Explicit)]
        private struct WININETCACHEENTRYINFOUNION
        {
            // Fields
            [FieldOffset(0)]
            public uint dwExemptDelta;
            [FieldOffset(0)]
            public uint dwReserved;
        }

        private enum WININETCACHEENTRYTYPE
        {
            ALL = 0x31003d,
            COOKIE_CACHE_ENTRY = 0x100000,
            EDITED_CACHE_ENTRY = 8,
            None = 0,
            NORMAL_CACHE_ENTRY = 1,
            SPARSE_CACHE_ENTRY = 0x10000,
            STICKY_CACHE_ENTRY = 4,
            TRACK_OFFLINE_CACHE_ENTRY = 0x10,
            TRACK_ONLINE_CACHE_ENTRY = 0x20,
            URLHISTORY_CACHE_ENTRY = 0x200000
        }
    }
}
4

1 回答 1

1

转换所有脚本对于论坛答案来说太过分了。

你应该看看 DirectoryInfo 和 FileInfo 类。它们应该可以帮助您将 80% 的批处理命令转换为 c#。

以下示例代码将删除 C:\TempFiles 中的所有文件和目录(包括子目录)(使用它而不是 del 命令):

DirectoryInfo dInfo = new DirectoryInfo(@"C:\TempFiles\");

foreach (FileInfo fi in dInfo.GetFiles())
{
    // You could also check the file Extension here.
    if (fi.Exists())
    {
        fi.Delete();
    }
}

foreach (DirectoryInfo di in dInfo.GetDirectories())
{
    if (di.Exists())
    {
        di.Delete(true);
    }
}
于 2013-03-17T21:46:39.013 回答