在Basic身份验证下,您曾经能够将凭据存储在变量中
$cred = Get-Credential
现在我们正在使用现代身份验证,而我们的多因素身份验证是Duo。
如何将MFA的凭据存储到变量中,以便将其插入脚本中?
示例
$mfacred = *whateverthecodeis*
Connect-MsolService -Credential $mfacred
Connect-AzureAD -Credential $mfacred
修改 我不想绕过MFA,而是要提示它并以一种方式来存储凭据和令牌,以便脚本的其余部分可以利用凭据和令牌。
答案 0 :(得分:2)
就我在脚本中启用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二进制文件,您甚至可能无法获得返回刷新令牌的信息。
要了解有关访问令牌的更多信息,可以here
对其进行更多研究。答案 1 :(得分:0)
您可以尝试支持现代auth和无人值守脚本的EXO V2预览模块。
您可以使用证书或现有服务主体和客户端机密代替存储密码。