在IIS上使用PHP运行Powershell

时间:2015-07-27 14:36:42

标签: php powershell iis outlook fastcgi

PHP代码 - :

<?php

    $user = "email@outlook.com";

    $script = "C:\\inetpub\\wwwroot\\shell_script\\sc.ps1";

    $query = shell_exec("powershell -command $script <nul");
     if($query)
{
   echo "Successful" ;
}
else
   echo "Failed";
}
?>

POWERSHELL CODE - :

$Outlook = New-Object -ComObject Outlook.Application
$Mail = $Outlook.CreateItem(0)

$Mail.To = "email2@outlook.com"
$Mail.Subject = "New Leave Request"
$Mail.Body ="
Dear,

This email contains the body of Email"

$Mail.Send()

我在Windows 8上的Windows Server 2012笔记本电脑上安装了Powershell。

我在Windows Server 2012 IIS上托管了一个网站

当我通过命令./sc.ps1在服务器上的命令行上运行powershell脚本sc.ps1时,邮件将发送到Outlook。

但是当我运行我有shell_exec命令的php页面时,邮件不会被触发到outlook并返回页面,其中包含用PHP代码编写的消息Successful。 所有工作都在Windows Server 2012上完成

在命令行上运行powershell脚本会发送邮件,但是当通过powershell运行脚本时,不会触发邮件并仅在shell-exec查询运行时返回成功。

我已将set-ExecutionPolicy设为无限制。

3 个答案:

答案 0 :(得分:1)

Microsoft目前不建议也不支持从任何无人参与的非交互式客户端应用程序或组件(包括ASP,ASP.NET,DCOM和NT服务)自动化Microsoft Office应用程序,因为Office可能会出现不稳定Office在此环境中运行时的行为和/或死锁。

如果要构建在服务器端上下文中运行的解决方案,则应尝试使用已为安全无人值守执行的组件。或者,您应该尝试找到允许至少部分代码在客户端运行的替代方法。如果从服务器端解决方案使用Office应用程序,则应用程序将缺少许多成功运行的必要功能。此外,您将承担整体解决方案稳定性的风险。有关详细信息,请参阅MSDN中的Considerations for server-side Automation of Office文章。

作为一种解决方法,您可以使用低级API - 支持此类风格的扩展MAPI,或仅支持该API的任何其他第三方包装(例如,Redemption)。

答案 1 :(得分:0)

您可能必须在shell_exec

中传递执行政策
shell_exec("powershell -executionpolicy unrestricted -command $script <nul");

如果这不起作用,您应该检查应用程序池的身份。

答案 2 :(得分:0)

无法在服务中使用Office应用程序(包括Outlook)。(例如IIS)。

您的选择

  1. 如果是Exchange Server,请使用EWS访问邮箱。

  2. 扩展MAPI(仅限C ++或Delphi)

  3. Redemption(任何语言) - 它包装了扩展MAPI,并且可以从服务中使用其RDO系列对象。