我们正在使用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)
有什么想法吗?
这是问题所在:
我有两个申请.其中一个是我无法访问的clickonce应用程序,另一个是我正在设计的ac#program.我需要一种方法来通过.appref-ms
开始菜单中的文件或从该文件中找到的令牌ID /名称来跟踪安装应用程序的应用程序文件夹.
这可能吗?有没有办法查询clickonce商店的应用程序列表及其安装位置?我找到的所有内容都是指打开进程列表并转到进程映像位置,但如果程序未运行,则无法执行此操作.
我想在客户端上安装软件。我也使用 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)
有谁知道我该如何解决这个问题?
我找到了一段代码,解释了如何使用System.Diagnostics.Process.Start
C#运行外部程序。该代码段显示正在运行cmd.exe
,位于路径中。
假设有一些外部程序(例如“超越比较”)。我不知道它是否已安装在PC上。如何检查是否使用C#安装了该程序?如果已安装该程序,我想找到路径以便启动它。
我正在枚举使用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 …
我想要获取在 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) 我正在尝试让我的应用程序确定用户系统上是否安装了 Microsoft Visual C++ 2013 Redistributable。我已经浏览了此处、此处和此处的答案,但看起来所有答案都分为两大类:
HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall
,HKLM\SOFTWARE\Microsoft\VisualStudio\12.0\VC
和HKLM\SOFTWARE\Wow6432Node\Microsoft\DevDiv\VC
。wmic product get
或检查系统表new ManagementObjectSearcher("SELECT * FROM Win32_Product")
。这是可靠的,但非常慢(40 秒以上),因为它看起来必须在返回结果之前加载系统上安装的所有产品。当可再发行安装程序运行时,安装程序能够非常快速地确定组件是否已安装:
或未安装:
什么是最快的方法来做到这一点仍然可靠?理想情况下,我想知道:微软是怎么做到这么快的?我可以那样做吗?