从安装位置执行程序

时间:2016-05-02 19:12:03

标签: c# exe executable

首先,我扫描系统上的每个已安装程序。从这里我得到InstallLocation和DisplayName。 现在我想从这个名称或位置执行扫描的程序。 有没有办法做到这一点,还是我真的需要可执行文件的名称或位置?

public static class InstalledPrograms 
{    
    const string registry_key = @"SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall";

    public static List<string> GetInstalledPrograms()
    {
        var result = new List<string>();
        var termsList = new List<string>();
        result.AddRange(GetInstalledProgramsFromRegistry(RegistryView.Registry32));
        result.AddRange(GetInstalledProgramsFromRegistry(RegistryView.Registry64));
        result = result.Distinct().ToList();
        result.Sort();
        foreach (var i in result)
        {
            Console.WriteLine(i);

        }
        return result;
    }

    private static IEnumerable<string> GetInstalledProgramsFromRegistry(RegistryView registryView)
    {
        var result = new List<string>();

        using (RegistryKey key = RegistryKey.OpenBaseKey(RegistryHive.LocalMachine, registryView).OpenSubKey(registry_key))
        {
            foreach (string subkey_name in key.GetSubKeyNames())
            {
                using (RegistryKey subkey = key.OpenSubKey(subkey_name))
                {
                    if (IsProgramVisible(subkey))
                    {
                        var ii = (string)subkey.GetValue("InstallLocation");
                        result.Add(ii);
                    }
                }
            }
        }

        return result;
    }

    private static bool IsProgramVisible(RegistryKey subkey)
    {
        var name = (string)subkey.GetValue("DisplayName");
        var releaseType = (string)subkey.GetValue("ReleaseType");
        //var unistallString = (string)subkey.GetValue("UninstallString");
        var systemComponent = subkey.GetValue("SystemComponent");
        var parentName = (string)subkey.GetValue("ParentDisplayName");

        return
            !string.IsNullOrEmpty(name)
            && string.IsNullOrEmpty(releaseType)
            && string.IsNullOrEmpty(parentName)
            && (systemComponent == null);
    }
}

1 个答案:

答案 0 :(得分:1)

简短的回答是您无法使用注册表树的该部分找到应用程序路径。该信息取决于安装。您可以找到卸载程序,因为提供了该路径。我非常怀疑您的程序用户会对您调用已安装的每个应用程序/修补程序的卸载感到满意。

您唯一能做的就是扫描这些目录中的.exe个文件。如果你只有一个,那么你可能没问题。当然,如果使用安装程序安装它们,卸载程序很可能存在于同一目录中。

简单地启动每个已安装的应用程序都没有可预测的方法。有时,安装的对象是现有产品的库和扩展。

要考虑的另一件事是商店应用程序有关于如何安装/卸载甚至调用它们的新规则。 Windows商店应用程序没有“.exe”文件,即使您可以找到它也可以直接调用。

相关问题