C#做一个和360 软件管家差不多的软件

.Net技术 码拜 8年前 (2016-09-12) 1966次浏览
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.软件搬家有没有其他的实现方式。
解决了,加分
解决方案

10

C#做一个和360 软件管家差不多的软件

5

C#做一个和360 软件管家差不多的软件

1

c#不适合开发病毒..

1

c#不适合开发病毒..C#做一个和360 软件管家差不多的软件

2

建议使用VC6.0 MFC WINAPI

1

引用:
Quote: 引用:

c#不适合开发病毒..C#做一个和360 软件管家差不多的软件

引用:

c#不适合开发病毒..

不是本人想。公司的叫本人做这么个玩意儿

告诉你们老大,给本人分配跟360团队同样的人手,本人就给你做

2

先去找找看看有没有开源的方案,学习一下思路。这是大CASE

1

这个听上去很高大上,帮你U盘一下。

5

5

告诉你,除了软件开发商,没有人能做出通用的”软件搬家””软件卸载”。这种违背技术常识的事情,也只有做病毒的360能实现。

2

C#做一个和360 软件管家差不多的软件

10

引用:
Quote: 引用:

告诉你,除了软件开发商,没有人能做出通用的”软件搬家””软件卸载”。这种违背技术常识的事情,也只有做病毒的360能实现。

版主啊。说的本人都没信心了,本人是不是要滚蛋了?
这个软件搬家金山,腾讯,都有做啊,本人不需要做得和360 一样的强大,软件搬家实现这个功能就好!

要你滚蛋什么意思?你做不出来,公司就开除你吗?假如是这样,你放心,相继开除的人会一连串的,都说了,这不是一个人的“战斗”,而且 C# 在本人看来不是一个不会对系统形成威胁行为的语言,他是正义的C#做一个和360 软件管家差不多的软件,请题主不要用一门正义的语言去做一件邪恶的事情。假如是领导强制要你做,那他的设想有点问题。你看到的事实是 360 是可以做,但 360 不是 .NET 开发的。有些东西,用特定的工具去做,会不太可能。

2

来看看,这个看起来很难的样子

2

更正:……不是一个会对系统形成威胁行为的语言……

5

实现软件搬家,说起来简单
软件整个挪过去,修改全部相关注册表信息和快捷方式路径,搬家完成.

10

问题是,360本身是做杀毒的,金山也是做杀毒的,腾讯也有杀毒
它们本人修改注册表当然没问题
你的程序想修改,会被当做病毒干掉的

2

仅仅表达一下本人的看法。
这个软件,假如当做练手的话,做一做还行,但是要当做个产品来做的话,那就是看起来不容易啊,做起来也不容易,后期维护还是不容易呢。
注册表里面取出软件的安装信息,反安装信息啥的,这都可以做到,不过能拿到这些信息的只是电脑中所安装的软件中的一部分。假如还要对付那些病毒文件,流氓文件啥的,那咱就哭吧。还有些软件是不在注册表留信息的,这怎么办?就得建立一个数据库,里面保存好特征文件名,反安装方法啥的,然后全盘扫描磁盘,一个一个跟数据库去比对,才能得到删除或移动软件所需要的信息。这就是不容易的地方了,数据库啊数据库,里面的数据谁维护?假如你们老板肯掏钱让360来维护的话,那就不如让360为你们公司再定制一个新软件了。

2

假如仅仅是做着玩的话,那么访问注册表就是用
.Net类库里面的  Microsoft.Win32名称空间里面的Registry和RegistryKey吧,他们基本上可以完成读注册表和写注册表的操作。

1

简单点把软件安装文件从一个目录copy到另一个目录,创建一个新的快捷方式指向新的目录。告诉老板做完了C#做一个和360 软件管家差不多的软件

1

引用:

简单点把软件安装文件从一个目录copy到另一个目录,创建一个新的快捷方式指向新的目录。告诉老板做完了C#做一个和360 软件管家差不多的软件

除非是绿色版的软件,否则不改注册表运行不起来了

2

例如数据库,要打成服务运行的,你把安装文件挪走了,服务还能启动?

1

C#做一个和360 软件管家差不多的软件

2

估计是注册表吧。
mfc能做的winform都能做   winapi能做的p/invoke都能做

1

还是很好奇怎么的“公司内特定系统上”需要这个功能。写个脚本卸了再重装软件不好吗?

1

Junction.

15

其实软件的安装、卸载程序一般都比较简单,一般都是写注册表。原理大致是这样:
使用注册表监视、或快照工具,在安装前扫描一遍,然后安装,再扫描比对,一些安装制作工具可以自动生成新的安装包。用这个方法可以实现静默的安装卸载,做不了的就调用软件自身带的卸载程序( 其实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#做一个和360 软件管家差不多的软件
C# / C++ 用 WINAPI(__stdcall) 来做把

2

六七年前用VB写的程序写过。
程序的主要功能,启动项优划,服务项清理,垃圾清理,插件清理,窗口管理(一键隐藏窗口(那时候用这个功能挂机,上班挂机网游,挂了半年多。))。那时候还没有360,。(软件最终连版权一起卖了)
那时跟踪注册表是用的卡巴斯基。
以前为了实现打开注册表直接显示本人设置的那一项。这个简单的功能,本人用卡巴斯基跟踪了一个星期。
上次看360打开注册,直接显示某一项的功能,还是用的模拟鼠标点击,展开的方法。
题主的这些主要的就是一些注册的操作。
例如:软件的安装位置 这个在注册表里有一个固定的地方。具体哪个地方网上搜一搜多的事。

2

从注册表里面取出软件的安装信息,这个不一定能提取全啊,有的软件安装不通过注册表的

1

C#做一个和360 软件管家差不多的软件真要本人做还是可以的  就是界面麻烦点

1

这个还是用C++吧C#做一个和360 软件管家差不多的软件

CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明C#做一个和360 软件管家差不多的软件
喜欢 (0)
[1034331897@qq.com]
分享 (0)