尝试使用PHP和Powershell连接到MSOL服务时出错

时间:2014-02-18 14:21:10

标签: php powershell office365

我尝试使用powershell连接到Msol服务

$username = "username@domain.com"
$password = "password"

$secure_password = $password | ConvertTo-SecureString -AsPlainText -Force
$credencial = New-Object System.Management.Automation.PSCredential ($username, $secure_password)

Import-Module MSOnline
Connect-MsolService -Credential $credencial

Get-MSolGroup -GroupType DistributionList -SearchString "groupname" | Select DisplayName, EmailAddress, ObjectId | Out-String

和PHP:

$command = 'powershell -File "'.dirname(__DIR__).'\\ps\\run.ps1"';
exec($command, $output);
print_r($output);

从本地PC powershell脚本运行没有任何错误,但使用PHP它会引发错误:

Array
(
    [0] => Exception of type 'Microsoft.Online.Administration.Automation.MicrosoftOnlineEx
    [1] => ception' was thrown.
    [2] =>     + CategoryInfo          : OperationStopped: (:) [Connect-MsolService], Mic
    [3] =>    rosoftOnlineException
    [4] =>     + FullyQualifiedErrorId : 0x80090345,Microsoft.Online.Administration.Autom
    [5] =>    ation.ConnectMsolService
    [6] =>     + PSComputerName        : s021
    [7] => 
    [8] => You must call the Connect-MsolService cmdlet before calling any other cmdlets.
    [9] =>     + CategoryInfo          : OperationStopped: (:) [Get-MsolGroup], Microsoft
    [10] =>    OnlineException
    [11] =>     + FullyQualifiedErrorId : Microsoft.Online.Administration.Automation.Micro
    [12] =>    softOnlineException,Microsoft.Online.Administration.Automation.GetGroup
    [13] =>     + PSComputerName        : s021
    [14] => 
    [15] => 
)

2 个答案:

答案 0 :(得分:1)

如异常所示:在调用任何其他cmdlet之前,必须调用Connect-MsolService cmdlet。

答案 1 :(得分:1)

首先,以明文形式在脚本中存储密码是一个糟糕的主意。如果您的目标是为Azure Active Directory中的某些操作提供Web界面,那么最好的办法是使用专为此设计的Azure Active Directory Graph API。如果你仍然觉得你有一个有效的场景,你已经分析并权衡了你正在做的事情的风险,并且绝对确定你想要这个,然后继续阅读....

应该工作的内容,我能够使用您拥有的相同脚本,并在浏览器中成功查看通讯组的详细信息。您可以尝试一些事项:

  • 我怀疑这与你的问题甚至有很大关系,但是如果你使用单引号,你就不应该逃避你的道路:

    $command = 'powershell -File "' . dirname(__DIR__) . '\ps\run.ps1"';
    
  • 确保您正在执行正确版本的PowerShell(32位与64位)。作为健全性检查,请尝试运行:

    <?php echo shell_exec('powershell -Command "[intptr]::size"'); ?>
    

    如果您使用的是64位系统,并且看到8,那么您可能很好。如果您看到4,那么您可能会遇到服务器(例如Apache或IIS)或PHP不是64位版本的问题。 (这就是我得到的。一旦我安装了一个64位运行的服务器堆栈,一切都运行得很漂亮。在此之前,我在尝试加载MSOnline库时遇到了错误。)

  • 三重检查您拥有的脚本是您正在执行的脚本(即确保您没有处理位于其他位置的副本)。调试此选项的一个选项是打印脚本本身。尝试将此行添加到PHP文件中:

    echo '<pre>'
        . htmlentities(file_get_contents(dirname(__DIR__) . '\ps\run.ps1')) 
        . '</pre>';