2008-11-17 2 views

ответ

11

Помощь here ...

Microsoft имеет большой (но не хорошо известный) инструмент для этого - LogParser

Он использует механизм SQL для запроса всех типов текстовых данных, таких как Registry, Файловая система, журнал событий, AD и т. Д. Для использования с C# вам необходимо построить сборку Interop из Logarser . dll COM-сервер, используя следующий (настроить путь LogParser.dll) .

tlbimp "C:\Program Files\Log Parser 2.2\LogParser.dll" 
/out:Interop.MSUtil.dll 

Ниже приведен небольшой пример, который иллюстрирует, как для запроса Значение 'VisualStudio' в \ HKLM \ SOFTWARE \ Microsoft дерева.

using System; 
using System.Runtime.InteropServices; 
using LogQuery = Interop.MSUtil.LogQueryClass; 
using RegistryInputFormat = Interop.MSUtil.COMRegistryInputContextClass; 
using RegRecordSet = Interop.MSUtil.ILogRecordset; 

class Program 
{ 
public static void Main() 
{ 
RegRecordSet rs = null; 
try 
{ 
LogQuery qry = new LogQuery(); 
RegistryInputFormat registryFormat = new RegistryInputFormat(); 
string query = @"SELECT Path from \HKLM\SOFTWARE\Microsoft where 
Value='VisualStudio'"; 
rs = qry.Execute(query, registryFormat); 
for(; !rs.atEnd(); rs.moveNext()) 
Console.WriteLine(rs.getRecord().toNativeString(",")); 
} 
finally 
{ 
rs.close(); 
} 
} 
} 
+0

это только просматривает значения реестра, есть ли способ поиска ключа реестра? Я попытался заменить `Value` на` KeyName`, не работал. благодаря – 2017-04-17 02:39:53

17

В случае, если вы не хотите, чтобы принять зависимость от LogParser (как мощный, как это): Я хотел бы взглянуть на Microsoft.Win32.RegistryKey класса (MSDN). Используйте OpenSubKey, чтобы открыть HKEY_CLASSES_ROOT \ Installer \ Products, а затем позвонить GetSubKeyNames, чтобы получить имена разделов.

Откройте каждую из них, позвоните по номеру GetValue по интересующей вас ценности (ProductName, я думаю) и сравните результат с тем, что вы ищете.