我尝试使用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] =>
)
答案 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>';