获取计算机已安装软件列表

leimin86 2012-01-12 09:04:37
Dear all,
最近小弟在做一个应用程序,就是仿造360软件管家,获取计算机里已安装软件列表,
现思路如下,根据注册表路径:
针对x86系统,HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall
针对x64系统,HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall
分别获取已安装软件列表,然后按照以下步骤进行处理:
1.剔除service项,重复项,已安装补丁,如KB开头的子项(计划中,未能实现)
2.合并x86,x64.最终得到软件列表数据
遇到的问题,
1.该实现思路是否正确?
2.思路正确的前提下,如何解决识别为service,重复项,补丁等子项

恳请大侠指教?
TOM


...全文
1693 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
hudsonhuang 2013-04-18
  • 打赏
  • 举报
回复
引用 17 楼 hudsonhuang 的回复:
用上面的代码调试了很久。 发现用C#调用这个VB库的时候,出来的效果总是跟VB调用VB的时候不一致。 最后,发现原来是系统位数的问题。 是不是VB.NET用的是32位,而C#默认使用64位呢(针对64位系统)
原来是忘了比较重要的事情,build的时候要注意一定要设成any cpu 靠,写代码写傻了
hudsonhuang 2013-04-18
  • 打赏
  • 举报
回复
用上面的代码调试了很久。 发现用C#调用这个VB库的时候,出来的效果总是跟VB调用VB的时候不一致。 最后,发现原来是系统位数的问题。 是不是VB.NET用的是32位,而C#默认使用64位呢(针对64位系统)
mmayan 2012-09-26
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 的回复:]
引用 1 楼 xx_mm 的回复:
C# code
Microsoft.Win32.RegistryKey rk = Microsoft.Win32.Registry.LocalMachine.OpenSubKey( "SOFTWARE ");
String [] names = rk.GetSubKeyNames();
foreach (String s in names)
……

……
[/Quote]
你好,我现在遇到的问题和你提到的一样,我想剔除service项,重复项,已安装补丁等···也看了你后面提供的可下载的附件,没看太明白,本人刚开始学习,不知道可否大致给讲一下思路?
非常感谢!
leimin86 2012-01-13
  • 打赏
  • 举报
回复
To dear all,
http://www.vbforums.com/attachment.php?s=818d9e7c4ef0cebf8842e4ad917ff0d3&attachmentid=76861&d=1268756810

以上链接,可以解决本帖提出的3个问题,有需要的TX可以拿去研究,由于回帖的大侠没有解决帖中3个问题,所以不会给分,在此结贴!
感谢大家的帮助!
TOM
xujun5031 2012-01-13
  • 打赏
  • 举报
回复
mark一下,
leimin86 2012-01-13
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 maco_wang 的回复:]
c# 获取已安装程序列表
[/Quote]

该文章我搜索过,也试过,但出现了我发帖中出现的3个问题.还是非常谢谢你
leimin86 2012-01-13
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 gomoku 的回复:]
可以用Installer API,详细文档见http://msdn.microsoft.com/en-us/library/aa369426(v=VS.85).aspx。


C# code

static void Main()
{
StringBuilder result = new StringBuilder();
for (int index = 0; ; ……
[/Quote]

这个方法还是会出现很多其他信息,你可以试试把软件总数,打出来,和360软件管家找出来的做一个对比...
leimin86 2012-01-13
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 xx_mm 的回复:]
C# code
Microsoft.Win32.RegistryKey rk = Microsoft.Win32.Registry.LocalMachine.OpenSubKey( "SOFTWARE ");
String [] names = rk.GetSubKeyNames();
foreach (String s in names)
……
[/Quote]

思路这样,但还得解决那3个问题
1.子项重复,例如Microsoft SQL Server 10和Microsoft SQL Server 2008 R2都是指同一个软件,类似的还有没?
2.SQL Server 2008 R2 Reporting Services这个应该是一个服务,但仍被识别为已安装软件。360软件管家,不会识别其为软件,是否有键值,能区分服务,和程序
3.补丁程序
LOVE_GG 2012-01-13
  • 打赏
  • 举报
回复
注册表轮询software键值
cjh200102 2012-01-13
  • 打赏
  • 举报
回复
不错。
Ny-6000 2012-01-13
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 yysyangyangyangshan 的回复:]
应该是对的,安装软件从注册表能获取信息。

至于没注册的软件,不属于安装软件。
[/Quote]

顶下
叶子 2012-01-13
  • 打赏
  • 举报
回复
EnForGrass 2012-01-13
  • 打赏
  • 举报
回复
你是只须获得注册过的软件吗?试试1、5楼的吧
gomoku 2012-01-13
  • 打赏
  • 举报
回复
可以用Installer API,详细文档见http://msdn.microsoft.com/en-us/library/aa369426(v=VS.85).aspx。


static void Main()
{
StringBuilder result = new StringBuilder();
for (int index = 0; ; index++)
{
StringBuilder productCode = new StringBuilder(39);
if (MsiEnumProducts(index, productCode) != 0)
{
break;
}

foreach (string property in new string[] { "ProductName", "Publisher", "VersionString", })
{
int charCount = 512;
StringBuilder value = new StringBuilder(charCount);

if (MsiGetProductInfo(productCode.ToString(), property, value, ref charCount) == 0)
{
value.Length = charCount;
result.AppendLine(value.ToString());
}
}
result.AppendLine();
}
Console.WriteLine(result.ToString());
}

[DllImport("msi.dll", SetLastError = true)]
static extern int MsiEnumProducts(int iProductIndex, StringBuilder lpProductBuf);

[DllImport("msi.dll", SetLastError = true)]
static extern int MsiGetProductInfo(string szProduct, string szProperty, StringBuilder lpValueBuf, ref int pcchValueBuf);
杨友山 2012-01-13
  • 打赏
  • 举报
回复
应该是对的,安装软件从注册表能获取信息。

至于没注册的软件,不属于安装软件。
threenewbee 2012-01-12
  • 打赏
  • 举报
回复
思路正确。前提是什么叫“安装的软件”。

对于那些创建了卸载程序的软件,叫安装软件,另外一些绿色软件是不是安装的软件?
蔡袅 2012-01-12
  • 打赏
  • 举报
回复
Microsoft.Win32.RegistryKey   rk   =   Microsoft.Win32.Registry.LocalMachine.OpenSubKey( "SOFTWARE ");
String [] names = rk.GetSubKeyNames();
foreach (String s in names)
{
//输出吧....
}

110,545

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧