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(使用前将#替换为@)