Dear ALL
本人现在要做一个和360 软件管家差不多的工具,用C#:
需要实现的功能:
1: 软件搬家
2:软件卸载
思路:
1:通过注册表,查找软件信息
32位系统“HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Uninstall”
64位系统“HKEY_LOCAL_MACHINE\Software\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall”
-1:获取软件名称“DisplayName”,
-2:获取软件图标:Icon.ExtractAssociatedIcon(REG(”DisplayICon”)).ToBitmap();(”并不是全部的图标都正确得到,可以得到dll,exe的图标,注册表的Icon字符串需要处理“)
-3:获取软件厂商(”Publisher”),软件版本(”DisplayVersion”),卸载字符串(”UninstallString”)等信息。
2:通过卸载字符串,调用cmd命令执行卸载字符串进行软件卸载,通过”junction.exe”,先将软件目录移动到一个指定位置,然后进行文件地址映射,实现软件移动的功能。
现在遇到的问题,
1.怎么得到软件的安装位置,得到的软件列表要和控制面板卸载列表一样的?要是软件例如Office,里面有多个组件怎么处理?
2.有什么方法可以得到软件图标?
3.360的软件搬家的列表界面用什么控件实现?(没找到合适的,准备用wpf。)
4.软件搬家有没有其他的实现方式。
解决了,加分
本人现在要做一个和360 软件管家差不多的工具,用C#:
需要实现的功能:
1: 软件搬家
2:软件卸载
思路:
1:通过注册表,查找软件信息
32位系统“HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Uninstall”
64位系统“HKEY_LOCAL_MACHINE\Software\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall”
-1:获取软件名称“DisplayName”,
-2:获取软件图标:Icon.ExtractAssociatedIcon(REG(”DisplayICon”)).ToBitmap();(”并不是全部的图标都正确得到,可以得到dll,exe的图标,注册表的Icon字符串需要处理“)
-3:获取软件厂商(”Publisher”),软件版本(”DisplayVersion”),卸载字符串(”UninstallString”)等信息。
2:通过卸载字符串,调用cmd命令执行卸载字符串进行软件卸载,通过”junction.exe”,先将软件目录移动到一个指定位置,然后进行文件地址映射,实现软件移动的功能。
现在遇到的问题,
1.怎么得到软件的安装位置,得到的软件列表要和控制面板卸载列表一样的?要是软件例如Office,里面有多个组件怎么处理?
2.有什么方法可以得到软件图标?
3.360的软件搬家的列表界面用什么控件实现?(没找到合适的,准备用wpf。)
4.软件搬家有没有其他的实现方式。
解决了,加分
解决方案
10
5
1
c#不适合开发病毒..
1
c#不适合开发病毒..
2
建议使用VC6.0 MFC WINAPI
1
告诉你们老大,给本人分配跟360团队同样的人手,本人就给你做
2
先去找找看看有没有开源的方案,学习一下思路。这是大CASE
1
这个听上去很高大上,帮你U盘一下。
5
5
告诉你,除了软件开发商,没有人能做出通用的”软件搬家””软件卸载”。这种违背技术常识的事情,也只有做病毒的360能实现。
2
10
告诉你,除了软件开发商,没有人能做出通用的”软件搬家””软件卸载”。这种违背技术常识的事情,也只有做病毒的360能实现。
版主啊。说的本人都没信心了,本人是不是要滚蛋了?
这个软件搬家金山,腾讯,都有做啊,本人不需要做得和360 一样的强大,软件搬家实现这个功能就好!
要你滚蛋什么意思?你做不出来,公司就开除你吗?假如是这样,你放心,相继开除的人会一连串的,都说了,这不是一个人的“战斗”,而且 C# 在本人看来不是一个不会对系统形成威胁行为的语言,他是正义的
2
来看看,这个看起来很难的样子
2
更正:……不是一个会对系统形成威胁行为的语言……
5
实现软件搬家,说起来简单
软件整个挪过去,修改全部相关注册表信息和快捷方式路径,搬家完成.
软件整个挪过去,修改全部相关注册表信息和快捷方式路径,搬家完成.
10
2
仅仅表达一下本人的看法。
这个软件,假如当做练手的话,做一做还行,但是要当做个产品来做的话,那就是看起来不容易啊,做起来也不容易,后期维护还是不容易呢。
从注册表里面取出软件的安装信息,反安装信息啥的,这都可以做到,不过能拿到这些信息的只是电脑中所安装的软件中的一部分。假如还要对付那些病毒文件,流氓文件啥的,那咱就哭吧。还有些软件是不在注册表留信息的,这怎么办?就得建立一个数据库,里面保存好特征文件名,反安装方法啥的,然后全盘扫描磁盘,一个一个跟数据库去比对,才能得到删除或移动软件所需要的信息。这就是不容易的地方了,数据库啊数据库,里面的数据谁维护?假如你们老板肯掏钱让360来维护的话,那就不如让360为你们公司再定制一个新软件了。
这个软件,假如当做练手的话,做一做还行,但是要当做个产品来做的话,那就是看起来不容易啊,做起来也不容易,后期维护还是不容易呢。
从注册表里面取出软件的安装信息,反安装信息啥的,这都可以做到,不过能拿到这些信息的只是电脑中所安装的软件中的一部分。假如还要对付那些病毒文件,流氓文件啥的,那咱就哭吧。还有些软件是不在注册表留信息的,这怎么办?就得建立一个数据库,里面保存好特征文件名,反安装方法啥的,然后全盘扫描磁盘,一个一个跟数据库去比对,才能得到删除或移动软件所需要的信息。这就是不容易的地方了,数据库啊数据库,里面的数据谁维护?假如你们老板肯掏钱让360来维护的话,那就不如让360为你们公司再定制一个新软件了。
2
假如仅仅是做着玩的话,那么访问注册表就是用
.Net类库里面的 Microsoft.Win32名称空间里面的Registry和RegistryKey吧,他们基本上可以完成读注册表和写注册表的操作。
.Net类库里面的 Microsoft.Win32名称空间里面的Registry和RegistryKey吧,他们基本上可以完成读注册表和写注册表的操作。
1
简单点把软件安装文件从一个目录copy到另一个目录,创建一个新的快捷方式指向新的目录。告诉老板做完了
1
简单点把软件安装文件从一个目录copy到另一个目录,创建一个新的快捷方式指向新的目录。告诉老板做完了
除非是绿色版的软件,否则不改注册表运行不起来了
2
例如数据库,要打成服务运行的,你把安装文件挪走了,服务还能启动?
1
2
估计是注册表吧。
mfc能做的winform都能做 winapi能做的p/invoke都能做
mfc能做的winform都能做 winapi能做的p/invoke都能做
1
还是很好奇怎么的“公司内特定系统上”需要这个功能。写个脚本卸了再重装软件不好吗?
1
Junction.
15
其实软件的安装、卸载程序一般都比较简单,一般都是写注册表。原理大致是这样:
使用注册表监视、或快照工具,在安装前扫描一遍,然后安装,再扫描比对,一些安装制作工具可以自动生成新的安装包。用这个方法可以实现静默的安装卸载,做不了的就调用软件自身带的卸载程序( 其实360里卸载很多软件还是跳出原来的安装程序,可见这部份是没有处理或待处理的 ),另外一些安装卸载程序支持带参数的静默处理,例如MSI。
不过在win7上安装程序会跳出UAC警告,假如要批量安装不停的弹这个不是个事吧,所以一般可以注册个后台服务干这事,调用后台服务安装卸载,但是现在注册后台服务一般会被360自动优化成禁用,另外一个方法是本人启动就申请管理权限,这个需要弄个数字证书不然吓到小白了。
软件的卸载程序会写在 HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall 下面,其中每个子键里有一个值 记录在 UninstallString 下面,这里面包含了卸载程序和调用参数。
一个例子,列出全部卸载程序(AAuto源码):
使用注册表监视、或快照工具,在安装前扫描一遍,然后安装,再扫描比对,一些安装制作工具可以自动生成新的安装包。用这个方法可以实现静默的安装卸载,做不了的就调用软件自身带的卸载程序( 其实360里卸载很多软件还是跳出原来的安装程序,可见这部份是没有处理或待处理的 ),另外一些安装卸载程序支持带参数的静默处理,例如MSI。
不过在win7上安装程序会跳出UAC警告,假如要批量安装不停的弹这个不是个事吧,所以一般可以注册个后台服务干这事,调用后台服务安装卸载,但是现在注册后台服务一般会被360自动优化成禁用,另外一个方法是本人启动就申请管理权限,这个需要弄个数字证书不然吓到小白了。
软件的卸载程序会写在 HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall 下面,其中每个子键里有一个值 记录在 UninstallString 下面,这里面包含了卸载程序和调用参数。
一个例子,列出全部卸载程序(AAuto源码):
import console; import win.reg; var reg = ..win.regReader("HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall"); for(soft in reg.eachKey() ){ var regUnist = reg.openReg(soft); console.log(regUnist.queryValue("DisplayName"),regUnist.queryValue("UninstallString") ); regUnist.close(); }
另外可以在MUICache,快捷方式里找到没有写到注册表的软件,快捷方式一般 出现在以下位置:桌面目录,共享桌面目录,程序组目录,共享程序组目录,在win7下假如锁定到任务栏或开始菜单快捷方式还会出现在 C:\Users\用户名\AppData\Roaming\Microsoft\Internet Explorer\Quick Launch\User Pinned 下面, 举个例子(AAuto源码):
import fsys.lnk; import process.cache; import fsys.version; import console; //查找sublime路径 var sublime = process.cache.find( ,"Sublime Text") || fsys.lnk.search("sublime" ) ; if( sublime ){ var versionInfo = fsys.version.getInfo(sublime); console.log("软件路径",sublime) console.log("软件名称",versionInfo.productName); console.log("软件版本",versionInfo.productVersion) console.log("软件说明",versionInfo.fileDescription) console.log("软件安装目录",fsys.getParentDir(sublime)) //关闭该软件全部打开的进程,并准备删除 import process.file; fsys.enum( fsys.getParentDir(sublime), "*.exe", function(dir,filename,fullpath,findData){ if(filename){ process.file.terminate(fullpath);//关闭进程,避免文件占用 } } ); }
安装卸载还需要做的一件事就是创建、删除一堆的快捷方式,这个调用 IShellLink 也很简单,用 AAuto代码举一个例子:
import fsys.shortcut; var shorcut = fsys.shortcut(""); //创建全部快捷方式 shorcut.create( lnk = io._exepath; taskBar = true; //锁定到任务栏 startMenu = false; //锁定到开始菜单 desktop = true; //添加到桌面 programsFolder = "\公司名"; //添加到开始菜单程序组 allUsers = false; ) //卸载全部快捷方式 shorcut.delete( lnk = io._exepath; taskBar = true; //锁定到任务栏 startMenu = false; //锁定到开始菜单 desktop = true; //添加到桌面 programsFolder = "\公司名"; //添加到开始菜单程序组 allUsers = false; )
都非常简单。
2
C# / C++ 用 WINAPI(__stdcall) 来做把
2
六七年前用VB写的程序写过。
程序的主要功能,启动项优划,服务项清理,垃圾清理,插件清理,窗口管理(一键隐藏窗口(那时候用这个功能挂机,上班挂机网游,挂了半年多。))。那时候还没有360,。(软件最终连版权一起卖了)
那时跟踪注册表是用的卡巴斯基。
以前为了实现打开注册表直接显示本人设置的那一项。这个简单的功能,本人用卡巴斯基跟踪了一个星期。
上次看360打开注册,直接显示某一项的功能,还是用的模拟鼠标点击,展开的方法。
题主的这些主要的就是一些注册的操作。
例如:软件的安装位置 这个在注册表里有一个固定的地方。具体哪个地方网上搜一搜多的事。
程序的主要功能,启动项优划,服务项清理,垃圾清理,插件清理,窗口管理(一键隐藏窗口(那时候用这个功能挂机,上班挂机网游,挂了半年多。))。那时候还没有360,。(软件最终连版权一起卖了)
那时跟踪注册表是用的卡巴斯基。
以前为了实现打开注册表直接显示本人设置的那一项。这个简单的功能,本人用卡巴斯基跟踪了一个星期。
上次看360打开注册,直接显示某一项的功能,还是用的模拟鼠标点击,展开的方法。
题主的这些主要的就是一些注册的操作。
例如:软件的安装位置 这个在注册表里有一个固定的地方。具体哪个地方网上搜一搜多的事。
2
从注册表里面取出软件的安装信息,这个不一定能提取全啊,有的软件安装不通过注册表的
1
1
这个还是用C++吧