Go获取windows已经安装的软件详情

2023-05-16

Go获取windows已经安装的软件详情,包含图标,全名,版本号,发布者等。使用golang.org/x/sys/windows/registry包。

软件信息都存放在注册表中,注册表中HKEY_LOCAL_MACHINE下面,如果是64位Software\WOW6432Node\Microsoft\Windows\CurrentVersion\Uninstall,

如果是32位则Software\Microsoft\Windows\CurrentVersion\Uninstall路径下面,这两个路径下面有本地windows安装的所有应用程序的信息。

strconv.IntSize这个方法可以判断计算机是64位还是32位。

下面是搜狗输入法的详细信息

代码如下

package test

import (
	"golang.org/x/sys/windows/registry"
	"strconv"
	"sync"
)

type SoftwareDetails struct {
	DisplayIcon     string
	DisplayName     string
	DisplayVersion  string
	InstallLocation string
	Publisher       string
	UninstallString string
}
func QueryWindowsExe() []SoftwareDetails {
	softwareDetailsSli := []SoftwareDetails{}
	queryKey := func(w *sync.WaitGroup, startKey registry.Key, res *[]SoftwareDetails) {
		defer w.Done()
		var queryPath string
		var query64Path string
		if strconv.IntSize == 64 {
			query64Path = "Software\\WOW6432Node\\Microsoft\\Windows\\CurrentVersion\\Uninstall"
			queryPath = "Software\\Microsoft\\Windows\\CurrentVersion\\Uninstall"
			kQuery64, err := registry.OpenKey(startKey, query64Path, registry.READ)
			if err != nil {
				return
			}
			keyNames, err := kQuery64.ReadSubKeyNames(0)
			if err != nil {
				return
			}
			//查询出query64Path下面的程序详情,并且添加到SoftwareDetails
			softwareDetailsSli = getSoftwareDetails(startKey, keyNames, query64Path)
			*res = append(*res, softwareDetailsSli...)
		} else {
			queryPath = "Software\\Microsoft\\Windows\\CurrentVersion\\Uninstall"
		}
		k, err1 := registry.OpenKey(startKey, queryPath, registry.READ)
		if err1 != nil {
			return
		}
		// 读取所有子项
		keyNames, err1 := k.ReadSubKeyNames(0)
		if err1 != nil {
			return
		}
		*res = append(*res, getSoftwareDetails(startKey, keyNames, queryPath)...)
	}
	res := []SoftwareDetails{}
	waitGroup := new(sync.WaitGroup)
	waitGroup.Add(1)
	go queryKey(waitGroup, registry.LOCAL_MACHINE, &res)
	waitGroup.Wait()
	return res
}
func getSoftwareDetails(startKey registry.Key, appName []string, path string) []SoftwareDetails {
	softwareDetails := []SoftwareDetails{}
	for _, value := range appName {
		kQuery64Details, err := registry.OpenKey(startKey, path+"\\"+value, registry.READ)
		if err != nil {
			continue
		}
		displayIcon, _, err := kQuery64Details.GetStringValue("DisplayIcon")
		displayName, v, err := kQuery64Details.GetStringValue("DisplayName")
		displayVersion, _, err := kQuery64Details.GetStringValue("DisplayVersion")
		installLocation, _, err := kQuery64Details.GetStringValue("InstallLocation")
		publisher, _, err := kQuery64Details.GetStringValue("Publisher")
		uninstallString, _, err := kQuery64Details.GetStringValue("UninstallString")
		if v == 0 {
			continue
		}
		softDetails := SoftwareDetails{displayIcon, displayName, displayVersion, installLocation, publisher, uninstallString}
		softwareDetails = append(softwareDetails, softDetails)
	}
	return softwareDetails
}

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Go获取windows已经安装的软件详情 的相关文章

随机推荐