You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用C#实现PowerShell中Get-ItemProperty的注册表查询功能?

解决方案:获取Exchange Server Watson注册表项的所有值

一、纯C#实现(不依赖PowerShell)

Registry.GetValue不支持路径通配符(比如v*),也无法通过*批量获取所有键值对,只能读取单个指定名称的值(未指定时默认返回项的默认值)。要实现和目标PowerShell命令相同的效果,需要手动遍历注册表路径:

  1. 打开HKLM\SOFTWARE\Microsoft\ExchangeServer根节点
  2. 遍历所有以v开头的子项(对应PowerShell中的v*,即Exchange的版本号节点)
  3. 对每个符合条件的版本节点,尝试打开Watson子项
  4. 读取Watson项内的所有键值对

代码示例:

using Microsoft.Win32;
using System;
using System.Collections.Generic;

class Program
{
    static void Main()
    {
        var watsonKeyValuePairs = new Dictionary<string, object>();
        
        // 打开ExchangeServer根节点,64位系统需指定Registry64视图,避免读取Wow6432Node下的32位节点
        using (var exchangeRoot = RegistryKey.OpenBaseKey(RegistryHive.LocalMachine, RegistryView.Registry64)
                                           .OpenSubKey(@"SOFTWARE\Microsoft\ExchangeServer"))
        {
            if (exchangeRoot == null)
            {
                Console.WriteLine("未找到ExchangeServer注册表根节点");
                return;
            }
            
            // 遍历所有以v开头的版本子项
            foreach (var subKeyName in exchangeRoot.GetSubKeyNames())
            {
                if (subKeyName.StartsWith("v", StringComparison.OrdinalIgnoreCase))
                {
                    using (var watsonKey = exchangeRoot.OpenSubKey($"{subKeyName}\\Watson"))
                    {
                        if (watsonKey != null)
                        {
                            // 读取当前Watson项的所有键值对
                            foreach (var valueName in watsonKey.GetValueNames())
                            {
                                var value = watsonKey.GetValue(valueName);
                                watsonKeyValuePairs[valueName] = value;
                                Console.WriteLine($"{valueName}: {value}");
                            }
                        }
                    }
                }
            }
        }
    }
}

二、C#调用PowerShell实现

如果更倾向于复用PowerShell的通配符处理逻辑,可以直接在C#中执行目标PowerShell命令:

代码示例:

using System;
using System.Management.Automation;

class Program
{
    static void Main()
    {
        using (var psInstance = PowerShell.Create())
        {
            // 添加要执行的PowerShell命令及参数
            psInstance.AddCommand("Get-ItemProperty")
                      .AddParameter("Path", @"HKLM:\SOFTWARE\Microsoft\ExchangeServer\v*\Watson")
                      .AddParameter("Name", "*");
            
            // 执行命令并获取结果
            var results = psInstance.Invoke();
            
            foreach (var result in results)
            {
                if (result != null)
                {
                    // 遍历结果属性,排除PowerShell自带的PS前缀属性(如PSPath、PSParentPath)
                    foreach (var prop in result.Properties)
                    {
                        if (!prop.Name.StartsWith("PS", StringComparison.OrdinalIgnoreCase))
                        {
                            Console.WriteLine($"{prop.Name}: {prop.Value}");
                        }
                    }
                }
            }
            
            // 输出执行过程中的错误信息
            if (psInstance.HadErrors)
            {
                foreach (var error in psInstance.Streams.Error)
                {
                    Console.WriteLine($"执行错误: {error.Exception.Message}");
                }
            }
        }
    }
}

注意:需要通过NuGet安装Microsoft.PowerShell.5.ReferenceAssemblies包,以引用System.Management.Automation程序集。

内容的提问来源于stack exchange,提问作者dj Bravo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 22:10:44