`
hududanyzd
  • 浏览: 815675 次
文章分类
社区版块
存档分类
最新评论

用C#编程删除系统自带游戏

 
阅读更多

摘要:本文通过编程删除了windows2000中的四个系统自带的游戏,在编写过程中用树状视图和列表视图方式显示了windows2000中隐含的DllCache目录及该目录下的文件。

正文

近来,许多企业、机关为控制员工上班时间玩游戏,制定了许多制度,但并没有将游戏删除,尤其是系统自带的游戏程序,自从windows 2000采用了动态缓存目录的保护措施以来,我们通常用原来的方法在删除系统自带游戏几秒后,游戏又可以使用了。虽然有些文章介绍了那是由于微软系统的出于自身安全,在DllCache目录下进行了备份处理,但我们在通常情况下显示了所有隐藏文件后,仍然无法见到system32下的DllCache目录,更不用说将其下的文件删除了。本文介绍了在Visual Studio 2005的C#下编制程序的主要内容来实现显示DllCache目录下的文件,并删除windows 2000 pro系统自带的四个游戏。

一、界面设计

新建windows应用程序,在出现的form中添加TreeView、ListView和Button控件各一个,调整到适当的大小,改变button1的text为“删除系统自带程序”,将listview1的view项设置为detail,其余不变。添加三个imagelist控件,分别改名为TreeImageList、TreeViewImageList和ListViewImageList,用于存放引用自系统shell32.dll中的图标。

二、显示DllCache目录及其下面的文件

1、 添加使用命名空间和文件结构信息

using System.IO;

using System.Runtime.InteropServices;

using System.Reflection;

2、添加文件结构信息,调用windows API中的提取图标函数和获取系统路径函数,并构造自定义的提取图标函数

[StructLayout(LayoutKind.Sequential)]

public struct SHFILEINFO

{ public IntPtr hIcon;

public int iIcon;

public uint dwAttributes;

public char szDisplayName;

public char szTypeName; }

private System.Windows.Forms.ImageList TreeImageList; //

//获取图标

[DllImport("Shell32.dll")]

public static extern int ExtractIcon(IntPtr h, string strx, int ii);

// 获取系统路径

[DllImport("Kernel32.dll" ,CharSet = CharSet.Auto)]

public static extern Int32 GetSystemDirectory(StringBuilder WinDir, Int32 usize);

//构造自定义提取图标函数

protected virtual Icon myExtractIcon(string FileName, int iIndex)

{ try

{ IntPtr hIcon = (IntPtr) ExtractIcon(this.Handle, FileName, iIndex);

if (!hIcon.Equals(null))

{ Icon icon = Icon.FromHandle(hIcon);

return icon; }

}

catch (Exception ex)

{ MessageBox.Show(ex.Message, "错误提示", 0, MessageBoxIcon.Error); }

return null;

}

3、在Form构造函数中添加获取图标信息,图标取自shell32.dll

Icon ic0 = myExtractIcon("%SystemRoot%\\system32\\shell32.dll", 15);

TreeImageList.Images.Add(ic0);

Icon ic1 = myExtractIcon("%SystemRoot%\\system32\\shell32.dll", 5);

TreeImageList.Images.Add(ic1);

Icon ic2 = myExtractIcon("%SystemRoot%\\system32\\shell32.dll", 7);

TreeImageList.Images.Add(ic2);

Icon ic3 = myExtractIcon("%SystemRoot%\\system32\\shell32.dll", 11);

TreeImageList.Images.Add(ic3);

Icon ic4 = myExtractIcon("%SystemRoot%\\system32\\shell32.dll", 3);

TreeImageList.Images.Add(ic4);

Icon ic5 = myExtractIcon("%SystemRoot%\\system32\\shell32.dll", 4);

TreeImageList.Images.Add(ic5);

Icon ic6 = myExtractIcon("%SystemRoot%\\system32\\shell32.dll", 101);

TreeImageList.Images.Add(ic6);

Icon ic7 = myExtractIcon("%SystemRoot%\\system32\\shell32.dll", 51);

4、在TreeView1中显示当前系统盘符和文件目录树

(1) 声明公共变量

public const int nChars = 128;

public StringBuilder Buff = new StringBuilder(nChars);

(2) 在Form构造函数中添加下列语句,用于添加根节点

GetSystemDirectory(Buff, nChars);

Buff.Remove(3, Buff.Length - 3);

TreeNode RootNode = new TreeNode(Buff.ToString(), 0, 0);

treeView1.BeginUpdate();

treeView1.Nodes.Clear();

treeView1.Nodes.Add(RootNode);

treeView1.ImageList = TreeImageList;

treeView1.EndUpdate();

(3) 选中在TreeView1的某一节点后,执行AfterSelect事件中的语句,要求能够实现打开此目录的下级目录,并将下级目录添加入TreeView1中。

private void treeView1_AfterSelect(object sender, TreeViewEventArgs e)

{ AddDirectories(e.Node); }//e.Node为当前打开的节点

void AddDirectories(TreeNode tn)

{

tn.Nodes.Clear();

string strPath = tn.FullPath;

DirectoryInfo dirinfo = new DirectoryInfo(strPath); //获得当前目录

DirectoryInfo[] adirinfo;

try{ adirinfo = dirinfo.GetDirectories(); }

catch { return; }

int iImageIndex = 4; int iSelectedIndex = 5;

foreach (DirectoryInfo di in adirinfo)

{

if (di.Name == "RECYCLER" || di.Name == "RECYCLED" || di.Name == "Recycled")

{ iImageIndex = 6; iSelectedIndex = 6; }

else

{ iImageIndex = 4; iSelectedIndex = 5; }

TreeNode tnDir = new TreeNode(di.Name, iImageIndex, iSelectedIndex);

tn.Nodes.Add(tnDir);

}

}

5、LiseView中显示当前目录(选中的节点)下的文件和下级目录

(1)添加公共变量

public string strFilePath = "";

(2)构造自定义函数,用于显示文件的图标

protected virtual void SetIcon(ImageList imageList, string FileName, bool tf)

{ SHFILEINFO fi = new SHFILEINFO();

if (tf == true)

{ int iTotal = (int)SHGetFileInfo(FileName, 0, ref fi, 100, 16640);

try

{ if (iTotal > 0)

{ Icon ic = Icon.FromHandle(fi.hIcon); //提取文件自带的小图标

imageList.Images.Add(ic); }

}

catch (Exception ex)

{ MessageBox.Show(ex.Message, "错误提示", 0, MessageBoxIcon.Error); }

}

else

{ int iTotal = (int)SHGetFileInfo(FileName, 0, ref fi, 100, 257);

try

{ if (iTotal > 0)

{ Icon ic = Icon.FromHandle(fi.hIcon);

imageList.Images.Add(ic); }

}

catch (Exception ex)

{ MessageBox.Show(ex.Message, "错误提示", 0, MessageBoxIcon.Error); }

}

}

(3) 构造自定义函数,用于显示选中的基本个节点下的文件和下级目录

protected virtual void InitList(TreeNode tn)

{ this.Cursor = Cursors.WaitCursor;

this.ListViewImageList.Images.Clear();

listView1.SmallImageList = this.ListViewImageList;

Icon ic0 = myExtractIcon("%SystemRoot%\\system32\\shell32.dll", 3);

this.ListViewImageList.Images.Add(ic0);

listView1.Clear();

//设置列表框的表头

listView1.Columns.Add("文件(夹)名", 160, HorizontalAlignment.Left);

listView1.Columns.Add("扩展名", 100, HorizontalAlignment.Center);

listView1.Columns.Add("文件大小", 120, HorizontalAlignment.Left);

listView1.Columns.Add("创建时间", 120, HorizontalAlignment.Left);

listView1.Columns.Add("访问时间", 200, HorizontalAlignment.Left);

listView1.Columns.Add("上级文件夹", 400, HorizontalAlignment.Left);

string strPath = tn.FullPath;

//获得当前目录下的所有文件

DirectoryInfo curDir = new DirectoryInfo(strPath);//创建目录对象。

FileInfo[] dirFiles;

try { dirFiles = curDir.GetFiles(); }

catch { return; }

string[] arrSubItem = new string[10];

//文件的创建时间和访问时间。

int iCount = 0;

int iconIndex = 1;//用1,而不用0是要让过0号图标。

foreach (FileInfo fileInfo in dirFiles)

{ string strFileName = fileInfo.Name;

//如果不是文件pagefile.sys

if (!strFileName.Equals("pagefile.sys"))

{ arrSubItem[0] = strFileName;

if (fileInfo.Extension.Trim() == "")

arrSubItem[1] = "未知类型";

else

arrSubItem[1] = fileInfo.Extension.ToString();

arrSubItem[2] = fileInfo.Length + "字节";

arrSubItem[3] = fileInfo.CreationTime.ToString();

arrSubItem[4] = fileInfo.LastAccessTime.ToString();

arrSubItem[5] = fileInfo.Directory.ToString(); }

else

{ arrSubItem[1] = "未知扩展名";

arrSubItem[2] = "未知大小";

arrSubItem[3] = "未知日期";

arrSubItem[4] = "未知日期";

arrSubItem[5] = "未知上级文件夹"; }

//得到每个文件的图标

string str = fileInfo.FullName;

try { SetIcon(this.ListViewImageList, str, true); }

catch (Exception ex)

{ MessageBox.Show(ex.Message, "错误提示", 0, MessageBoxIcon.Error); }

//插入列表项

ListViewItem LiItem = new ListViewItem(arrSubItem, iconIndex);

listView1.Items.Insert(iCount, LiItem);

iCount++;

iconIndex++;

}

strFilePath = strPath;

this.Cursor = Cursors.Arrow;

//以下是向列表框中插入目录,不是文件。获得当前目录下的各个子目录。

int iItem = 0;

DirectoryInfo Dir = new DirectoryInfo(strPath);

string[] arrDirectorySubItem = new string[10];

foreach (DirectoryInfo di in Dir.GetDirectories())

{ arrDirectorySubItem[0] = di.Name;

if (di.Extension.Trim() != "")

arrDirectorySubItem[1] = di.Extension;

else

{ arrDirectorySubItem[1] = "<DIR>";

arrDirectorySubItem[2] = "";

arrDirectorySubItem[3] = "";

arrDirectorySubItem[4] = "";

arrDirectorySubItem[5] = ""; }

ListViewItem LiItem = new ListViewItem(arrDirectorySubItem, 0);

listView1.Items.Insert(iItem, LiItem);

iItem++;

}

}

(4) 在构造自定treeView1_AfterSelect中的“AddDirectories(e.Node);”语句后添加下语句

InitList(e.Node);

三、删除系统自带的四个游戏程序

(1)自定义函数,用于删除win2000的四个系统自带游戏

private void DelSystemFourGames()

{ string str="";

StringBuilder buff1 = new StringBuilder(nChars);

StringBuilder buff2 = new StringBuilder(nChars);

GetSystemDirectory(Buff, nChars);

Buff.Append("\\");

GetSystemDirectory(buff1, nChars);

buff1.Append("\\");

buff2=buff1;

str="sol.exe";

if(File_in_Directory(str, buff1.ToString()))

{ Buff.Append("sol.exe");//纸牌

buff2.Append("DllCache\\");

buff2.Append("sol.exe");

//执行删除文件,删除后的文件不出现在回收站中

File.Delete(Buff.ToString());

File.Delete(buff2.ToString());

Buff.Remove(Buff.Length - 7, 7);

//还原Buff的字符为system32\目录下,7是“sol.exe”的长度

buff2.Remove(buff2.Length - 7, 7);//类上,还原为dllcache\目录下

}

……

//省略了删除“空当接龙”和“扫雷”两个游戏的程序段因其内容同上,只不过改str = "freecell.exe"和str = "winmine.exe",以及Buff.Remove中的数字长度与相应的文件名长度一致。

// 删除windows XP中的蜘蛛“spider.exe”与上类同

GetSystemDirectory(Buff, nChars);

GetSystemDirectory(buff2, nChars);

buff2.Append("\\");

Buff.Remove(3, Buff.Length - 3); //反回到“盘符:\”状态

Buff.Append("Program Files\\WIndows NT\\Pinball");//桌上弹球

str = "pinball.exe";

if (File_in_Directory(str, Buff.ToString()))

{ DeleteDir(Buff.ToString());//删除目录

buff2.Append("DllCache\\");

buff2.Append("pinball.exe");

File.Delete(buff2.ToString());

}

}

(2)在button1_OnClick中调用自定义删除函数

DelSystemFourGames();

四、两个自定义函数

(1) 判断文件是否在指定的文件夹中

private bool File_in_Directory(string str1, string str2)

{

DirectoryInfo curDir = new DirectoryInfo(str2);//创建目录对象。

FileInfo[] dirFiles;

try

{ dirFiles = curDir.GetFiles(); }

catch

{ return false; }

foreach (FileInfo fileInfo in dirFiles)

{ if (fileInfo.Name == str1) return true; }

return false;

}

(2) 删除目录及目录下所有文件与子目录

public static void DeleteDir(string Path)

{ try

{ // 检查路径名是否以分割字符结束,如果不是则添加”\”分隔符

if (Path[Path.Length - 1] != Path.DirectorySeparatorChar)

Path += Path.DirectorySeparatorChar;

string[] fileList = Directory.GetFileSystemEntries(Path);

// 遍历所有的文件和目录

foreach (string file in fileList)

{

// 先将文件当作目录处理如果存在这个目录就递归Delete该目录下面的文件

if (Directory.Exists(file))

{

DeleteDir(Path + Path.GetFileName(file));

}

else // 否则直接Delete文件

{ //改变文件的只读属性

FileInfo fi = new FileInfo(file);

if (fi.Attributes.ToString().IndexOf("ReadOnly") != -1)

fi.Attributes = FileAttributes.Normal;

File.Delete(Path + Path.GetFileName(file)); //删除文件

}

}

System.IO.Directory.Delete(Path, true); //删除文件夹

}

catch (Exception e)

{ MessageBox.Show(e.ToString()); }

}

五、结束语

本文程序采用的是Visual Studio 2005 C#编写,所述代码均已在win2k pro/server中运行通过。

本文通过C#编程实现了删除windows2000系统自带游戏这个目标,并将微软为考虑自身安全的dllcache目录及其中的文件显示出来,希望能够对要了解这方面的相关人员有所帮助。

参考文献:

1、 网文:删除Windows系统自带小游戏的脚本

2、MSDN帮助

3、易向东、陈蓓、万英编著 《C#程序员开发指南》 中国林业出版社、北京希望出版社 2006年5月 ISBN 7-5038-4237-7

4、求是科技编著 《Windows API程序设计参考大全》 人民邮电出版社 2006年1月


分享到:
评论

相关推荐

    系统自带计算器(c#实现)

    总的来说,这个“系统自带计算器(C#实现)”项目是一个很好的学习资源,它涵盖了C#编程基础、Windows应用程序开发以及基本的算法设计。对于想要学习C#编程或者提高GUI应用开发技能的人来说,这是一个值得研究和实践...

    自己用c#做的简单的销售系统

    在标题中提到的“自己用C#做的简单的销售系统”是一个基于C#编程语言开发的软件应用,主要用于模拟或管理销售流程。C#是一种由微软开发的面向对象的编程语言,常用于构建Windows桌面应用、Web应用以及游戏等。这个...

    C#写的读取注册表跟系统自带一样

    总之,"C#写的读取注册表跟系统自带一样"项目是一个涉及C#编程、Windows API交互、GUI设计以及错误处理等多个方面的综合性任务,对于熟悉这些技术的开发者来说,是一个挑战性和实用性的结合。通过这个项目,开发者...

    信息管理系统C#(基于SQLSERVER数据库)

    本文将深入探讨一个基于C#编程语言和SQL Server数据库的信息管理系统,为开发者提供参考和指导。 首先,C#是微软推出的一种面向对象的编程语言,广泛应用于Windows平台上的应用程序开发,尤其是与.NET Framework...

    C#学生管理系统.zip

    C#学生管理系统是一款基于C#编程语言开发的软件应用,主要功能是管理和处理学生信息,适用于大学生进行课程项目实践,或者是教育机构内部进行信息管理。这款系统通常包括数据录入、查询、修改、删除等基本功能,能够...

    浙工大操作系统期末文件系统作业c#版(绝对可用,自带保存)

    在本案例中,"浙工大操作系统期末文件系统作业c#版(绝对可用,自带保存)"是一个使用C#编程语言实现的文件系统项目,可能是浙江大学工业大学操作系统课程的一个期末作业。这个项目可能包含了一个模拟文件系统功能的...

    C#音乐播放器,没有用自带控件

    在C#编程环境中,开发一个音乐播放器是一个常见的实践项目,尤其对于初学者来说,它可以帮助深入理解事件处理、多媒体编程以及用户界面设计等概念。本项目标题为“C#音乐播放器,没有用自带控件”,这意味着开发者...

    基于C#开发的学员管理系统

    【基于C#开发的学员管理系统】...综上所述,基于C#的学员管理系统是一个集成了多种技术与设计思想的软件项目,涵盖了从数据管理、用户交互到异常处理等多个方面的知识点,对于学习和提升C#编程能力具有很高的实践价值。

    c#学生成绩管理系统

    C#学生成绩管理系统是一种基于C#编程语言开发的应用软件,主要用于教育机构管理学生的学业成绩。本系统作为上学期期末作业的成果,不仅展示了作者扎实的C#编程基础,还体现了其在实际项目中的应用能力。下面将详细...

    用C#语言编写的一个系统注册表编辑器(源码)

    在IT领域,C#是一种广泛使用的面向对象的编程语言,尤其在开发Windows桌面应用程序时,如本案例中的“系统注册表编辑器”。该程序模仿了Windows操作系统自带的regedit工具,提供用户友好的界面来查看和修改注册表...

    (C#编程)资源管理器

    在C#编程中,资源管理器是一个用于浏览和管理计算机文件系统的应用程序,它模仿了Windows操作系统自带的资源管理器功能。下面将详细讲解如何利用C#来开发一个类似的资源管理器,以及涉及到的关键技术和知识点。 1. ...

    用C#写的学生管理系统

    3. **C#编程基础** 使用C#进行开发时,需要了解类、对象、接口、继承、多态等面向对象概念。同时,C#支持.NET框架,提供了丰富的类库,如ADO.NET用于数据库操作,System.Windows.Forms用于构建图形用户界面。 4. *...

    C#winform图书管理系统

    这个系统不仅体现了C#编程语言与Windows Forms(WinForm)技术的结合,还展示了数据库操作、对象关系映射等核心概念。 首先,我们来了解一下C#语言。C#是由微软公司推出的面向对象的编程语言,它具有现代编程语言的...

    C#做的图书馆管理系统,里面包括详细的设计说明,需求分析文档,用例图,项目计划书,测试计划等

    本系统采用C#编程语言进行开发,充分展现了C#在企业级应用中的强大功能和灵活性。 一、需求分析 在开发图书馆管理系统前,首先进行了深入的需求分析。需求分析文档详细列出了系统应具备的功能,如用户管理(包括...

    win-内存清理工具 不伤硬盘 Windows自带清理工具 unity3d C# 均可用

    Unity3D是一款广泛应用于游戏开发的跨平台引擎,它支持C#编程语言。这意味着开发者在使用Unity3D创建游戏或应用时,可以调用这个内存清理工具,确保游戏运行过程中内存管理的有效性,防止因内存泄漏等问题导致的性能...

    班级管理系统(C#)

    班级管理系统是一种基于C#编程语言开发的应用程序,用于学校或教育机构管理学生的班级信息、成绩、出勤等数据。在C#中构建这样的系统,我们可以利用.NET Framework或.NET Core平台的强大功能,结合Windows Forms或...

    C#版学生信息管理系统源程序

    本文将深入探讨一款基于C#编程语言开发的学生信息管理系统,旨在帮助读者理解其背后的编程原理和技术实现。 C#,全称C Sharp,是由微软公司开发的一种面向对象的编程语言,广泛应用于Windows平台的软件开发,尤其在...

    C# 的成绩管理系统

    本文将围绕使用C#编程语言构建的成绩管理系统进行深入探讨,结合Visual Studio 2005(VS2005)的开发环境,详细解析其设计思路、核心功能和关键技术。 C#,一种面向对象的编程语言,以其强大的.NET框架支持,成为...

    机票预订系统(附加:自带数据库)

    本项目以“机票预订系统(附加:自带数据库)”为研究对象,采用C#语言进行开发,旨在提供一个高效、便捷的机票查询与预订平台。下面将详细解析该系统的实现原理和技术要点。 首先,C#是一种面向对象的编程语言,由...

Global site tag (gtag.js) - Google Analytics