连接到microsoft.Exchange Office365的脚本中途超时,并再次提示输入凭据

时间:2019-04-23 15:45:27

标签: powershell office365 exchange-server

客户要求我开发一个脚本,该脚本连接到Office365交换并扫描所有用户,以确保应用程序的某些邮箱可以访问它们。我已经开发了脚本并且可以正常工作,但是在脚本的一半时,它再次要求提供凭据。它说它正在创建一个用于隐式远程处理的新会话。

我尝试创建一个New-PSSessionOption -idleTimeout 1200000,它将超时设置为大约2小时。那没用

然后,尽管我的凭据对象配置不正确,但是当我将$ userCredential变量设置为(get-credential)时,它会执行相同的操作。

$username = ""
$pwdTxt = gc .\SecureStringPassword.txt
$securePwd = $pwdTxt | ConvertTo-SecureString
$UserCredential = New-Object System.Management.Automation.PSCredential -ArgumentList $username, $securePwd
$so = New-PSSessionOption -IdleTimeout 1200000
$Session = New-PSSession -ConfigurationName Microsoft.Exchange -ConnectionUri https://outlook.office365.com/powershell-liveid/ -Credential $UserCredential -SessionOption $so -Authentication Basic -AllowRedirection

import-PSSession $session

$mailboxes = get-mailbox -ResultSize Unlimited

foreach ($m in $mailboxes) {
"working on $m"

$SmtpAddress = $m.PrimarySmtpAddress;
$Calendar = $SmtpAddress + ":\Calendar"

Add-MailboxPermission -Identity $m.Alias -User mitel-unified-messaging@contoso.com -AccessRights FullAccess -inheritanceType All -confirm:$false;

Add-RecipientPermission $m.Alias -AccessRights SendAs -Trustee mitel-unified-messaging@contoso.com -confirm:$false

Add-MailboxFolderPermission -Identity $calendar -User courtalert -AccessRights Author -confirm:$false ;

Add-MailboxPermission -Identity $m.Alias -user svcItrezzo@contoso.com -AccessRights FullAccess -inheritanceType All -confirm:$false;

write-host "done with $m" -Foregroundcolor Green
}

Exit-PSSession

预期结果-脚本完全运行,无需提示输入凭据

实际结果-脚本通常在大约2分钟内提示输入凭据。

2 个答案:

答案 0 :(得分:0)

我发现了问题所在。它与我的代码无关,但是我对代码也做了一些更改。

首先,问题在于网络。客户端的环境将所有端口80/443流量重定向到其websense防火墙/负载平衡器。这就是导致连接断开的原因。一旦我提供了异常,脚本便可以顺利运行。

但是,有几次脚本不喜欢我在做什么,这会终止会话。这是因为

import-PSSession $session

一旦我将其更改为

Import-PSSession $session -AllowClobber

默认情况下,Import-PSSession导入所有命令,但与当前会话中的命令具有相同名称的命令除外。要导入所有命令,请使用AllowClobber参数。

毕竟,脚本运行顺利。

答案 1 :(得分:0)

而不是使用...

Import-PSSession $session -AllowClobber

…有时会变得笨拙。考虑改用前缀,以便您知道运行EXO与EXP的时间。

    $o365Cred = Get-Credential
    $ExoSession = New-PSSession -ConfigurationName Microsoft.Exchange `
    -ConnectionUri https://ps.outlook.com/powershell/ `
    -Credential $o365Cred `
    -Authentication Basic `
    -AllowRedirection
    Import-PSSession $ExoSession -Prefix Exo


    $ExpSession = New-PSSession -ConfigurationName Microsoft.Exchange `
    -ConnectionUri http://mail.$env:USERDNSDOMAIN/PowerShell/ `
    -Authentication Kerberos
    Import-PSSession $ExpSession -Prefix Exp

这样您就不会踩东西了。但是,这确实意味着使用cmdlet时必须使用前缀。

Get-ExoMailbox
Get-ExpMailbox

详细信息在帮助文件中:

Import-PSSession

  

-Prefix指定导入命令名称中名词的前缀。

     

使用此参数来避免会话中不同命令具有相同名称时可能发生的名称冲突。

     

例如,如果您指定前缀Remote,然后导入   Get-Date cmdlet,该cmdlet在会话中称为Get-RemoteDate,   而且它与原始的Get-Date没有混淆

示例: Adding Exchange Shell items to PowerShell ISE