关于c#从注册表获取软件安装路径的问题

时间:2022-03-20 06:14:37
在网上看了很多方法,但是碰到的问题是这样的:
1、该软件在注册表中的HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall下
没有InstallLocation项。
2、该软件在注册表中的HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall下
的UninstallString项也没有包含该软件的安装目录。
请问这种情况如何获得软件的安装位置?

6 个解决方案

#1


很多软件安装位置不一样,但是他们基本上会在注册表的同一个位置写下自己的名字和程序路径,这个位置就是:

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths

所以只要去这个地方找软件路径就可以了。

你可以添加你知道的正确的文件名,就是它在注册表中的名字。比如office word在注册表中叫winword

最终拿到的是那个exe的完全路径,如果要文件夹的话就用Path.GetDirectoryName()就行了

public enum Softwares 

//The names are the same with the registry names. 
//You can add any software exists in the "regedit" path: 
//HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths 

EXCEL, //Office Excel 
WINWORD, //Office Word 
MSACCESS, //Office Access 
POWERPNT, //Office PowerPoint 
OUTLOOK, //Office Outlook 
INFOPATH, //Office InfoPath 
MSPUB, //Office Publisher 
VISIO, //Office Visio 
IEXPLORE, //IE 
ITUNES //Apple ITunes 
//......... 


public class SoftwareOperator 

//When you do not want to use string name, then use the Enum instead 
public static bool TryGetSoftwarePath(Softwares softName, out string path) 

return TryGetSoftwarePath(softName.ToString(), out path); 


public static bool TryGetSoftwarePath(string softName, out string path) 

string strPathResult = string.Empty; 
string strKeyName = ""; //"(Default)" key, which contains the intalled path 
object objResult = null; 

Microsoft.Win32.RegistryValueKind regValueKind; 
Microsoft.Win32.RegistryKey regKey = null; 
Microsoft.Win32.RegistryKey regSubKey = null; 

try 

//Read the key 
regKey = Microsoft.Win32.Registry.LocalMachine; 
regSubKey = regKey.OpenSubKey(@"SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\" + softName.ToString() + ".exe", false); 

//Read the path 
objResult = regSubKey.GetValue(strKeyName); 
regValueKind = regSubKey.GetValueKind(strKeyName); 

//Set the path 
if (regValueKind == Microsoft.Win32.RegistryValueKind.String) 

strPathResult = objResult.ToString(); 


catch (System.Security.SecurityException ex) 

throw new System.Security.SecurityException("You have no right to read the registry!", ex); 

catch (Exception ex) 

throw new Exception("Reading registry error!", ex); 

finally 


if (regKey != null) 

regKey.Close(); 
regKey = null; 


if (regSubKey != null) 

regSubKey.Close(); 
regSubKey = null; 



if (strPathResult != string.Empty) 

//Found 
path = strPathResult; 
return true; 

else 

//Not found 
path = null; 
return false; 



#2


最差的办法是 如果你知道 那么收索 注册表 

#3


现在的问题是我要找的程序是别人做的,在HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths里没有该程序的信息,顺便问下,是不是所有的程序都会在注册表有安装路径这些信息。如果没有该如何获取?

#4


该回复于2011-12-29 15:02:03被版主删除

#5


没有人愿意帮忙吗?

#6


该回复于2011-12-30 09:27:52被版主删除

#1


很多软件安装位置不一样,但是他们基本上会在注册表的同一个位置写下自己的名字和程序路径,这个位置就是:

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths

所以只要去这个地方找软件路径就可以了。

你可以添加你知道的正确的文件名,就是它在注册表中的名字。比如office word在注册表中叫winword

最终拿到的是那个exe的完全路径,如果要文件夹的话就用Path.GetDirectoryName()就行了

public enum Softwares 

//The names are the same with the registry names. 
//You can add any software exists in the "regedit" path: 
//HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths 

EXCEL, //Office Excel 
WINWORD, //Office Word 
MSACCESS, //Office Access 
POWERPNT, //Office PowerPoint 
OUTLOOK, //Office Outlook 
INFOPATH, //Office InfoPath 
MSPUB, //Office Publisher 
VISIO, //Office Visio 
IEXPLORE, //IE 
ITUNES //Apple ITunes 
//......... 


public class SoftwareOperator 

//When you do not want to use string name, then use the Enum instead 
public static bool TryGetSoftwarePath(Softwares softName, out string path) 

return TryGetSoftwarePath(softName.ToString(), out path); 


public static bool TryGetSoftwarePath(string softName, out string path) 

string strPathResult = string.Empty; 
string strKeyName = ""; //"(Default)" key, which contains the intalled path 
object objResult = null; 

Microsoft.Win32.RegistryValueKind regValueKind; 
Microsoft.Win32.RegistryKey regKey = null; 
Microsoft.Win32.RegistryKey regSubKey = null; 

try 

//Read the key 
regKey = Microsoft.Win32.Registry.LocalMachine; 
regSubKey = regKey.OpenSubKey(@"SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\" + softName.ToString() + ".exe", false); 

//Read the path 
objResult = regSubKey.GetValue(strKeyName); 
regValueKind = regSubKey.GetValueKind(strKeyName); 

//Set the path 
if (regValueKind == Microsoft.Win32.RegistryValueKind.String) 

strPathResult = objResult.ToString(); 


catch (System.Security.SecurityException ex) 

throw new System.Security.SecurityException("You have no right to read the registry!", ex); 

catch (Exception ex) 

throw new Exception("Reading registry error!", ex); 

finally 


if (regKey != null) 

regKey.Close(); 
regKey = null; 


if (regSubKey != null) 

regSubKey.Close(); 
regSubKey = null; 



if (strPathResult != string.Empty) 

//Found 
path = strPathResult; 
return true; 

else 

//Not found 
path = null; 
return false; 



#2


最差的办法是 如果你知道 那么收索 注册表 

#3


现在的问题是我要找的程序是别人做的,在HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths里没有该程序的信息,顺便问下,是不是所有的程序都会在注册表有安装路径这些信息。如果没有该如何获取?

#4


该回复于2011-12-29 15:02:03被版主删除

#5


没有人愿意帮忙吗?

#6


该回复于2011-12-30 09:27:52被版主删除