就我在脚本中启用 MFA 的帐户的经验而言。绕过 MFA 的唯一方法是使用不带“-Credential”参数的 cmdlet。
MFA 的主要用例是防止这样的事情:脚本在受感染的帐户上运行。
更新:
因此,有一种方法可以破解您以编程方式获取令牌的方式。这是通过使用安装 Azure 模块和/或其他 O365 模块时附带的 ADAL 二进制文件来完成的。没有简单的方法来提示并将令牌存储在变量中。
您需要在脚本中加载 DLL 以开始缓存令牌:
Add-Type -Path 'C:\Program Files\WindowsPowerShell\Modules\AzureAD\2.0.x.x\Microsoft.IdentityModel.Clients.ActiveDirectory.dll'
您可以使用AcquireTokenAsync方法预先获取访问令牌。
$accesstoken = [Microsoft.IdentityModel.Clients.ActiveDirectory.TokenCache]::DefaultShared
$accesstoken.ReadItems() | select DisplayableId, Authority, ClientId, Resource
上面的 ReadItem() 方法将为您提供将令牌存储在变量中所需的所有信息。
$authContext = New-Object "Microsoft.IdentityModel.Clients.ActiveDirectory.AuthenticationContext" -ArgumentList #PLACE AUTHORITY URL HERE#
$client_id = "CLIENT_ID INFO"
$Credential = Get-Credential YOURUSERNAME@COMPANY.COM
$AzureADCred = New-Object "Microsoft.IdentityModel.Clients.ActiveDirectory.UserPasswordCredential" -ArgumentList $Credential.UserName,$Credential.Password
$authResult = [Microsoft.IdentityModel.Clients.ActiveDirectory.AuthenticationContextIntegratedAuthExtensions]::AcquireTokenAsync($authContext,"https://RESOURCE-URL.COM",$client_Id,$AzureADCred)
获得令牌后,您可以使用它连接到您的会话,可以是在线交换、Azure 或 Office。
$Authorization = "Bearer {0}" -f $authResult.Result.AccessToken
$Password = ConvertTo-SecureString -AsPlainText $Authorization -Force
$Ctoken = New-Object System.Management.Automation.PSCredential -ArgumentList "YourCompanyUserAccount@COMPANY.COM", $Password
有一个警告,这些仅适用于访问令牌,不考虑刷新令牌。您甚至可能不会根据您使用的 ADAL 二进制文件返回刷新令牌。
要了解有关访问令牌的更多信息,您可以在此处进行更多研究