从 C# 运行 Exchange Powershell 命令

Posted

技术标签:

【中文标题】从 C# 运行 Exchange Powershell 命令【英文标题】:Run Exchange Powershell command from C# 【发布时间】:2013-11-26 21:13:48 【问题描述】:

我正在尝试在 C# 中运行 EMC 命令。我正在从我的个人电脑上运行它,该电脑上安装了交换管理工具。

我们的交换服务器上运行的是 2007。

问题是,当我运行 Powershell 或 EMC 时,我需要以具有 Exchange Server 2007 权限的其他用户身份运行,因为我的个人资料没有这些权限。

话虽如此,这是我在个人 PC 上运行的代码:

RunspaceConfiguration config = RunspaceConfiguration.Create();
PSSnapInException snapEx = null;

PSSnapInInfo info = config.AddPSSnapIn("Microsoft.Exchange.Management.Powershell.Admin", out snapEx);

Runspace runspace = RunspaceFactory.CreateRunspace(config);
runspace.Open();

Command createCMD = new Command("Get-Mailbox ID");

Pipeline pipe = runspace.CreatePipeline();
pipe.Commands.Add(createCMD);

Collection<PSObject> results = pipe.Invoke();

我得到的错误是:

Windows PowerShell 管理单元Microsoft.Exchange.Management.Powershell.Admin 未安装在此计算机上。

当我尝试添加 Microsoft.Exchange.Management.Powershell.Admin snapIn 时,我得到了它。

我觉得这与我对个人资料的权限有关,但我并不完全确定。如果是真的,我该如何解决这个问题。


编辑

我说这听起来像权限的原因是因为我能够打开 powershell 并添加管理单元。但是,当我运行诸如get-mailboxstatistics myUserId 之类的命令时,它会抛出一个错误,指出MyServer\MyStorageGroup 不存在。但是,当我 shift-rightCLick 并以其他用户身份运行并使用我的 Exchange 管理员帐户的凭据时,我能够运行这些命令。

【问题讨论】:

【参考方案1】:

如果错误提示您的计算机上没有安装它,您为什么怀疑它与权限有关?

正如this post 建议的那样,请检查您是否安装了 2007 版工具,因为 2010 版上没有相关的 Snapin。

尝试以下步骤:

打开您选择的 powershell 编辑器并在其中添加 PSSnapin。如果有效,则 Snapin 可用,如果无效,则说明您的计算机上确实没有安装。

如果可用,请尝试将您的构建配置从 x86 设置为 64 位,反之亦然。

最终您可以手动安装有问题的 .dll。参考 Keith hill 的 this answer,您必须发出以下 Powershell 命令

$snapinPath = 'Microsoft.Exchange.Management.PowerShell.Admin.dll'
C:\Windows\Microsoft.NET\Framework\v2.0.50727\InstallUtil.exe /i $snapinPath

【讨论】:

我说这听起来像权限的原因是因为我能够打开 powershell 并添加管理单元。但是,当我运行诸如get-mailboxstatistics myUserId 之类的命令时,它会抛出一个错误,指出MyServer\MyStorageGroup 不存在。但是,当我 shift-rightCLick 并以其他用户身份运行并使用我的 Exchange 管理员帐户的凭据时,我可以运行这些命令。【参考方案2】:

此类错误通常是 32 位/64 位问题。例如,管理单元可能注册为 32 位,而您的 C# 程序是 64 位,反之亦然。

有时您可以通过运行其他版本的 InstallUtil 来解决此问题,例如

$snapinPath = 'Microsoft.Exchange.Management.PowerShell.Admin.dll'
C:\Windows\Microsoft.NET\Framework64\v2.0.50727\InstallUtil.exe /i $snapinPath

修复该问题后,我认为您在创建命令的方式上会遇到另一个问题。创建命令时不指定参数。相反,您可以编写如下内容:

Command createCMD = new Command("Get-Mailbox");
createCMD.Parameters.Add(null, "ID");

【讨论】:

以上是关于从 C# 运行 Exchange Powershell 命令的主要内容,如果未能解决你的问题,请参考以下文章

PowerShe 命令行调试指引(转)

PowerShe 使用证书签名 ll脚本

如何为 C# 中的枚举类型应用 InterLocked.Exchange?

在 C# 中阅读 MS Exchange 电子邮件

如何使用 EWS 托管 API 从 Microsoft Exchange 检索所有联系人?

使用服务帐户的 C# 和 Exchange Web 服务 - 错误