相关疑难解决方法(0)

Registry GetSubKeyNames()列出了与Regedit不同的密钥?

我们正在使用WIX来安装我们创建的许多服务.我正在编写一个快速实用程序来转储当前安装的服务.我只是迭代以下的子键:

SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall 
Run Code Online (Sandbox Code Playgroud)

寻找DisplayName.问题是,我的十项服务中只有两项出现在列表中.

但是,当我查看Regedit中的子键时,它们就在那里.同样,它们在已安装的程序中(我也可以在Win32_Product的SELECT*中找到它们).

我浏览了MSDN文档,试图找出是否有一些我错过的注册表的特殊视图.也许这是一个特权问题?但我正在以管理员身份运行该工具.是否有一些蜂巢安装问题?

为了清楚代码,这里是测试应用程序代码(来自这个答案):

String registryKey = @"SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall";
using(Microsoft.Win32.RegistryKey key = Registry.LocalMachine.OpenSubKey(registryKey))
{
  foreach(String subkeyName in key.GetSubKeyNames())
    Console.WriteLine(key.OpenSubKey(subkeyName).GetValue("DisplayName"));
}
Run Code Online (Sandbox Code Playgroud)

有什么想法吗?

c# registry wix

21
推荐指数
1
解决办法
2万
查看次数

访问有关clickonce应用程序的文件夹信息

这是问题所在:

我有两个申请.其中一个是我无法访问的clickonce应用程序,另一个是我正在设计的ac#program.我需要一种方法来通过.appref-ms开始菜单中的文件或从该文件中找到的令牌ID /名称来跟踪安装应用程序的应用程序文件夹.

这可能吗?有没有办法查询clickonce商店的应用程序列表及其安装位置?我找到的所有内容都是指打开进程列表并转到进程映像位置,但如果程序未运行,则无法执行此操作.

c# clickonce

10
推荐指数
1
解决办法
406
查看次数

GetSubKeyNames 不返回所有键

我想在客户端上安装软件。我也使用 WMI 和注册表。

我在HKLM\SOFTWARE\MICROSOFT\WINDOWS\CURRENTVERSION\UNINSTALL下找到大部分信息

但是,例如 Dropbox,不会出现在那里。Dropbox 位于HKCU下,所以我也想阅读这些密钥。很简单,我想,因为路径是一样的,只是 RegistryHive 发生了变化。

问题

当我在 CurrentVersion 中使用函数 GetSubKeyNames 时,我看不到键UNINSTALL

var root = RegistryKey.OpenBaseKey(RegistryHive.CurrentUser, RegistryView.Registry32)

var key = root.OpenSubKey(@"SOFTWARE\MICROSOFT\WINDOWS\CURRENTVERSION") // works
var key = root.OpenSubKey(@"SOFTWARE\MICROSOFT\WINDOWS\CURRENTVERSION\Uninstall") // doesnt work
Run Code Online (Sandbox Code Playgroud)

我也用 RegistryView.Registry64 尝试了这个 - 我得到了相同的结果。

当我使用 GetSubKeyNames 时打印出的内容如下:

Device Metadata
Explorer
Group Policy
GrpConv
Internet Settings
Media Center
Run
Shell Extensions
Telephony
ThemeManager
WinTrust
Run Code Online (Sandbox Code Playgroud)

有谁知道我该如何解决这个问题?

c# registry

5
推荐指数
2
解决办法
3352
查看次数

如何使用C#找出程序的路径

我找到了一段代码,解释了如何使用System.Diagnostics.Process.StartC#运行外部程序。该代码段显示正在运行cmd.exe,位于路径中。

假设有一些外部程序(例如“超越比较”)。我不知道它是否已安装在PC上。如何检查是否使用C#安装了该程序?如果已安装该程序,我想找到路径以便启动它。

c#

4
推荐指数
1
解决办法
2469
查看次数

WMI-从Win32_Product中选择需要很长时间

我正在枚举使用WMI安装的应用程序,而无论我如何构造它,此块都需要花费较长的时间才能完成。每次在我的环境中花费13秒。有没有更好(更快)的方法来检查程序是否已安装?(我使用iTunes作为示例程序进行检查)

    private static string Timestamp
    {
        get { return DateTime.Now.ToString("HH:mm:ss.ffff"); }
    }

    private static void LoadInstalledPrograms()
    {
        List<string> installedPrograms = new List<string>();
        Console.WriteLine("0 - {0}", Timestamp);
        ManagementObjectSearcher mos = new ManagementObjectSearcher("SELECT * FROM Win32_Product");
        Console.WriteLine("1 - {0}", Timestamp);
        ManagementObjectCollection managementObjectCollection = mos.Get();
        Console.WriteLine("2 - {0}", Timestamp);
        foreach (ManagementObject mo in managementObjectCollection)
        {
            installedPrograms.Add(mo["Name"].ToString());
        }
        Console.WriteLine("3 - {0}", Timestamp);
        Console.WriteLine("Length - {0}", installedPrograms.Count);
    }
Run Code Online (Sandbox Code Playgroud)

选择*从Win32_Product

0 - 08:08:51.3762
1 - 08:08:51.3942
2 - 08:08:51.4012
3 - 08:09:04.8326
Length - 300
Run Code Online (Sandbox Code Playgroud)

SELECT …

c# wmi wmi-query

3
推荐指数
1
解决办法
7449
查看次数

以编程方式获取已安装应用程序可执行文件的列表(Windows10、C#)

我想要获取在 Windows 10 上安装并可执行的应用程序列表 - 即用户可以启动的应用程序的可执行文件(UWP 和非 UWP)。对于 UWP 应用程序,我想获取其 AppUserModelId。对于非 UWP 应用程序,我想获取可执行文件的文件位置。

到目前为止,我已经尝试过:1)遍历注册表并迭代已安装的应用程序。但是,此方法会遍历所有已安装的应用程序,返回的列表将包括类似的内容microsoft asp.net core 2.1.8 shared framework (x64),我想消除这些内容。

2)我发现我可以Appsfolder通过shell:Appsfolder在资源管理器窗口或运行中输入特殊内容来访问我想要的内容。到目前为止,我能够访问该文件夹,并遍历项目并列出文件的名称。但我不确定如何收集有关 AppUserModelId(对于 UWP 应用程序)和文件路径(对于 WPF 应用程序)的信息。

我用来枚举Appsfolder文件的相关代码:

namespace AppsFolder
{
    ...
    public static class AppsFolder
    {
       ...

       // GUID for shell:Appsfolder
       public static readonly Guid KnownFolderID = new Guid("1e87508d-89c2-42f0-8a7e-645a0f50ca58");

       public static IEnumerable<string> GetItemNames(ESHGDN gdn)
       {
           IShellFolder appsFolder = GetAppsFolder();
           try
           {
               IntPtr enumIDListInterfacePointer;
               appsFolder.EnumObjects(IntPtr.Zero,
                    ESHCONTF.SHCONTF_NONFOLDERS | ESHCONTF.SHCONTF_FOLDERS,
                   out enumIDListInterfacePointer);
               using (var enumIDList …
Run Code Online (Sandbox Code Playgroud)

.net c# windows winapi known-folders

3
推荐指数
1
解决办法
4516
查看次数

如何快速而可靠地确定是否安装了 Visual C++ 2013 Runtime

我正在尝试让我的应用程序确定用户系统上是否安装了 Microsoft Visual C++ 2013 Redistributable。我已经浏览了此处此处此处的答案,但看起来所有答案都分为两大类:

  1. 检查注册表:这不是一个选项,因为如果安装了 Visual Studio 或删除了Visual C++ ,您会得到误报。这是的情况下HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\UninstallHKLM\SOFTWARE\Microsoft\VisualStudio\12.0\VCHKLM\SOFTWARE\Wow6432Node\Microsoft\DevDiv\VC
  2. 使用 WMI/使用wmic product get检查系统表new ManagementObjectSearcher("SELECT * FROM Win32_Product")。这是可靠的,但非常慢(40 秒以上),因为它看起来必须在返回结果之前加载系统上安装的所有产品。

当可再发行安装程序运行时,安装程​​序能够非常快速地确定组件是否已安装:

已安装

或未安装:

未安装

什么是最快的方法来做到这一点仍然可靠?理想情况下,我想知道:微软是怎么做到这么快的?我可以那样做吗?

.net c# windows

2
推荐指数
1
解决办法
4560
查看次数

检测程序安装的时间

我可以以某种方式检测使用.Net或Win32 api或其他任何方式安装程序的时间吗?

.net registry winapi

-1
推荐指数
1
解决办法
969
查看次数

标签 统计

c# ×7

.net ×3

registry ×3

winapi ×2

windows ×2

clickonce ×1

known-folders ×1

wix ×1

wmi ×1

wmi-query ×1