阅读注册表是从PowerShell开始的,但在C#

时间:2017-06-16 15:29:29

标签: c# powershell

我想从Powershell脚本迁移到C#应用程序,但我无法从注册表中获取已安装应用程序的列表获得一致的结果。

我尝试了很多不同的方法来读取注册表,但它们都会导致相同的缺失项(与Powershell一起使用)。

Working Powershell示例:

$keys = "HKLM:\Software\Microsoft\Windows\CurrentVersion\Uninstall\*"
$software = Get-ItemProperty $keys | where-object {$_.displayname -ne $null} | Where-Object {$_.displayname -like "*Zip*" } | Select-Object DisplayName
Write-Output $software.DisplayName

#results:
.\test.ps1
7-Zip 16.04 (x64)

我尝试了几个示例(大多数来自此站点),这是一个非工作C#示例的一个变体。我得到了结果,但并非所有项目都在列表中(见截图)。

Microsoft.Win32.RegistryKey regKey = Microsoft.Win32.Registry.LocalMachine;
Microsoft.Win32.RegistryKey subKey1 = regKey.OpenSubKey(@"SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall");

string[] subKeyNames = subKey1.GetSubKeyNames();
foreach (string keyName in subKeyNames) {
    if (keyName.IndexOf("Zip") > 0) { 
        Console.WriteLine(keyName);
    }
}
Console.ReadLine();

#results are empty

我尝试了另一个非工作的c#示例:

string registry_key = @"SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall";
using (Microsoft.Win32.RegistryKey key = Registry.LocalMachine.OpenSubKey(registry_key)) {
    foreach (string subkey_name in key.GetSubKeyNames()) {
        using (RegistryKey subkey = key.OpenSubKey(subkey_name)) {
            if (subkey.GetValue("DisplayName") != null) {
                Console.WriteLine(subkey.GetValue("DisplayName"));
            }
        }
    }
}
Console.ReadLine();

以下是注册表的屏幕截图,显示示例7-Zip列在那里: screenshot

0 个答案:

没有答案