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

C#用PSCommand.AddCommand替代AddScript调用Exchange PowerShell报错求助

问题根因

你遇到的报错核心是AddCommand的执行逻辑和AddScript不同:

  • AddScript传入的是完整脚本,PowerShell会逐行执行,先完成Add-PSSnapin加载Exchange组件后,再执行后续的Get-MailUser命令,不会提前校验未执行的命令是否存在
  • 你当前的写法把Add-PSSnapin和Get-MailUser放在了同一个管道序列中,PowerShell在预处理整个管道时,会先检查所有命令是否存在,此时Exchange的snapin还没完成加载,自然识别不到Get-MailUser命令

其他已知错误

  1. 拼写错误:代码里的proxyadressstring少了字母d,正确写法是proxyaddressstring
  2. 参数冗余:你原来的逻辑是展开EmailAddresses属性后取对应的ProxyAddressString,不需要在第一个Select-Object里同时加ExpandProperty和Property参数
  3. 无效占位符:旧代码里的String.Format传入了settings.ExchangeServerUri,但脚本字符串里没有对应的{0}占位符,该参数实际未生效,如果你是要连接远程Exchange服务器,需要额外补充远程会话创建逻辑

修复后代码

使用AddStatement()方法分隔两条独立命令,告诉PowerShell先完成snapin加载,再执行后续查询逻辑:

PSCommand script = new PSCommand();
// 加载Exchange Snapin,执行完成后再运行后续命令
script.AddCommand("Add-PSSnapin")
      .AddArgument("Microsoft.Exchange.Management.PowerShell.SnapIn")
      .AddStatement();

// 执行查询管道
script.AddCommand("Get-MailUser")
      .AddCommand("Select-Object")
      .AddParameter("ExpandProperty", "EmailAddresses")
      .AddCommand("Select-Object")
      .AddParameter("Property", "ProxyAddressString");

补充说明

如果你的代码运行环境没有本地安装Exchange管理工具,无法通过本地加载snapin的方式调用Exchange命令,可以改为创建远程PSSession连接Exchange服务器的方式执行查询,就能用到你代码里预留的settings.ExchangeServerUri参数。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.21 17:45:07