通过 PHP 使用 Exchange 管理单元执行 powershell 脚本

Posted

技术标签:

【中文标题】通过 PHP 使用 Exchange 管理单元执行 powershell 脚本【英文标题】:Executing a powershell script with Exchange Snap-In via PHP 【发布时间】:2012-04-13 15:02:26 【问题描述】:

我正在尝试使用 php 执行的 powershell 脚本查询 Exchange 服务器,但它似乎无法正常工作。我试图运行的命令是:

powershell "Add-PSSnapin Microsoft.Exchange.Management.PowerShell.E2010";"Get-CASMailbox -Identity user@example.com | fl ActiveSyncEnabled"

如果我直接在命令提示符中输入,它会正确执行并返回:

ActiveSyncEnabled : 真

当我在 PHP 中尝试时:

$output=shell_exec('powershell "Add-PSSnapin Microsoft.Exchange.Management.PowerShell.E2010";"Get-CASMailbox -Identity user@example.org | fl ActiveSyncEnabled"');

我什么也得不到。 $output 已设置但为空。如果我在末尾添加“> output.txt”,我会得到一个空白文本文件。我能够通过 PHP 成功运行其他更简单的 powershell 命令,但不是这个。 Apache 服务正在以与我通过命令提示符成功执行脚本时相同的用户身份运行。

有什么想法吗?

我在跑步:

Windows Server 2008 R2 SP1 64 位 Apache 2.2.22 32 位 PHP 5.2.17 VC6 32 位 Exchange 管理控制台 2010

【问题讨论】:

出于测试目的,我将 Apache 服务设置为以我自己的身份运行。在 PHP 中,exec('whoami') 返回我的域\用户名,与我在命令提示符下成功执行命令时使用的用户名相同。这不应该说明任何权限问题,还是我遗漏了什么? 【参考方案1】:

您可以尝试在命令末尾添加2>&1,例如:

$output=shell_exec('powershell "Add-PSSnapin Microsoft.Exchange.Management.PowerShell.E2010";"Get-CASMailbox -Identity user@example.org | fl ActiveSyncEnabled" 2>&1');

有时,powershell 输出开头的换行符似乎会阻止shell_exec 打印其他任何内容。

【讨论】:

感谢您的帮助!它仍然不起作用,但至少现在我收到一个错误:Add-PSSnapin : No snap-ins have been registered for Windows PowerShell version 2. At line:1 char:13 + Add-PSSnapin <<<< Microsoft.Exchange.Management.PowerShell.E2010;Get-CASMail box -Identity MAYA@mmc.org | fl ActiveSyncEnabled + CategoryInfo : InvalidArgument: (Microsoft.Excha...owerShell.E2 010:String) [Add-PSSnapin], PSArgumentException + FullyQualifiedErrorId : AddPSSnapInRead,Microsoft.PowerShell.Commands.Ad dPSSnapinCommand 我编辑了我之前的评论,但出现了我现在遇到的错误。我也试过直接在命令提示符下输入Shedal的字符串,依然正确执行,返回AciveSyncEnabled : True @amay83 错误可能是因为您使用的 powershell 可执行文件错误。参考这篇文章:blogs.msdn.com/b/pasen/archive/2011/04/06/… 看来,问题是因为管理单元是为 x64 编译的,而您的 shell 在 32 位模式下运行。所以它看不到管理单元。我发现一条评论建议您如何以另一种模式运行 shell:php.net/manual/en/function.shell-exec.php#84992。不过,反之亦然,您需要在 32 位模式下运行,而在 64 位模式下运行。 这不起作用,但非常感谢您发现问题!我最终安装了 Apache x64 和 PHP x64,我从这里得到:anindya.com。这解决了问题,现在所有 64 位应用程序都可以很好地协同工作。

以上是关于通过 PHP 使用 Exchange 管理单元执行 powershell 脚本的主要内容,如果未能解决你的问题,请参考以下文章

用于 Exchange 2007 的 Powershell 管理单元

用户通过启用角色的安全组分配的 Exchange 管理员角色无法访问 EAC,但能够使用管理外壳

使用 PHP 和 cURL 访问 Exchange Web 服务

Exchange Server 2016管理系列课件54.DAG管理之执行服务器级别的切换

Exchange Web 服务托管 API:如何通过 FindItem 方法执行重复扩展?

AD和exchange 管理平台(web版本)