我已经设置了一个由脚本使用的应用程序,以无人值守的方式登录 Exchange Online,如下所示本教程。
但是当我尝试使用它登录时,我得到了以下结果,出现了一个不应该显示的登录登录弹出窗口:
请注意,我已将该证书安装在运行此脚本的同一台机器上:
我用来创建该证书的方法是第 3 步,即推荐的方法。
有人知道我怎样才能避免显示登录并让它实际上进行无人值守登录吗?
预先感谢!
更新1:
尝试使用最新的 exchange 命令并且成功了,但是我无法使用 SCC cmdlet:
还安装了最新的 ExchangeOnlineManagement 版本,
Install-Module -Name ExchangeOnlineManagement -RequiredVersion 2.0.5
但仍然弹出 Connect-IPPSession ...
更新2:
根据文档,我需要至少拥有 Exchange Online PowerShell 模块版本 2.0.6-Preview5 或更高版本,但是当我关闭该登录弹出窗口时使用 Connect-IPPSSession 和 CertificationThumbPrint 时,我收到一条错误消息,其中显示命令路径错误 3.0.0。
在我的系统上我有以下版本:
但对于这种情况,真的不知道如何强制使用 v2 下的 2.0.6-Preview5 或更高版本,而不是当前的 3.0.0。
答案1
编辑于 2022 年 11 月 21 日:当前ExchangeOnlineManagement 预发布版本 3.0.1已经修复了这个问题。
我查看了 ExchangeOnlineManagement 模块 3.0.0 的 cmdlet。
问题
该Connect-IPPSSession
cmdlet 在内部调用该Connect-ExchangeOnline
cmdlet,但-ConnectCertificateThumbprint
在从 Windows PowerShell 运行时会删除内部调用中的参数。
这些是 的第 853 行至 681 行ExchangeOnlineManagement.psm1
:
# Will not pass CertificateThumbprint for other system except Windows
if($IsWindows -eq $true)
{
Connect-ExchangeOnline -ConnectionUri $ConnectionUri -AzureADAuthorizationEndpointUri $AzureADAuthorizationEndpointUri -UserPrincipalName $UserPrincipalName.Value -PSSessionOption $PSSessionOption -Credential $Credential.Value -BypassMailboxAnchoring:$BypassMailboxAnchoring -ShowBanner:$false -DelegatedOrganization $DelegatedOrganization -Certificate $Certificate.Value -CertificateFilePath $CertificateFilePath.Value -CertificatePassword $CertificatePassword.Value -CertificateThumbprint $CertificateThumbprint.Value -AppId $AppId.Value -Organization $Organization.Value -Prefix $Prefix -CommandName $CommandName -FormatTypeName $FormatTypeName -UseRPSSession:$true
}
else
{
Connect-ExchangeOnline -ConnectionUri $ConnectionUri -AzureADAuthorizationEndpointUri $AzureADAuthorizationEndpointUri -UserPrincipalName $UserPrincipalName.Value -PSSessionOption $PSSessionOption -Credential $Credential.Value -BypassMailboxAnchoring:$BypassMailboxAnchoring -ShowBanner:$false -DelegatedOrganization $DelegatedOrganization -Certificate $Certificate.Value -CertificateFilePath $CertificateFilePath.Value -CertificatePassword $CertificatePassword.Value -AppId $AppId.Value -Organization $Organization.Value -Prefix $Prefix -CommandName $CommandName -FormatTypeName $FormatTypeName -UseRPSSession:$true
}
这里的问题是,该$IsWindows
变量是使用 PowerShell Core 引入的,但在 Windows PowerShell 中默认不存在。这意味着在 Windows PowerShell 下,条件的$IsWindows -eq $true
计算结果为$false
。
解决方法
作为 Windows PowerShell 中的一种解决方法,您可以$IsWindows
在调用之前全局设置变量Connect-IPPSSession
:
$Global:IsWindows = $true
Connect-IPPSSession -AppId '{App ID}' -CertificateThumbprint '{Certificate thumbprint}' -Organization '{Your Organization}.onmicrosoft.com'
我已在 Windows PowerShell 5.1 和 ExchangeOnlineManagement 3.0.0 上成功测试了此功能。
答案2
所以这是我设法解决这个问题的唯一方法:
Get-Command Install-Module
Install-Module PowerShellGet -Force
关闭终端并打开一个新终端,然后执行以下操作:
Get-Command Install-Module
Install-Module -Name ExchangeOnlineManagement -RequiredVersion 2.0.6-Preview7 -AllowPrerelease
Import-Module -Name ExchangeOnlineManagement -RequiredVersion 2.0.6
Connect-IPPSSession -CertificateThumbPrint "<certificatethumbprint>" -AppID "<AppID>" -Organization "foobar.onmicrosoft.com"