Files
2025-09-30 16:27:33 +02:00

3329 lines
117 KiB
PowerShell

# This contains functions for getting Azure AD access tokens
# Tries to get access token from cache unless provided as parameter
# Refactored Jun 8th 2020
function Get-AccessTokenFromCache
{
[cmdletbinding()]
Param(
[Parameter(Mandatory=$False)]
[String]$AccessToken,
[Parameter(Mandatory=$True)]
[String]$ClientID,
[Parameter(Mandatory=$True)]
[String]$Resource,
[switch]$IncludeRefreshToken,
[boolean]$Force=$false,
[Parameter(Mandatory=$False)]
[String]$SubScope
)
Process
{
# Strip the trailing slash
$tResource = $Resource.TrimEnd("/")
# Check if we got the AccessToken as parameter
if([string]::IsNullOrEmpty($AccessToken))
{
# Check if cache entry is empty
# The audience can be resource name or resource id
if($Script:tokens.ContainsKey("$ClientId-$tResource"))
{
$cacheKey = "$ClientId-$tResource"
}
else
{
# Loop through the resource ids
foreach($resId in $Script:RESIDs.Keys)
{
if($Script:RESIDs[$resId] -eq $tResource)
{
if($Script:tokens.ContainsKey("$ClientId-$resId"))
{
$cacheKey = "$ClientId-$resId"
}
break
}
}
}
if([string]::IsNullOrEmpty($cacheKey))
{
# If token not found, try to find other tokens with the same resource
Write-Verbose "Access token for $ClientId-$tResource not found. Trying to find other clients for the resource"
foreach($cacheKey in $Script:tokens.Keys)
{
if($cacheKey.EndsWith($tResource) -or ($resId -ne $null -and $cacheKey.EndsWith($Script:RESIDs[$resId])))
{
Write-Verbose "Found token for ClientId $($cacheKey.Substring(0,36))"
$retVal=$Script:tokens[$cacheKey]
break
}
}
# If FOCI client, try to find refresh token for other FOCI client
if([string]::IsNullOrEmpty($retVal) -and (IsFOCI -ClientId $ClientID))
{
Write-Verbose "Access token for $ClientId-$tResource not found. Trying to find refresh token for other FOCI clients"
# Loop through cached refresh tokens
foreach($cacheKey in $Script:refresh_tokens.Keys)
{
# Extract the client id
[guid]$rtClientId = $cacheKey.Substring(0,36)
if(IsFOCI -ClientId $rtClientId)
{
Write-Verbose "Using refresh token for ClientId $rtClientId"
# If FOCI client, get access token with it's refresh_token
$tenantId = (Read-Accesstoken -AccessToken $Script:tokens[$cacheKey]).tid
$refresh_token = $Script:refresh_tokens[$cacheKey]
$retVal = Get-AccessTokenWithRefreshToken -Resource $Resource -ClientId $ClientID -RefreshToken $refresh_token -TenantId $tenantId -SaveToCache $True -SubScope $SubScope
break
}
}
}
if([string]::IsNullOrEmpty($retVal))
{
# Empty, so throw the exception
Throw "No saved tokens found. Please call Get-AADIntAccessTokenFor<service> -SaveToCache"
}
}
else
{
$retVal=$Script:tokens[$cacheKey]
}
}
else
{
# Check that the audience of the access token is correct
$tAudience=(Read-Accesstoken -AccessToken $AccessToken).aud.TrimEnd("/")
# The audience might be a GUID
if((($tAudience -ne $tResource) -and ($Script:RESIDs[$tAudience] -ne $tResource)) -and ($Force -eq $False))
{
# Wrong audience
Write-Warning "The audience of the access token ($tAudience) is wrong. Should be $tResource!"
}
# Just return the passed access token
$retVal=$AccessToken
}
# Check the expiration
if(Is-AccessTokenExpired($retVal))
{
# Use the same client id as the expired token
$ClientID = (Read-Accesstoken -AccessToken $retVal).appid
Write-Verbose "ACCESS TOKEN HAS EXPRIRED. Trying to get a new one with RefreshToken."
$retVal = Get-AccessTokenWithRefreshToken -Resource $Resource -ClientId $ClientID -RefreshToken (Get-RefreshTokenFromCache -AccessToken $retVal) -TenantId (Read-Accesstoken -AccessToken $retVal).tid -SaveToCache $true -IncludeRefreshToken $IncludeRefreshToken
}
# Return
return $retVal
}
}
# Returns refresh token from cache
# Apr 25th 2023
function Get-RefreshTokenFromCache
{
[cmdletbinding()]
Param(
[Parameter(ParameterSetName='AccessToken',Mandatory=$False)]
[String]$AccessToken,
[Parameter(ParameterSetName='ClientAndResource', Mandatory=$True)]
[String]$ClientID,
[Parameter(ParameterSetName='ClientAndResource', Mandatory=$True)]
[String]$Resource
)
Process
{
# Get clientid and resource from access token if provided
if($AccessToken)
{
$parsedToken = Read-AccessToken -AccessToken $AccessToken
$ClientID = $parsedToken.appid
$Resource = $parsedToken.aud
}
# Strip the trailing slash
$Resource = $Resource.TrimEnd("/")
return $Script:refresh_tokens["$ClientId-$Resource"]
}
}
# Gets the access token for AAD Graph API
function Get-AccessTokenForAADGraph
{
<#
.SYNOPSIS
Gets OAuth Access Token for AAD Graph
.DESCRIPTION
Gets OAuth Access Token for AAD Graph, which is used for example in Provisioning API.
If credentials are not given, prompts for credentials (supports MFA).
.Parameter Credentials
Credentials of the user. If not given, credentials are prompted.
.Parameter PRT
PRT token of the user.
.Parameter SAML
SAML token of the user.
.Parameter UserPrincipalName
UserPrincipalName of the user of Kerberos ticket
.Parameter KerberosTicket
Kerberos token of the user.
.Parameter UseDeviceCode
Use device code flow.
.Parameter Resource
Resource, defaults to "https://graph.windows.net"
.Example
Get-AADIntAccessTokenForAADGraph
.Example
PS C:\>$cred=Get-Credential
PS C:\>Get-AADIntAccessTokenForAADGraph -Credentials $cred
#>
[cmdletbinding()]
Param(
[Parameter(ParameterSetName='Credentials',Mandatory=$False)]
[System.Management.Automation.PSCredential]$Credentials,
[Parameter(ParameterSetName='PRT',Mandatory=$True)]
[String]$PRTToken,
[Parameter(ParameterSetName='SAML',Mandatory=$True)]
[String]$SAMLToken,
[Parameter(ParameterSetName='Kerberos',Mandatory=$True)]
[String]$KerberosTicket,
[Parameter(ParameterSetName='Kerberos',Mandatory=$True)]
[String]$Domain,
[Parameter(ParameterSetName='DeviceCode',Mandatory=$True)]
[switch]$UseDeviceCode,
[Parameter(ParameterSetName='MSAL',Mandatory=$True)]
[switch]$UseMSAL,
[Parameter(Mandatory=$False)]
[String]$Tenant,
[switch]$SaveToCache,
[ValidateSet("https://graph.windows.net", "urn:ms-drs:enterpriseregistration.windows.net","urn:ms-drs:enterpriseregistration.microsoftonline.us")]
[String]$Resource="https://graph.windows.net",
[Parameter(Mandatory=$False)]
[string]$OTPSecretKey,
[Parameter(Mandatory=$False)]
[string]$TAP,
# PRT + SessionKey
[Parameter(ParameterSetName='PRT_Skey',Mandatory=$True)]
[Parameter(ParameterSetName='PRT_Settings',Mandatory=$False)]
[String]$RefreshToken,
[Parameter(ParameterSetName='PRT_Skey',Mandatory=$True)]
[Parameter(ParameterSetName='PRT_Settings',Mandatory=$False)]
[Parameter(Mandatory=$False)]
[String]$SessionKey,
[Parameter(ParameterSetName='PRT_Skey',Mandatory=$False)]
[Parameter(ParameterSetName='PRT_Settings',Mandatory=$True)]
[Parameter(Mandatory=$False)]
$Settings,
# Continuous Access Evaluation
[Parameter(Mandatory=$False)]
[switch]$CAE,
# ESTS
[Parameter(ParameterSetName='ESTS',Mandatory=$True)]
[string]$ESTSAUTH
)
Process
{
Get-AccessToken -Credentials $Credentials -Resource $Resource -ClientId "1b730954-1685-4b74-9bfd-dac224a7b894" -SAMLToken $SAMLToken -Tenant $Tenant -KerberosTicket $KerberosTicket -Domain $Domain -SaveToCache $SaveToCache -PRTToken $PRTToken -UseDeviceCode $UseDeviceCode -OTPSecretKey $OTPSecretKey -TAP $TAP -UseMSAL $UseMSAL -RefreshToken $RefreshToken -SessionKey $SessionKey -Settings $Settings -CAE $CAE -ESTSAUTH $ESTSAUTH
}
}
# Gets the access token for MS Graph API
function Get-AccessTokenForMSGraph
{
<#
.SYNOPSIS
Gets OAuth Access Token for Microsoft Graph
.DESCRIPTION
Gets OAuth Access Token for Microsoft Graph, which is used in Graph API.
If credentials are not given, prompts for credentials (supports MFA).
.Parameter Credentials
Credentials of the user. If not given, credentials are prompted.
.Parameter PRT
PRT token of the user.
.Parameter SAML
SAML token of the user.
.Parameter UserPrincipalName
UserPrincipalName of the user of Kerberos token
.Parameter KerberosTicket
Kerberos token of the user.
.Example
Get-AADIntAccessTokenForMSGraph
.Example
$cred=Get-Credential
Get-AADIntAccessTokenForMSGraph -Credentials $cred
#>
[cmdletbinding()]
Param(
[Parameter(ParameterSetName='Credentials',Mandatory=$False)]
[System.Management.Automation.PSCredential]$Credentials,
[Parameter(ParameterSetName='PRT',Mandatory=$True)]
[String]$PRTToken,
[Parameter(ParameterSetName='SAML',Mandatory=$True)]
[String]$SAMLToken,
[Parameter(ParameterSetName='Kerberos',Mandatory=$True)]
[String]$KerberosTicket,
[Parameter(ParameterSetName='Kerberos',Mandatory=$True)]
[String]$Domain,
[Parameter(ParameterSetName='DeviceCode',Mandatory=$True)]
[switch]$UseDeviceCode,
[Parameter(ParameterSetName='MSAL',Mandatory=$True)]
[switch]$UseMSAL,
[Parameter(Mandatory=$False)]
[String]$Tenant,
[switch]$SaveToCache,
[switch]$SaveToMgCache,
[Parameter(Mandatory=$False)]
[string]$OTPSecretKey,
[Parameter(Mandatory=$False)]
[string]$TAP,
# PRT + SessionKey
[Parameter(ParameterSetName='PRT_Skey',Mandatory=$True)]
[Parameter(ParameterSetName='PRT_Settings',Mandatory=$False)]
[String]$RefreshToken,
[Parameter(ParameterSetName='PRT_Skey',Mandatory=$True)]
[Parameter(ParameterSetName='PRT_Settings',Mandatory=$False)]
[Parameter(Mandatory=$False)]
[String]$SessionKey,
[Parameter(ParameterSetName='PRT_Skey',Mandatory=$False)]
[Parameter(ParameterSetName='PRT_Settings',Mandatory=$True)]
[Parameter(Mandatory=$False)]
$Settings,
# Continuous Access Evaluation
[Parameter(Mandatory=$False)]
[switch]$CAE,
# ESTS
[Parameter(ParameterSetName='ESTS',Mandatory=$True)]
[string]$ESTSAUTH
)
Process
{
Get-AccessToken -Credentials $Credentials -Resource "https://graph.microsoft.com" -ClientId "1b730954-1685-4b74-9bfd-dac224a7b894" -SAMLToken $SAMLToken -KerberosTicket $KerberosTicket -Domain $Domain -SaveToCache $SaveToCache -PRTToken $PRTToken -UseDeviceCode $UseDeviceCode -Tenant $Tenant -OTPSecretKey $OTPSecretKey -TAP $TAP -SaveToMgCache $SaveToMgCache -UseMSAL $UseMSAL -RefreshToken $RefreshToken -SessionKey $SessionKey -Settings $Settings -CAE $CAE -ESTSAUTH $ESTSAUTH
}
}
# Gets the access token for enabling or disabling PTA
function Get-AccessTokenForPTA
{
<#
.SYNOPSIS
Gets OAuth Access Token for PTA
.DESCRIPTION
Gets OAuth Access Token for PTA, which is used for example to enable or disable PTA.
.Parameter Credentials
Credentials of the user.
.Parameter PRT
PRT token of the user.
.Parameter SAML
SAML token of the user.
.Parameter UserPrincipalName
UserPrincipalName of the user of Kerberos token
.Parameter KerberosTicket
Kerberos token of the user.
.Parameter UseDeviceCode
Use device code flow.
.Example
Get-AADIntAccessTokenForPTA
.Example
PS C:\>$cred=Get-Credential
PS C:\>Get-AADIntAccessTokenForPTA -Credentials $cred
#>
[cmdletbinding()]
Param(
[Parameter(ParameterSetName='Credentials',Mandatory=$False)]
[System.Management.Automation.PSCredential]$Credentials,
[Parameter(ParameterSetName='PRT',Mandatory=$True)]
[String]$PRTToken,
[Parameter(ParameterSetName='SAML',Mandatory=$True)]
[String]$SAMLToken,
[Parameter(ParameterSetName='Kerberos',Mandatory=$True)]
[String]$KerberosTicket,
[Parameter(ParameterSetName='Kerberos',Mandatory=$True)]
[String]$Domain,
[Parameter(ParameterSetName='DeviceCode',Mandatory=$True)]
[switch]$UseDeviceCode,
[Parameter(ParameterSetName='MSAL',Mandatory=$True)]
[switch]$UseMSAL,
[switch]$SaveToCache,
[Parameter(Mandatory=$False)]
[string]$OTPSecretKey,
[Parameter(Mandatory=$False)]
[string]$TAP,
# PRT + SessionKey
[Parameter(ParameterSetName='PRT_Skey',Mandatory=$True)]
[Parameter(ParameterSetName='PRT_Settings',Mandatory=$False)]
[String]$RefreshToken,
[Parameter(ParameterSetName='PRT_Skey',Mandatory=$True)]
[Parameter(ParameterSetName='PRT_Settings',Mandatory=$False)]
[Parameter(Mandatory=$False)]
[String]$SessionKey,
[Parameter(ParameterSetName='PRT_Skey',Mandatory=$False)]
[Parameter(ParameterSetName='PRT_Settings',Mandatory=$True)]
[Parameter(Mandatory=$False)]
$Settings,
# Continuous Access Evaluation
[Parameter(Mandatory=$False)]
[switch]$CAE,
# ESTS
[Parameter(ParameterSetName='ESTS',Mandatory=$True)]
[string]$ESTSAUTH
)
Process
{
Get-AccessToken -Credentials $Credentials -Resource "https://proxy.cloudwebappproxy.net/registerapp" -ClientId "cb1056e2-e479-49de-ae31-7812af012ed8" -SAMLToken $SAMLToken -KerberosTicket $KerberosTicket -Domain $Domain -SaveToCache $SaveToCache -PRTToken $PRTToken -UseDeviceCode $UseDeviceCode -OTPSecretKey $OTPSecretKey -TAP $TAP -UseMSAL $UseMSAL -RefreshToken $RefreshToken -SessionKey $SessionKey -Settings $Settings -CAE $CAE -ESTSAUTH $ESTSAUTH
}
}
# Gets the access token for Office Apps
function Get-AccessTokenForOfficeApps
{
<#
.SYNOPSIS
Gets OAuth Access Token for Office Apps
.DESCRIPTION
Gets OAuth Access Token for Office Apps.
.Parameter Credentials
Credentials of the user.
.Parameter PRT
PRT token of the user.
.Parameter SAML
SAML token of the user.
.Parameter UserPrincipalName
UserPrincipalName of the user of Kerberos token
.Parameter KerberosTicket
Kerberos token of the user.
.Parameter UseDeviceCode
Use device code flow.
.Example
Get-AADIntAccessTokenForOfficeApps
.Example
PS C:\>$cred=Get-Credential
PS C:\>Get-AADIntAccessTokenForOfficeApps -Credentials $cred
#>
[cmdletbinding()]
Param(
[Parameter(ParameterSetName='Credentials',Mandatory=$False)]
[System.Management.Automation.PSCredential]$Credentials,
[Parameter(ParameterSetName='PRT',Mandatory=$True)]
[String]$PRTToken,
[Parameter(ParameterSetName='SAML',Mandatory=$True)]
[String]$SAMLToken,
[Parameter(ParameterSetName='Kerberos',Mandatory=$True)]
[String]$KerberosTicket,
[Parameter(ParameterSetName='Kerberos',Mandatory=$True)]
[String]$Domain,
[Parameter(ParameterSetName='DeviceCode',Mandatory=$True)]
[switch]$UseDeviceCode,
[Parameter(ParameterSetName='MSAL',Mandatory=$True)]
[switch]$UseMSAL,
[switch]$SaveToCache,
[Parameter(Mandatory=$False)]
[string]$OTPSecretKey,
[Parameter(Mandatory=$False)]
[string]$TAP,
# PRT + SessionKey
[Parameter(ParameterSetName='PRT_Skey',Mandatory=$True)]
[Parameter(ParameterSetName='PRT_Settings',Mandatory=$False)]
[String]$RefreshToken,
[Parameter(ParameterSetName='PRT_Skey',Mandatory=$True)]
[Parameter(ParameterSetName='PRT_Settings',Mandatory=$False)]
[Parameter(Mandatory=$False)]
[String]$SessionKey,
[Parameter(ParameterSetName='PRT_Skey',Mandatory=$False)]
[Parameter(ParameterSetName='PRT_Settings',Mandatory=$True)]
[Parameter(Mandatory=$False)]
$Settings,
# Continuous Access Evaluation
[Parameter(Mandatory=$False)]
[switch]$CAE,
# ESTS
[Parameter(ParameterSetName='ESTS',Mandatory=$True)]
[string]$ESTSAUTH
)
Process
{
Get-AccessToken -Credentials $Credentials -Resource "https://officeapps.live.com" -ClientId "1b730954-1685-4b74-9bfd-dac224a7b894" -SAMLToken $SAMLToken -KerberosTicket $KerberosTicket -Domain $Domain -SaveToCache $SaveToCache -PRTToken $PRTToken -UseDeviceCode $UseDeviceCode -OTPSecretKey $OTPSecretKey -TAP $TAP -UseMSAL $UseMSAL -RefreshToken $RefreshToken -SessionKey $SessionKey -Settings $Settings -CAE $CAE -ESTSAUTH $ESTSAUTH
}
}
# Gets the access token for Exchange Online
function Get-AccessTokenForEXO
{
<#
.SYNOPSIS
Gets OAuth Access Token for Exchange Online
.DESCRIPTION
Gets OAuth Access Token for Exchange Online
.Parameter Credentials
Credentials of the user.
.Parameter PRT
PRT token of the user.
.Parameter SAML
SAML token of the user.
.Parameter UserPrincipalName
UserPrincipalName of the user of Kerberos token
.Parameter KerberosTicket
Kerberos token of the user.
.Parameter UseDeviceCode
Use device code flow.
.Example
Get-AADIntAccessTokenForEXO
.Example
PS C:\>$cred=Get-Credential
PS C:\>Get-AADIntAccessTokenForEXO -Credentials $cred
#>
[cmdletbinding()]
Param(
[Parameter(ParameterSetName='Credentials',Mandatory=$False)]
[System.Management.Automation.PSCredential]$Credentials,
[Parameter(ParameterSetName='PRT',Mandatory=$True)]
[String]$PRTToken,
[Parameter(ParameterSetName='SAML',Mandatory=$True)]
[String]$SAMLToken,
[Parameter(ParameterSetName='Kerberos',Mandatory=$True)]
[String]$KerberosTicket,
[Parameter(ParameterSetName='Kerberos',Mandatory=$True)]
[String]$Domain,
[Parameter(ParameterSetName='DeviceCode',Mandatory=$True)]
[switch]$UseDeviceCode,
[Parameter(ParameterSetName='MSAL',Mandatory=$True)]
[switch]$UseMSAL,
[switch]$SaveToCache,
[Parameter(Mandatory=$False)]
[ValidateSet("https://graph.microsoft.com","https://outlook.office365.com","https://outlook.office.com","https://substrate.office.com")]
[String]$Resource="https://outlook.office365.com",
[Parameter(Mandatory=$False)]
[string]$OTPSecretKey,
[Parameter(Mandatory=$False)]
[string]$TAP,
# PRT + SessionKey
[Parameter(ParameterSetName='PRT_Skey',Mandatory=$True)]
[Parameter(ParameterSetName='PRT_Settings',Mandatory=$False)]
[String]$RefreshToken,
[Parameter(ParameterSetName='PRT_Skey',Mandatory=$True)]
[Parameter(ParameterSetName='PRT_Settings',Mandatory=$False)]
[Parameter(Mandatory=$False)]
[String]$SessionKey,
[Parameter(ParameterSetName='PRT_Skey',Mandatory=$False)]
[Parameter(ParameterSetName='PRT_Settings',Mandatory=$True)]
[Parameter(Mandatory=$False)]
$Settings,
# Continuous Access Evaluation
[Parameter(Mandatory=$False)]
[switch]$CAE,
# ESTS
[Parameter(ParameterSetName='ESTS',Mandatory=$True)]
[string]$ESTSAUTH
)
Process
{
# Office app has the required rights to Exchange Online
Get-AccessToken -Credentials $Credentials -Resource $Resource -ClientId "d3590ed6-52b3-4102-aeff-aad2292ab01c" -SAMLToken $SAMLToken -KerberosTicket $KerberosTicket -Domain $Domain -SaveToCache $SaveToCache -PRTToken $PRTToken -UseDeviceCode $UseDeviceCode -OTPSecretKey $OTPSecretKey -TAP $TAP -UseMSAL $UseMSAL -RefreshToken $RefreshToken -SessionKey $SessionKey -Settings $Settings -CAE $CAE -ESTSAUTH $ESTSAUTH
}
}
# Gets the access token for Exchange Online remote PowerShell
function Get-AccessTokenForEXOPS
{
<#
.SYNOPSIS
Gets OAuth Access Token for Exchange Online remote PowerShell
.DESCRIPTION
Gets OAuth Access Token for Exchange Online remote PowerShell
.Parameter Credentials
Credentials of the user.
.Parameter PRT
PRT token of the user.
.Parameter SAML
SAML token of the user.
.Parameter UserPrincipalName
UserPrincipalName of the user of Kerberos token
.Parameter KerberosTicket
Kerberos token of the user.
.Parameter UseDeviceCode
Use device code flow.
.Parameter Certificate
x509 device certificate.
.Example
Get-AADIntAccessTokenForEXOPS
.Example
PS C:\>$cred=Get-Credential
PS C:\>Get-AADIntAccessTokenForEXOPS -Credentials $cred
#>
[cmdletbinding()]
Param(
[Parameter(ParameterSetName='Credentials',Mandatory=$False)]
[System.Management.Automation.PSCredential]$Credentials,
[Parameter(ParameterSetName='PRT',Mandatory=$True)]
[String]$PRTToken,
[Parameter(ParameterSetName='SAML',Mandatory=$True)]
[String]$SAMLToken,
[Parameter(ParameterSetName='Kerberos',Mandatory=$True)]
[String]$KerberosTicket,
[Parameter(ParameterSetName='Kerberos',Mandatory=$True)]
[String]$Domain,
[Parameter(ParameterSetName='DeviceCode',Mandatory=$True)]
[switch]$UseDeviceCode,
[Parameter(ParameterSetName='MSAL',Mandatory=$True)]
[switch]$UseMSAL,
[switch]$SaveToCache,
[Parameter(Mandatory=$False)]
[System.Security.Cryptography.X509Certificates.X509Certificate2]$Certificate,
[Parameter(Mandatory=$False)]
[string]$PfxFileName,
[Parameter(Mandatory=$False)]
[string]$PfxPassword,
[Parameter(Mandatory=$False)]
[string]$OTPSecretKey,
[Parameter(Mandatory=$False)]
[string]$TAP,
# PRT + SessionKey
[Parameter(ParameterSetName='PRT_Skey',Mandatory=$True)]
[Parameter(ParameterSetName='PRT_Settings',Mandatory=$False)]
[String]$RefreshToken,
[Parameter(ParameterSetName='PRT_Skey',Mandatory=$True)]
[Parameter(ParameterSetName='PRT_Settings',Mandatory=$False)]
[Parameter(Mandatory=$False)]
[String]$SessionKey,
[Parameter(ParameterSetName='PRT_Skey',Mandatory=$False)]
[Parameter(ParameterSetName='PRT_Settings',Mandatory=$True)]
[Parameter(Mandatory=$False)]
$Settings,
# Continuous Access Evaluation
[Parameter(Mandatory=$False)]
[switch]$CAE,
# ESTS
[Parameter(ParameterSetName='ESTS',Mandatory=$True)]
[string]$ESTSAUTH
)
Process
{
# Office app has the required rights to Exchange Online
Get-AccessToken -Credentials $Credentials -Resource "https://outlook.office365.com" -ClientId "a0c73c16-a7e3-4564-9a95-2bdf47383716" -SAMLToken $SAMLToken -KerberosTicket $KerberosTicket -SaveToCache $SaveToCache -PRTToken $PRTToken -UseDeviceCode $UseDeviceCode -Domain $Domain -OTPSecretKey $OTPSecretKey -TAP $TAP -UseMSAL $UseMSAL -RefreshToken $RefreshToken -SessionKey $SessionKey -Settings $Settings -CAE $CAE -ESTSAUTH $ESTSAUTH
}
}
# Gets the access token for SARA
# Jul 8th 2019
function Get-AccessTokenForSARA
{
<#
.SYNOPSIS
Gets OAuth Access Token for SARA
.DESCRIPTION
Gets OAuth Access Token for Microsoft Support and Recovery Assistant (SARA)
.Parameter KerberosTicket
Kerberos token of the user.
.Parameter UserPrincipalName
UserPrincipalName of the user of Kerberos token.
.Example
Get-AADIntAccessTokenForSARA
.Example
PS C:\>$cred=Get-Credential
PS C:\>Get-AADIntAccessTokenForSARA -Credentials $cred
#>
[cmdletbinding()]
Param(
[Parameter(ParameterSetName='Credentials',Mandatory=$False)]
[System.Management.Automation.PSCredential]$Credentials,
[Parameter(ParameterSetName='PRT',Mandatory=$True)]
[String]$PRTToken,
[Parameter(ParameterSetName='SAML',Mandatory=$True)]
[String]$SAMLToken,
[Parameter(ParameterSetName='Kerberos',Mandatory=$True)]
[String]$KerberosTicket,
[Parameter(ParameterSetName='Kerberos',Mandatory=$True)]
[String]$Domain,
[Parameter(ParameterSetName='DeviceCode',Mandatory=$True)]
[switch]$UseDeviceCode,
[Parameter(ParameterSetName='MSAL',Mandatory=$True)]
[switch]$UseMSAL,
[switch]$SaveToCache,
[Parameter(Mandatory=$False)]
[string]$OTPSecretKey,
[Parameter(Mandatory=$False)]
[string]$TAP,
# PRT + SessionKey
[Parameter(ParameterSetName='PRT_Skey',Mandatory=$True)]
[Parameter(ParameterSetName='PRT_Settings',Mandatory=$False)]
[String]$RefreshToken,
[Parameter(ParameterSetName='PRT_Skey',Mandatory=$True)]
[Parameter(ParameterSetName='PRT_Settings',Mandatory=$False)]
[Parameter(Mandatory=$False)]
[String]$SessionKey,
[Parameter(ParameterSetName='PRT_Skey',Mandatory=$False)]
[Parameter(ParameterSetName='PRT_Settings',Mandatory=$True)]
[Parameter(Mandatory=$False)]
$Settings,
# Continuous Access Evaluation
[Parameter(Mandatory=$False)]
[switch]$CAE,
# ESTS
[Parameter(ParameterSetName='ESTS',Mandatory=$True)]
[string]$ESTSAUTH
)
Process
{
# Office app has the required rights to Exchange Online
Get-AccessToken -Resource "https://api.diagnostics.office.com" -ClientId "d3590ed6-52b3-4102-aeff-aad2292ab01c" -KerberosTicket $KerberosTicket -Domain $Domain -Credentials $Credentials -SaveToCache $SaveToCache -PRTToken $PRTToken -UseDeviceCode $UseDeviceCode -OTPSecretKey $OTPSecretKey -TAP $TAP -UseMSAL $UseMSAL -RefreshToken $RefreshToken -SessionKey $SessionKey -Settings $Settings -CAE $CAE -ESTSAUTH $ESTSAUTH
}
}
# Gets an access token for OneDrive
# Nov 26th 2019
function Get-AccessTokenForOneDrive
{
<#
.SYNOPSIS
Gets OAuth Access Token for OneDrive
.DESCRIPTION
Gets OAuth Access Token for OneDrive Sync client
.Parameter Credentials
Credentials of the user.
.Parameter PRT
PRT token of the user.
.Parameter SAML
SAML token of the user.
.Parameter UserPrincipalName
UserPrincipalName of the user of Kerberos token
.Parameter KerberosTicket
Kerberos token of the user.
.Parameter UseDeviceCode
Use device code flow.
.Example
Get-AADIntAccessTokenForOneDrive
.Example
PS C:\>$cred=Get-Credential
PS C:\>Get-AADIntAccessTokenForOneDrive -Tenant "company" -Credentials $cred
#>
[cmdletbinding()]
Param(
[Parameter(Mandatory=$False)]
[String]$Tenant="Common",
[Parameter(ParameterSetName='Credentials',Mandatory=$False)]
[System.Management.Automation.PSCredential]$Credentials,
[Parameter(ParameterSetName='PRT',Mandatory=$True)]
[String]$PRTToken,
[Parameter(ParameterSetName='SAML',Mandatory=$True)]
[String]$SAMLToken,
[Parameter(ParameterSetName='Kerberos',Mandatory=$True)]
[String]$KerberosTicket,
[Parameter(ParameterSetName='Kerberos',Mandatory=$True)]
[String]$Domain,
[Parameter(ParameterSetName='DeviceCode',Mandatory=$True)]
[switch]$UseDeviceCode,
[Parameter(ParameterSetName='MSAL',Mandatory=$True)]
[switch]$UseMSAL,
[switch]$SaveToCache,
[Parameter(Mandatory=$False)]
[string]$OTPSecretKey,
[Parameter(Mandatory=$False)]
[string]$TAP,
# PRT + SessionKey
[Parameter(ParameterSetName='PRT_Skey',Mandatory=$True)]
[Parameter(ParameterSetName='PRT_Settings',Mandatory=$False)]
[String]$RefreshToken,
[Parameter(ParameterSetName='PRT_Skey',Mandatory=$True)]
[Parameter(ParameterSetName='PRT_Settings',Mandatory=$False)]
[Parameter(Mandatory=$False)]
[String]$SessionKey,
[Parameter(ParameterSetName='PRT_Skey',Mandatory=$False)]
[Parameter(ParameterSetName='PRT_Settings',Mandatory=$True)]
[Parameter(Mandatory=$False)]
$Settings,
# Continuous Access Evaluation
[Parameter(Mandatory=$False)]
[switch]$CAE,
# ESTS
[Parameter(ParameterSetName='ESTS',Mandatory=$True)]
[string]$ESTSAUTH
)
Process
{
Get-AccessToken -Resource "https://$Tenant-my.sharepoint.com/" -ClientId "ab9b8c07-8f02-4f72-87fa-80105867a763" -KerberosTicket $KerberosTicket -Domain $Domain -SAMLToken $SAMLToken -Credentials $Credentials -SaveToCache $SaveToCache -PRTToken $PRTToken -UseDeviceCode $UseDeviceCode -OTPSecretKey $OTPSecretKey -TAP $TAP -UseMSAL $UseMSAL -RefreshToken $RefreshToken -SessionKey $SessionKey -Settings $Settings -CAE $CAE -ESTSAUTH $ESTSAUTH
}
}
# Gets an access token for Azure Core Management
# May 29th 2020
function Get-AccessTokenForAzureCoreManagement
{
<#
.SYNOPSIS
Gets OAuth Access Token for Azure Core Management
.DESCRIPTION
Gets OAuth Access Token for Azure Core Management
.Parameter Credentials
Credentials of the user.
.Parameter PRT
PRT token of the user.
.Parameter SAML
SAML token of the user.
.Parameter UserPrincipalName
UserPrincipalName of the user of Kerberos token
.Parameter KerberosTicket
Kerberos token of the user.
.Parameter UseDeviceCode
Use device code flow.
.Parameter UserPrincipalName
UserPrincipalName of the user of Kerberos token
.Example
Get-AADIntAccessTokenForOneOfficeApps
.Example
PS C:\>$cred=Get-Credential
PS C:\>Get-AADIntAccessTokenForAzureCoreManagement -Credentials $cred
#>
[cmdletbinding()]
Param(
[Parameter(ParameterSetName='Credentials',Mandatory=$False)]
[System.Management.Automation.PSCredential]$Credentials,
[Parameter(ParameterSetName='PRT',Mandatory=$True)]
[String]$PRTToken,
[Parameter(ParameterSetName='SAML',Mandatory=$True)]
[String]$SAMLToken,
[Parameter(ParameterSetName='Kerberos',Mandatory=$True)]
[String]$KerberosTicket,
[Parameter(ParameterSetName='Kerberos',Mandatory=$True)]
[String]$Domain,
[Parameter(ParameterSetName='DeviceCode',Mandatory=$True)]
[switch]$UseDeviceCode,
[Parameter(ParameterSetName='MSAL',Mandatory=$True)]
[switch]$UseMSAL,
[switch]$SaveToCache,
[Parameter(Mandatory=$False)]
[String]$Tenant,
[Parameter(Mandatory=$False)]
[string]$OTPSecretKey,
[Parameter(Mandatory=$False)]
[string]$TAP,
# PRT + SessionKey
[Parameter(ParameterSetName='PRT_Skey',Mandatory=$True)]
[Parameter(ParameterSetName='PRT_Settings',Mandatory=$False)]
[String]$RefreshToken,
[Parameter(ParameterSetName='PRT_Skey',Mandatory=$True)]
[Parameter(ParameterSetName='PRT_Settings',Mandatory=$False)]
[Parameter(Mandatory=$False)]
[String]$SessionKey,
[Parameter(ParameterSetName='PRT_Skey',Mandatory=$False)]
[Parameter(ParameterSetName='PRT_Settings',Mandatory=$True)]
[Parameter(Mandatory=$False)]
$Settings,
# Continuous Access Evaluation
[Parameter(Mandatory=$False)]
[switch]$CAE,
# ESTS
[Parameter(ParameterSetName='ESTS',Mandatory=$True)]
[string]$ESTSAUTH
)
Process
{
Get-AccessToken -Resource "https://management.core.windows.net/" -ClientId "d3590ed6-52b3-4102-aeff-aad2292ab01c" -KerberosTicket $KerberosTicket -Domain $Domain -SAMLToken $SAMLToken -Credentials $Credentials -SaveToCache $SaveToCache -Tenant $Tenant -PRTToken $PRTToken -UseDeviceCode $UseDeviceCode -OTPSecretKey $OTPSecretKey -TAP $TAP -UseMSAL $UseMSAL -RefreshToken $RefreshToken -SessionKey $SessionKey -Settings $Settings -CAE $CAE -ESTSAUTH $ESTSAUTH
}
}
# Gets an access token for SPO
# Jun 10th 2020
function Get-AccessTokenForSPO
{
<#
.SYNOPSIS
Gets OAuth Access Token for SharePoint Online
.DESCRIPTION
Gets OAuth Access Token for SharePoint Online Management Shell, which can be used with any SPO requests.
.Parameter Credentials
Credentials of the user.
.Parameter PRT
PRT token of the user.
.Parameter SAML
SAML token of the user.
.Parameter UserPrincipalName
UserPrincipalName of the user of Kerberos token
.Parameter KerberosTicket
Kerberos token of the user.
.Parameter UseDeviceCode
Use device code flow.
.Parameter UserPrincipalName
UserPrincipalName of the user of Kerberos token
.Parameter Tenant
The tenant name of the organization, ie. company.onmicrosoft.com -> "company"
.Parameter Admin
Get the token for admin portal
.Example
Get-AADIntAccessTokenForSPO
.Example
PS C:\>$cred=Get-Credential
PS C:\>Get-AADIntAccessTokenForSPO -Credentials $cred -Tenant "company"
#>
[cmdletbinding()]
Param(
[Parameter(ParameterSetName='Credentials',Mandatory=$False)]
[System.Management.Automation.PSCredential]$Credentials,
[Parameter(ParameterSetName='PRT',Mandatory=$True)]
[String]$PRTToken,
[Parameter(ParameterSetName='SAML',Mandatory=$True)]
[String]$SAMLToken,
[Parameter(ParameterSetName='Kerberos',Mandatory=$True)]
[String]$KerberosTicket,
[Parameter(ParameterSetName='Kerberos',Mandatory=$True)]
[String]$Domain,
[Parameter(ParameterSetName='DeviceCode',Mandatory=$True)]
[switch]$UseDeviceCode,
[switch]$SaveToCache,
[Parameter(Mandatory=$False)]
[string]$OTPSecretKey,
[Parameter(Mandatory=$False)]
[string]$TAP,
# PRT + SessionKey
[Parameter(ParameterSetName='PRT_Skey',Mandatory=$True)]
[Parameter(ParameterSetName='PRT_Settings',Mandatory=$False)]
[String]$RefreshToken,
[Parameter(ParameterSetName='PRT_Skey',Mandatory=$True)]
[Parameter(ParameterSetName='PRT_Settings',Mandatory=$False)]
[Parameter(Mandatory=$False)]
[String]$SessionKey,
[Parameter(ParameterSetName='PRT_Skey',Mandatory=$False)]
[Parameter(ParameterSetName='PRT_Settings',Mandatory=$True)]
[Parameter(Mandatory=$False)]
$Settings,
# Continuous Access Evaluation
[Parameter(Mandatory=$False)]
[switch]$CAE,
# ESTS
[Parameter(ParameterSetName='ESTS',Mandatory=$True)]
[string]$ESTSAUTH
)
Process
{
# Get access and refresh tokens
#$clientId = "fdd7719f-d61e-4592-b501-793734eb8a0e" # SharePoint Migration Tool
#$clientId = "9bc3ab49-b65d-410a-85ad-de819febfddc" # SPO Management shell
$clientId = "d3590ed6-52b3-4102-aeff-aad2292ab01c" # Microsoft Office
$graphTokens = Get-AccessToken -Resource "https://graph.microsoft.com" -ClientId $clientId -KerberosTicket $KerberosTicket -Domain $Domain -SAMLToken $SAMLToken -Credentials $Credentials -Tenant $Tenant -PRTToken $PRTToken -UseDeviceCode $UseDeviceCode -IncludeRefreshToken $True -OTPSecretKey $OTPSecretKey -TAP $TAP -RefreshToken $RefreshToken -SessionKey $SessionKey -Settings $Settings -CAE $CAE -ESTSAUTH $ESTSAUTH
# Get SPO root site url
$response = Call-MSGraphAPI -AccessToken $graphTokens[0] -ApiVersion Beta -API "sites/root" -QueryString "select=webUrl"
$SPOUrl = $response.webUrl.TrimEnd("/")
$tenant = $SPOUrl.Split(".")[0]
# Get SPO tokens
$SPOtokens = Get-AccessTokenWithRefreshToken -Resource "$($tenant).sharepoint.com" -ClientId $clientId -RefreshToken $graphTokens[1] -IncludeRefreshToken $true -TenantId "Common"
$SPOtokens_my = Get-AccessTokenWithRefreshToken -Resource "$($tenant)-my.sharepoint.com" -ClientId $clientId -RefreshToken $graphTokens[1] -IncludeRefreshToken $true -TenantId "Common"
$SPOtokens_admin = Get-AccessTokenWithRefreshToken -Resource "$($tenant)-admin.sharepoint.com" -ClientId $clientId -RefreshToken $graphTokens[1] -IncludeRefreshToken $true -TenantId "Common"
if($SaveToCache)
{
# Add tokens to cache
Add-AccessTokenToCache -AccessToken $graphTokens[0] -RefreshToken $graphTokens[1] -ShowCache $false
Add-AccessTokenToCache -AccessToken $SPOtokens[0] -RefreshToken $SPOtokens[1] -ShowCache $false
Add-AccessTokenToCache -AccessToken $SPOtokens_my[0] -RefreshToken $SPOtokens_my[1] -ShowCache $false
Add-AccessTokenToCache -AccessToken $SPOtokens_admin[0] -RefreshToken $SPOtokens_admin[1] -ShowCache $false
}
else
{
return @($SPOtokens[0],$SPOtokens_my[0],$SPOtokens_admin[0])
}
}
}
# Gets the access token for My Signins
# Jul 1st 2020
function Get-AccessTokenForMySignins
{
<#
.SYNOPSIS
Gets OAuth Access Token for My Signins
.DESCRIPTION
Gets OAuth Access Token for My Signins, which is used for example when registering MFA.
.Parameter Credentials
Credentials of the user.
.Example
PS C:\>Get-AADIntAccessTokenForMySignins
#>
[cmdletbinding()]
Param(
[Parameter(ParameterSetName='Credentials',Mandatory=$False)]
[System.Management.Automation.PSCredential]$Credentials,
[switch]$SaveToCache,
[Parameter(ParameterSetName='Kerberos',Mandatory=$True)]
[String]$KerberosTicket,
[Parameter(ParameterSetName='Kerberos',Mandatory=$True)]
[String]$Domain,
[Parameter(ParameterSetName='MSAL',Mandatory=$True)]
[switch]$UseMSAL,
[Parameter(Mandatory=$False)]
[string]$OTPSecretKey,
[Parameter(Mandatory=$False)]
[string]$TAP,
# PRT + SessionKey
[Parameter(ParameterSetName='PRT_Skey',Mandatory=$True)]
[Parameter(ParameterSetName='PRT_Settings',Mandatory=$False)]
[String]$RefreshToken,
[Parameter(ParameterSetName='PRT_Skey',Mandatory=$True)]
[Parameter(ParameterSetName='PRT_Settings',Mandatory=$False)]
[Parameter(Mandatory=$False)]
[String]$SessionKey,
[Parameter(ParameterSetName='PRT_Skey',Mandatory=$False)]
[Parameter(ParameterSetName='PRT_Settings',Mandatory=$True)]
[Parameter(Mandatory=$False)]
$Settings,
# Continuous Access Evaluation
[Parameter(Mandatory=$False)]
[switch]$CAE,
# ESTS
[Parameter(ParameterSetName='ESTS',Mandatory=$True)]
[string]$ESTSAUTH
)
Process
{
Get-AccessToken -ClientId 1b730954-1685-4b74-9bfd-dac224a7b894 -Resource "0000000c-0000-0000-c000-000000000000" -ForceMFA $true -Credentials $Credentials -SaveToCache $SaveToCache -KerberosTicket $KerberosTicket -Domain $Domain -OTPSecretKey $OTPSecretKey -TAP $TAP -UseMSAL $UseMSAL -RefreshToken $RefreshToken -SessionKey $SessionKey -Settings $Settings -CAE $CAE -ESTSAUTH $ESTSAUTH
}
}
# Gets an access token for Azure AD Join
# Aug 26th 2020
function Get-AccessTokenForAADJoin
{
<#
.SYNOPSIS
Gets OAuth Access Token for Azure AD Join
.DESCRIPTION
Gets OAuth Access Token for Azure AD Join, allowing users' to register devices to Azure AD.
.Parameter Credentials
Credentials of the user.
.Parameter PRT
PRT token of the user.
.Parameter SAML
SAML token of the user.
.Parameter UserPrincipalName
UserPrincipalName of the user of Kerberos token
.Parameter KerberosTicket
Kerberos token of the user.
.Parameter UseDeviceCode
Use device code flow.
.Parameter BPRT
Bulk PRT token, can be created with New-AADIntBulkPRTToken
.Parameter UserPrincipalName
UserPrincipalName of the user of Kerberos token
.Parameter Tenant
The tenant name of the organization, ie. company.onmicrosoft.com -> "company"
.Example
Get-AADIntAccessTokenForAADJoin
.Example
PS C:\>$cred=Get-Credential
PS C:\>Get-AADIntAccessTokenForAADJoin -Credentials $cred
#>
[cmdletbinding()]
Param(
[Parameter(ParameterSetName='Credentials',Mandatory=$False)]
[System.Management.Automation.PSCredential]$Credentials,
[Parameter(ParameterSetName='PRT',Mandatory=$True)]
[String]$PRTToken,
[Parameter(ParameterSetName='SAML',Mandatory=$True)]
[String]$SAMLToken,
[Parameter(ParameterSetName='SAML',Mandatory=$False)]
[Switch]$Device,
[Parameter(ParameterSetName='Kerberos',Mandatory=$True)]
[String]$KerberosTicket,
[Parameter(ParameterSetName='Kerberos',Mandatory=$True)]
[String]$Domain,
[Parameter(ParameterSetName='DeviceCode',Mandatory=$True)]
[switch]$UseDeviceCode,
[Parameter(ParameterSetName='BPRT',Mandatory=$True)]
[string]$BPRT,
[Parameter(ParameterSetName='MSAL',Mandatory=$True)]
[switch]$UseMSAL,
[Parameter(Mandatory=$False)]
[String]$Tenant,
[switch]$SaveToCache,
[switch]$ForceMFA,
[Parameter(Mandatory=$False)]
[string]$OTPSecretKey,
[Parameter(Mandatory=$False)]
[string]$TAP,
# PRT + SessionKey
[Parameter(ParameterSetName='PRT_Skey',Mandatory=$True)]
[Parameter(ParameterSetName='PRT_Settings',Mandatory=$False)]
[String]$RefreshToken,
[Parameter(ParameterSetName='PRT_Skey',Mandatory=$True)]
[Parameter(ParameterSetName='PRT_Settings',Mandatory=$False)]
[Parameter(Mandatory=$False)]
[String]$SessionKey,
[Parameter(ParameterSetName='PRT_Skey',Mandatory=$False)]
[Parameter(ParameterSetName='PRT_Settings',Mandatory=$True)]
[Parameter(Mandatory=$False)]
$Settings,
# Continuous Access Evaluation
[Parameter(Mandatory=$False)]
[switch]$CAE,
# ESTS
[Parameter(ParameterSetName='ESTS',Mandatory=$True)]
[string]$ESTSAUTH
)
Process
{
if($Device)
{
Get-AccessTokenWithDeviceSAML -SAML $SAMLToken -SaveToCache $SaveToCache
}
else
{
Get-AccessToken -ClientID "1b730954-1685-4b74-9bfd-dac224a7b894" -Resource "01cb2876-7ebd-4aa4-9cc9-d28bd4d359a9" -KerberosTicket $KerberosTicket -Domain $Domain -SAMLToken $SAMLToken -Credentials $Credentials -SaveToCache $SaveToCache -PRTToken $PRTToken -UseDeviceCode $UseDeviceCode -ForceMFA $ForceMFA -BPRT $BPRT -OTPSecretKey $OTPSecretKey -TAP $TAP -UseMSAL $UseMSAL -RefreshToken $RefreshToken -SessionKey $SessionKey -Settings $Settings -CAE $CAE -ESTSAUTH $ESTSAUTH
}
}
}
# Gets an access token for Intune MDM
# Aug 26th 2020
function Get-AccessTokenForIntuneMDM
{
<#
.SYNOPSIS
Gets OAuth Access Token for Intune MDM
.DESCRIPTION
Gets OAuth Access Token for Intune MDM, allowing users' to enroll their devices to Intune.
.Parameter Credentials
Credentials of the user.
.Parameter PRT
PRT token of the user.
.Parameter SAML
SAML token of the user.
.Parameter UserPrincipalName
UserPrincipalName of the user of Kerberos token
.Parameter KerberosTicket
Kerberos token of the user.
.Parameter UseDeviceCode
Use device code flow.
.Parameter UserPrincipalName
UserPrincipalName of the user of Kerberos token
.Parameter BPRT
Bulk PRT token, can be created with New-AADIntBulkPRTToken
.Parameter Tenant
The tenant name of the organization, ie. company.onmicrosoft.com -> "company"
.Parameter Certificate
x509 device certificate.
.Parameter TransportKeyFileName
File name of the transport key
.Parameter PfxFileName
File name of the .pfx device certificate.
.Parameter PfxPassword
The password of the .pfx device certificate.
.Parameter Resource
The resource to get access token to, defaults to "https://enrollment.manage.microsoft.com/". To get access to AAD Graph API, use "https://graph.windows.net"
.Example
Get-AADIntAccessTokenForIntuneMDM
.Example
PS C:\>$cred=Get-Credential
PS C:\>Get-AADIntAccessTokenForIntuneMDM -Credentials $cred
#>
[cmdletbinding()]
Param(
[Parameter(ParameterSetName='Credentials',Mandatory=$False)]
[System.Management.Automation.PSCredential]$Credentials,
[Parameter(ParameterSetName='Credentials',Mandatory=$False)]
[switch]$ForceMFA,
[Parameter(ParameterSetName='PRT',Mandatory=$True)]
[String]$PRTToken,
[Parameter(ParameterSetName='SAML',Mandatory=$True)]
[String]$SAMLToken,
[Parameter(ParameterSetName='Kerberos',Mandatory=$True)]
[String]$KerberosTicket,
[Parameter(ParameterSetName='Kerberos',Mandatory=$True)]
[String]$Domain,
[Parameter(ParameterSetName='DeviceCode',Mandatory=$True)]
[switch]$UseDeviceCode,
[Parameter(ParameterSetName='BPRT',Mandatory=$True)]
[string]$BPRT,
[switch]$SaveToCache,
[Parameter(Mandatory=$False)]
[System.Security.Cryptography.X509Certificates.X509Certificate2]$Certificate,
[Parameter(Mandatory=$False)]
[string]$PfxFileName,
[Parameter(Mandatory=$False)]
[string]$PfxPassword,
[Parameter(Mandatory=$False)]
[string]$TransportKeyFileName,
[Parameter(Mandatory=$False)]
[string]$Resource="https://enrollment.manage.microsoft.com/",
[Parameter(Mandatory=$False)]
[string]$OTPSecretKey,
[Parameter(Mandatory=$False)]
[string]$TAP,
# PRT + SessionKey
[Parameter(ParameterSetName='PRT_Skey',Mandatory=$True)]
[Parameter(ParameterSetName='PRT_Settings',Mandatory=$False)]
[String]$RefreshToken,
[Parameter(ParameterSetName='PRT_Skey',Mandatory=$True)]
[Parameter(ParameterSetName='PRT_Settings',Mandatory=$False)]
[Parameter(Mandatory=$False)]
[String]$SessionKey,
[Parameter(ParameterSetName='PRT_Skey',Mandatory=$False)]
[Parameter(ParameterSetName='PRT_Settings',Mandatory=$True)]
[Parameter(Mandatory=$False)]
$Settings,
# Continuous Access Evaluation
[Parameter(Mandatory=$False)]
[switch]$CAE,
# ESTS
[Parameter(ParameterSetName='ESTS',Mandatory=$True)]
[string]$ESTSAUTH
)
Process
{
Get-AccessToken -ClientId "29d9ed98-a469-4536-ade2-f981bc1d605e" -Resource $Resource -KerberosTicket $KerberosTicket -Domain $Domain -SAMLToken $SAMLToken -Credentials $Credentials -SaveToCache $SaveToCache -PRTToken $PRTToken -UseDeviceCode $UseDeviceCode -Certificate $Certificate -PfxFileName $PfxFileName -PfxPassword $PfxPassword -BPRT $BPRT -ForceMFA $ForceMFA -TransportKeyFileName $TransportKeyFileName -OTPSecretKey $OTPSecretKey -TAP $TAP -RefreshToken $RefreshToken -SessionKey $SessionKey -Settings $Settings -CAE $CAE -ESTSAUTH $ESTSAUTH
}
}
# Gets an access token for Azure Cloud Shell
# Sep 9th 2020
function Get-AccessTokenForCloudShell
{
<#
.SYNOPSIS
Gets OAuth Access Token for Azure Cloud Shell
.DESCRIPTION
Gets OAuth Access Token for Azure Cloud Shell
.Parameter Credentials
Credentials of the user.
.Parameter PRT
PRT token of the user.
.Parameter SAML
SAML token of the user.
.Parameter UserPrincipalName
UserPrincipalName of the user of Kerberos token
.Parameter KerberosTicket
Kerberos token of the user.
.Parameter UseDeviceCode
Use device code flow.
.Parameter UserPrincipalName
UserPrincipalName of the user of Kerberos token
.Example
Get-AADIntAccessTokenForOneOfficeApps
.Example
PS C:\>$cred=Get-Credential
PS C:\>Get-AADIntAccessTokenForCloudShell -Credentials $cred
#>
[cmdletbinding()]
Param(
[Parameter(ParameterSetName='Credentials',Mandatory=$False)]
[System.Management.Automation.PSCredential]$Credentials,
[Parameter(ParameterSetName='PRT',Mandatory=$True)]
[String]$PRTToken,
[Parameter(ParameterSetName='SAML',Mandatory=$True)]
[String]$SAMLToken,
[Parameter(ParameterSetName='Kerberos',Mandatory=$True)]
[String]$KerberosTicket,
[Parameter(ParameterSetName='Kerberos',Mandatory=$True)]
[String]$Domain,
[Parameter(ParameterSetName='DeviceCode',Mandatory=$True)]
[switch]$UseDeviceCode,
[Parameter(ParameterSetName='MSAL',Mandatory=$True)]
[switch]$UseMSAL,
[switch]$SaveToCache,
[Parameter(Mandatory=$False)]
[String]$Tenant,
[Parameter(Mandatory=$False)]
[string]$OTPSecretKey,
[Parameter(Mandatory=$False)]
[string]$TAP,
# PRT + SessionKey
[Parameter(ParameterSetName='PRT_Skey',Mandatory=$True)]
[Parameter(ParameterSetName='PRT_Settings',Mandatory=$False)]
[String]$RefreshToken,
[Parameter(ParameterSetName='PRT_Skey',Mandatory=$True)]
[Parameter(ParameterSetName='PRT_Settings',Mandatory=$False)]
[Parameter(Mandatory=$False)]
[String]$SessionKey,
[Parameter(ParameterSetName='PRT_Skey',Mandatory=$False)]
[Parameter(ParameterSetName='PRT_Settings',Mandatory=$True)]
[Parameter(Mandatory=$False)]
$Settings,
# Continuous Access Evaluation
[Parameter(Mandatory=$False)]
[switch]$CAE,
# ESTS
[Parameter(ParameterSetName='ESTS',Mandatory=$True)]
[string]$ESTSAUTH
)
Process
{
# First, get an access token for admin.microsoft.com
$response = Get-AccessToken -Resource "https://admin.microsoft.com" -ClientId "d3590ed6-52b3-4102-aeff-aad2292ab01c" -KerberosTicket $KerberosTicket -Domain $Domain -SAMLToken $SAMLToken -Credentials $Credentials -SaveToCache $SaveToCache -Tenant $Tenant -PRTToken $PRTToken -UseDeviceCode $UseDeviceCode -OTPSecretKey $OTPSecretKey -TAP $TAP -UseMSAL $UseMSAL -RefreshToken $RefreshToken -SessionKey $SessionKey -Settings $Settings -CAE $CAE -ESTSAUTH $ESTSAUTH
if([string]::IsNullOrEmpty($response.Tenant))
{
$access_token = $response
}
# Get access token for management.core.windows.net using Admin API
Get-AccessTokenUsingAdminAPI -AccessToken $access_token -Resource "https://management.core.windows.net/" -SaveToCache $SaveToCache -RefreshToken $RefreshToken -SessionKey $SessionKey -Settings $Settings -CAE $CAE
}
}
# Gets an access token for Teams
# Oct 3rd 2020
function Get-AccessTokenForTeams
{
<#
.SYNOPSIS
Gets OAuth Access Token for Teams
.DESCRIPTION
Gets OAuth Access Token for Teams
.Parameter Credentials
Credentials of the user.
.Parameter PRT
PRT token of the user.
.Parameter SAML
SAML token of the user.
.Parameter UserPrincipalName
UserPrincipalName of the user of Kerberos token
.Parameter KerberosTicket
Kerberos token of the user.
.Parameter UseDeviceCode
Use device code flow.
.Parameter UserPrincipalName
UserPrincipalName of the user of Kerberos token
.Example
Get-AADIntAccessTokenForTeams
.Example
PS C:\>Get-AADIntAccessTokenForTeams -SaveToCache
#>
[cmdletbinding()]
Param(
[Parameter(ParameterSetName='Credentials',Mandatory=$False)]
[System.Management.Automation.PSCredential]$Credentials,
[Parameter(ParameterSetName='PRT',Mandatory=$True)]
[String]$PRTToken,
[Parameter(ParameterSetName='SAML',Mandatory=$True)]
[String]$SAMLToken,
[Parameter(ParameterSetName='Kerberos',Mandatory=$True)]
[String]$KerberosTicket,
[Parameter(ParameterSetName='Kerberos',Mandatory=$True)]
[String]$Domain,
[Parameter(ParameterSetName='DeviceCode',Mandatory=$True)]
[switch]$UseDeviceCode,
[Parameter(ParameterSetName='MSAL',Mandatory=$True)]
[switch]$UseMSAL,
[switch]$SaveToCache,
[Parameter(Mandatory=$False)]
[String]$Tenant,
[Parameter(Mandatory=$False)]
[ValidateSet("https://api.spaces.skype.com", "https://outlook.com", "https://*.microsoftstream.com", "https://graph.microsoft.com")]
[String]$Resource="https://api.spaces.skype.com",
[Parameter(Mandatory=$False)]
[string]$OTPSecretKey,
[Parameter(Mandatory=$False)]
[string]$TAP,
# PRT + SessionKey
[Parameter(ParameterSetName='PRT_Skey',Mandatory=$True)]
[Parameter(ParameterSetName='PRT_Settings',Mandatory=$False)]
[String]$RefreshToken,
[Parameter(ParameterSetName='PRT_Skey',Mandatory=$True)]
[Parameter(ParameterSetName='PRT_Settings',Mandatory=$False)]
[Parameter(Mandatory=$False)]
[String]$SessionKey,
[Parameter(ParameterSetName='PRT_Skey',Mandatory=$False)]
[Parameter(ParameterSetName='PRT_Settings',Mandatory=$True)]
[Parameter(Mandatory=$False)]
$Settings,
# Continuous Access Evaluation
[Parameter(Mandatory=$False)]
[switch]$CAE,
# ESTS
[Parameter(ParameterSetName='ESTS',Mandatory=$True)]
[string]$ESTSAUTH
)
Process
{
Get-AccessToken -Resource $Resource -ClientId "1fec8e78-bce4-4aaf-ab1b-5451cc387264" -KerberosTicket $KerberosTicket -Domain $Domain -SAMLToken $SAMLToken -Credentials $Credentials -SaveToCache $SaveToCache -Tenant $Tenant -PRTToken $PRTToken -UseDeviceCode $UseDeviceCode -OTPSecretKey $OTPSecretKey -TAP $TAP -UseMSAL $UseMSAL -RefreshToken $RefreshToken -SessionKey $SessionKey -Settings $Settings -CAE $CAE -ESTSAUTH $ESTSAUTH
}
}
# Gets an access token for Azure AD Management API
# Nov 11th 2020
function Get-AccessTokenForAADIAMAPI
{
<#
.SYNOPSIS
Gets OAuth Access Token for Azure AD IAM API
.DESCRIPTION
Gets OAuth Access Token for Azure AD IAM API
.Parameter Credentials
Credentials of the user.
.Parameter PRT
PRT token of the user.
.Parameter SAML
SAML token of the user.
.Parameter UserPrincipalName
UserPrincipalName of the user of Kerberos token
.Parameter KerberosTicket
Kerberos token of the user.
.Parameter UseDeviceCode
Use device code flow.
.Parameter UserPrincipalName
UserPrincipalName of the user of Kerberos token
.Example
Get-AADIntAccessTokenForAADIAMAPI
.Example
PS C:\>Get-AADIntAccessTokenForAADIAMAPI -SaveToCache
#>
[cmdletbinding()]
Param(
[Parameter(ParameterSetName='Credentials',Mandatory=$False)]
[System.Management.Automation.PSCredential]$Credentials,
[Parameter(ParameterSetName='PRT',Mandatory=$True)]
[String]$PRTToken,
[Parameter(ParameterSetName='SAML',Mandatory=$True)]
[String]$SAMLToken,
[Parameter(ParameterSetName='Kerberos',Mandatory=$True)]
[String]$KerberosTicket,
[Parameter(ParameterSetName='Kerberos',Mandatory=$True)]
[String]$Domain,
[Parameter(ParameterSetName='DeviceCode',Mandatory=$True)]
[switch]$UseDeviceCode,
[switch]$SaveToCache,
[Parameter(Mandatory=$False)]
[String]$Tenant,
[Parameter(Mandatory=$False)]
[string]$TAP,
# PRT + SessionKey
[Parameter(ParameterSetName='PRT_Skey',Mandatory=$True)]
[Parameter(ParameterSetName='PRT_Settings',Mandatory=$False)]
[String]$RefreshToken,
[Parameter(ParameterSetName='PRT_Skey',Mandatory=$True)]
[Parameter(ParameterSetName='PRT_Settings',Mandatory=$False)]
[Parameter(Mandatory=$False)]
[String]$SessionKey,
[Parameter(ParameterSetName='PRT_Skey',Mandatory=$False)]
[Parameter(ParameterSetName='PRT_Settings',Mandatory=$True)]
[Parameter(Mandatory=$False)]
$Settings,
# Continuous Access Evaluation
[Parameter(Mandatory=$False)]
[switch]$CAE,
# ESTS
[Parameter(ParameterSetName='ESTS',Mandatory=$True)]
[string]$ESTSAUTH
)
Process
{
# First get the access token for AADGraph
$AccessTokens = Get-AccessToken -Resource "https://graph.windows.net" -ClientId "d3590ed6-52b3-4102-aeff-aad2292ab01c" -KerberosTicket $KerberosTicket -Domain $Domain -SAMLToken $SAMLToken -Credentials $Credentials -Tenant $Tenant -PRTToken $PRTToken -UseDeviceCode $UseDeviceCode -IncludeRefreshToken $True -RefreshToken $RefreshToken -SessionKey $SessionKey -Settings $Settings -CAE $CAE -ESTSAUTH $ESTSAUTH
# Get the actual token
$AccessToken = Get-AccessTokenWithRefreshToken -Resource "74658136-14ec-4630-ad9b-26e160ff0fc6" -ClientId "d3590ed6-52b3-4102-aeff-aad2292ab01c" -SaveToCache $SaveToCache -RefreshToken $AccessTokens[1] -TenantId (Read-Accesstoken $AccessTokens[0]).tid -RefreshToken $RefreshToken -SessionKey $SessionKey -Settings $Settings -CAE $CAE
if(!$SaveToCache)
{
return $AccessToken
}
}
}
# Gets an access token for MS Commerce
# Aug 27th 2021
function Get-AccessTokenForMSCommerce
{
<#
.SYNOPSIS
Gets OAuth Access Token for MS Commerce
.DESCRIPTION
Gets OAuth Access Token for MS Commerce
.Parameter Credentials
Credentials of the user.
.Parameter PRT
PRT token of the user.
.Parameter SAML
SAML token of the user.
.Parameter UserPrincipalName
UserPrincipalName of the user of Kerberos token
.Parameter KerberosTicket
Kerberos token of the user.
.Parameter UseDeviceCode
Use device code flow.
.Example
Get-AADIntAccessTokenForMSCommerce
.Example
PS C:\>Get-AADIntAccessTokenForMSCommerce -SaveToCache
#>
[cmdletbinding()]
Param(
[Parameter(ParameterSetName='Credentials',Mandatory=$False)]
[System.Management.Automation.PSCredential]$Credentials,
[Parameter(ParameterSetName='PRT',Mandatory=$True)]
[String]$PRTToken,
[Parameter(ParameterSetName='SAML',Mandatory=$True)]
[String]$SAMLToken,
[Parameter(ParameterSetName='Kerberos',Mandatory=$True)]
[String]$KerberosTicket,
[Parameter(ParameterSetName='Kerberos',Mandatory=$True)]
[String]$Domain,
[Parameter(ParameterSetName='DeviceCode',Mandatory=$True)]
[switch]$UseDeviceCode,
[Parameter(ParameterSetName='MSAL',Mandatory=$True)]
[switch]$UseMSAL,
[switch]$SaveToCache,
[Parameter(Mandatory=$False)]
[String]$Tenant,
[Parameter(Mandatory=$False)]
[string]$OTPSecretKey,
[Parameter(Mandatory=$False)]
[string]$TAP,
# PRT + SessionKey
[Parameter(ParameterSetName='PRT_Skey',Mandatory=$True)]
[Parameter(ParameterSetName='PRT_Settings',Mandatory=$False)]
[String]$RefreshToken,
[Parameter(ParameterSetName='PRT_Skey',Mandatory=$True)]
[Parameter(ParameterSetName='PRT_Settings',Mandatory=$False)]
[Parameter(Mandatory=$False)]
[String]$SessionKey,
[Parameter(ParameterSetName='PRT_Skey',Mandatory=$False)]
[Parameter(ParameterSetName='PRT_Settings',Mandatory=$True)]
[Parameter(Mandatory=$False)]
$Settings,
# Continuous Access Evaluation
[Parameter(Mandatory=$False)]
[switch]$CAE,
# ESTS
[Parameter(ParameterSetName='ESTS',Mandatory=$True)]
[string]$ESTSAUTH
)
Process
{
Get-AccessToken -Resource "aeb86249-8ea3-49e2-900b-54cc8e308f85" -ClientId "3d5cffa9-04da-4657-8cab-c7f074657cad" -KerberosTicket $KerberosTicket -Domain $Domain -SAMLToken $SAMLToken -Credentials $Credentials -SaveToCache $SaveToCache -Tenant $Tenant -PRTToken $PRTToken -UseDeviceCode $UseDeviceCode -OTPSecretKey $OTPSecretKey -TAP $TAP -UseMSAL $UseMSAL -RefreshToken $RefreshToken -SessionKey $SessionKey -Settings $Settings -CAE $CAE -ESTSAUTH $ESTSAUTH
}
}
# Gets an access token for MS Partner
# Sep 22nd 2021
function Get-AccessTokenForMSPartner
{
<#
.SYNOPSIS
Gets OAuth Access Token for MS Partner
.DESCRIPTION
Gets OAuth Access Token for MS Partner
.Parameter Credentials
Credentials of the user.
.Parameter PRT
PRT token of the user.
.Parameter SAML
SAML token of the user.
.Parameter UserPrincipalName
UserPrincipalName of the user of Kerberos token
.Parameter KerberosTicket
Kerberos token of the user.
.Parameter UseDeviceCode
Use device code flow.
.Example
Get-AADIntAccessTokenForMSCommerce
.Example
PS C:\>Get-AADIntAccessTokenForMSPartner -SaveToCache
#>
[cmdletbinding()]
Param(
[Parameter(ParameterSetName='Credentials',Mandatory=$False)]
[System.Management.Automation.PSCredential]$Credentials,
[Parameter(ParameterSetName='PRT',Mandatory=$True)]
[String]$PRTToken,
[Parameter(ParameterSetName='SAML',Mandatory=$True)]
[String]$SAMLToken,
[Parameter(ParameterSetName='Kerberos',Mandatory=$True)]
[String]$KerberosTicket,
[Parameter(ParameterSetName='Kerberos',Mandatory=$True)]
[String]$Domain,
[Parameter(ParameterSetName='DeviceCode',Mandatory=$True)]
[switch]$UseDeviceCode,
[Parameter(ParameterSetName='MSAL',Mandatory=$True)]
[switch]$UseMSAL,
[switch]$SaveToCache,
[Parameter(Mandatory=$False)]
[String]$Tenant,
[Parameter(Mandatory=$False)]
[string]$OTPSecretKey,
[Parameter(Mandatory=$False)]
[string]$TAP,
# PRT + SessionKey
[Parameter(ParameterSetName='PRT_Skey',Mandatory=$True)]
[Parameter(ParameterSetName='PRT_Settings',Mandatory=$False)]
[String]$RefreshToken,
[Parameter(ParameterSetName='PRT_Skey',Mandatory=$True)]
[Parameter(ParameterSetName='PRT_Settings',Mandatory=$False)]
[Parameter(Mandatory=$False)]
[String]$SessionKey,
[Parameter(ParameterSetName='PRT_Skey',Mandatory=$False)]
[Parameter(ParameterSetName='PRT_Settings',Mandatory=$True)]
[Parameter(Mandatory=$False)]
$Settings,
# Continuous Access Evaluation
[Parameter(Mandatory=$False)]
[switch]$CAE,
# ESTS
[Parameter(ParameterSetName='ESTS',Mandatory=$True)]
[string]$ESTSAUTH
)
Process
{
# The correct client id would be 4990cffe-04e8-4e8b-808a-1175604b879f but that flow doesn't work :(
Get-AccessToken -Resource "fa3d9a0c-3fb0-42cc-9193-47c7ecd2edbd" -ClientId "d3590ed6-52b3-4102-aeff-aad2292ab01c" -KerberosTicket $KerberosTicket -Domain $Domain -SAMLToken $SAMLToken -Credentials $Credentials -SaveToCache $SaveToCache -Tenant $Tenant -PRTToken $PRTToken -UseDeviceCode $UseDeviceCode -OTPSecretKey $OTPSecretKey -TAP $TAP -UseMSAL $UseMSAL -RefreshToken $RefreshToken -SessionKey $SessionKey -Settings $Settings -CAE $CAE -ESTSAUTH $ESTSAUTH
}
}
# Gets an access token for admin.microsoft.com
# Sep 22nd 2021
function Get-AccessTokenForAdmin
{
<#
.SYNOPSIS
Gets OAuth Access Token for admin.microsoft.com
.DESCRIPTION
Gets OAuth Access Token for admin.microsoft.com
.Parameter Credentials
Credentials of the user.
.Parameter PRT
PRT token of the user.
.Parameter SAML
SAML token of the user.
.Parameter UserPrincipalName
UserPrincipalName of the user of Kerberos token
.Parameter KerberosTicket
Kerberos token of the user.
.Parameter UseDeviceCode
Use device code flow.
.Example
Get-AADIntAccessTokenForAdmin
.Example
PS C:\>Get-AADIntAccessTokenForAdmin -SaveToCache
#>
[cmdletbinding()]
Param(
[Parameter(ParameterSetName='Credentials',Mandatory=$False)]
[System.Management.Automation.PSCredential]$Credentials,
[Parameter(ParameterSetName='PRT',Mandatory=$True)]
[String]$PRTToken,
[Parameter(ParameterSetName='SAML',Mandatory=$True)]
[String]$SAMLToken,
[Parameter(ParameterSetName='Kerberos',Mandatory=$True)]
[String]$KerberosTicket,
[Parameter(ParameterSetName='Kerberos',Mandatory=$True)]
[String]$Domain,
[Parameter(ParameterSetName='DeviceCode',Mandatory=$True)]
[switch]$UseDeviceCode,
[Parameter(ParameterSetName='MSAL',Mandatory=$True)]
[switch]$UseMSAL,
[switch]$SaveToCache,
[Parameter(Mandatory=$False)]
[String]$Tenant,
[Parameter(Mandatory=$False)]
[string]$OTPSecretKey,
[Parameter(Mandatory=$False)]
[string]$TAP,
# PRT + SessionKey
[Parameter(ParameterSetName='PRT_Skey',Mandatory=$True)]
[Parameter(ParameterSetName='PRT_Settings',Mandatory=$False)]
[String]$RefreshToken,
[Parameter(ParameterSetName='PRT_Skey',Mandatory=$True)]
[Parameter(ParameterSetName='PRT_Settings',Mandatory=$False)]
[Parameter(Mandatory=$False)]
[String]$SessionKey,
[Parameter(ParameterSetName='PRT_Skey',Mandatory=$False)]
[Parameter(ParameterSetName='PRT_Settings',Mandatory=$True)]
[Parameter(Mandatory=$False)]
$Settings,
# Continuous Access Evaluation
[Parameter(Mandatory=$False)]
[switch]$CAE,
# ESTS
[Parameter(ParameterSetName='ESTS',Mandatory=$True)]
[string]$ESTSAUTH
)
Process
{
Get-AccessToken -Resource "https://admin.microsoft.com" -ClientId "d3590ed6-52b3-4102-aeff-aad2292ab01c" -KerberosTicket $KerberosTicket -Domain $Domain -SAMLToken $SAMLToken -Credentials $Credentials -SaveToCache $SaveToCache -Tenant $Tenant -PRTToken $PRTToken -UseDeviceCode $UseDeviceCode -OTPSecretKey $OTPSecretKey -TAP $TAP -UseMSAL $UseMSAL -RefreshToken $RefreshToken -SessionKey $SessionKey -Settings $Settings -CAE $CAE -ESTSAUTH $ESTSAUTH
}
}
# Gets an access token for onenote.com
# Feb 2nd 2022
function Get-AccessTokenForOneNote
{
<#
.SYNOPSIS
Gets OAuth Access Token for onenote.com
.DESCRIPTION
Gets OAuth Access Token for onenote.com
.Parameter Credentials
Credentials of the user.
.Parameter PRT
PRT token of the user.
.Parameter SAML
SAML token of the user.
.Parameter UserPrincipalName
UserPrincipalName of the user of Kerberos token
.Parameter KerberosTicket
Kerberos token of the user.
.Parameter UseDeviceCode
Use device code flow.
.Example
Get-AADIntAccessTokenForOneNote
.Example
PS C:\>Get-AADIntAccessTokenForOneNote -SaveToCache
#>
[cmdletbinding()]
Param(
[Parameter(ParameterSetName='Credentials',Mandatory=$False)]
[System.Management.Automation.PSCredential]$Credentials,
[Parameter(ParameterSetName='PRT',Mandatory=$True)]
[String]$PRTToken,
[Parameter(ParameterSetName='SAML',Mandatory=$True)]
[String]$SAMLToken,
[Parameter(ParameterSetName='Kerberos',Mandatory=$True)]
[String]$KerberosTicket,
[Parameter(ParameterSetName='Kerberos',Mandatory=$True)]
[String]$Domain,
[Parameter(ParameterSetName='DeviceCode',Mandatory=$True)]
[switch]$UseDeviceCode,
[Parameter(ParameterSetName='MSAL',Mandatory=$True)]
[switch]$UseMSAL,
[switch]$SaveToCache,
[Parameter(Mandatory=$False)]
[String]$Tenant,
[Parameter(Mandatory=$False)]
[string]$OTPSecretKey,
[Parameter(Mandatory=$False)]
[string]$TAP,
# PRT + SessionKey
[Parameter(ParameterSetName='PRT_Skey',Mandatory=$True)]
[Parameter(ParameterSetName='PRT_Settings',Mandatory=$False)]
[String]$RefreshToken,
[Parameter(ParameterSetName='PRT_Skey',Mandatory=$True)]
[Parameter(ParameterSetName='PRT_Settings',Mandatory=$False)]
[Parameter(Mandatory=$False)]
[String]$SessionKey,
[Parameter(ParameterSetName='PRT_Skey',Mandatory=$False)]
[Parameter(ParameterSetName='PRT_Settings',Mandatory=$True)]
[Parameter(Mandatory=$False)]
$Settings,
# Continuous Access Evaluation
[Parameter(Mandatory=$False)]
[switch]$CAE,
# ESTS
[Parameter(ParameterSetName='ESTS',Mandatory=$True)]
[string]$ESTSAUTH
)
Process
{
Get-AccessToken -Resource "https://onenote.com" -ClientId "1fec8e78-bce4-4aaf-ab1b-5451cc387264" -KerberosTicket $KerberosTicket -Domain $Domain -SAMLToken $SAMLToken -Credentials $Credentials -SaveToCache $SaveToCache -Tenant $Tenant -PRTToken $PRTToken -UseDeviceCode $UseDeviceCode -OTPSecretKey $OTPSecretKey -TAP $TAP -UseMSAL $UseMSAL -RefreshToken $RefreshToken -SessionKey $SessionKey -Settings $Settings -CAE $CAE -ESTSAUTH $ESTSAUTH
}
}
# Gets an access token for for Access Packages
# Apr 24th 2023
function Get-AccessTokenForAccessPackages
{
<#
.SYNOPSIS
Gets OAuth Access Token for Access Packages
.DESCRIPTION
Gets OAuth Access Token for Access Packages
.Parameter Credentials
Credentials of the user.
.Parameter PRT
PRT token of the user.
.Parameter SAML
SAML token of the user.
.Parameter UserPrincipalName
UserPrincipalName of the user of Kerberos token
.Parameter KerberosTicket
Kerberos token of the user.
.Parameter UseDeviceCode
Use device code flow.
.Example
Get-AADIntAccessTokenForAccessPackages
.Example
PS C:\>Get-AADIntAccessAccessPackages -SaveToCache
#>
[cmdletbinding()]
Param(
[Parameter(ParameterSetName='Credentials',Mandatory=$False)]
[System.Management.Automation.PSCredential]$Credentials,
[Parameter(ParameterSetName='PRT',Mandatory=$True)]
[String]$PRTToken,
[Parameter(ParameterSetName='SAML',Mandatory=$True)]
[String]$SAMLToken,
[Parameter(ParameterSetName='Kerberos',Mandatory=$True)]
[String]$KerberosTicket,
[Parameter(ParameterSetName='Kerberos',Mandatory=$True)]
[String]$Domain,
[Parameter(ParameterSetName='DeviceCode',Mandatory=$True)]
[switch]$UseDeviceCode,
[Parameter(ParameterSetName='MSAL',Mandatory=$True)]
[switch]$UseMSAL,
[switch]$SaveToCache,
[Parameter(Mandatory=$False)]
[String]$Tenant,
[Parameter(Mandatory=$False)]
[string]$OTPSecretKey,
[Parameter(Mandatory=$False)]
[string]$TAP,
# PRT + SessionKey
[Parameter(ParameterSetName='PRT_Skey',Mandatory=$True)]
[Parameter(ParameterSetName='PRT_Settings',Mandatory=$False)]
[String]$RefreshToken,
[Parameter(ParameterSetName='PRT_Skey',Mandatory=$True)]
[Parameter(ParameterSetName='PRT_Settings',Mandatory=$False)]
[Parameter(Mandatory=$False)]
[String]$SessionKey,
[Parameter(ParameterSetName='PRT_Skey',Mandatory=$False)]
[Parameter(ParameterSetName='PRT_Settings',Mandatory=$True)]
[Parameter(Mandatory=$False)]
$Settings,
# Continuous Access Evaluation
[Parameter(Mandatory=$False)]
[switch]$CAE,
# ESTS
[Parameter(ParameterSetName='ESTS',Mandatory=$True)]
[string]$ESTSAUTH
)
Process
{
Get-AccessToken -Resource "https://elm.iga.azure.com" -ClientId "d3590ed6-52b3-4102-aeff-aad2292ab01c" -KerberosTicket $KerberosTicket -Domain $Domain -SAMLToken $SAMLToken -Credentials $Credentials -SaveToCache $SaveToCache -Tenant $Tenant -PRTToken $PRTToken -UseDeviceCode $UseDeviceCode -OTPSecretKey $OTPSecretKey -TAP $TAP -UseMSAL $UseMSAL -RefreshToken $RefreshToken -SessionKey $SessionKey -Settings $Settings -CAE $CAE -ESTSAUTH $ESTSAUTH
}
}
# Gets an access token for Windows Hello for Business
# May 20th 2023
function Get-AccessTokenForWHfB
{
<#
.SYNOPSIS
Gets OAuth Access Token for Windows Hello for Business
.DESCRIPTION
Gets OAuth Access Token for Windows Hello for Business, allowing users to register WHfB key.
.Parameter PRT
PRT token of the user.
.Example
$prttoken = Get-AADIntUserPRTToken -Method TokenProvider
Get-AADIntAccessTokenForWHfB -PRTToken $prttoken
#>
[cmdletbinding()]
Param(
[Parameter(Mandatory=$True)]
[String]$PRTToken,
[Parameter(ParameterSetName='Credentials',Mandatory=$False)]
[System.Management.Automation.PSCredential]$Credentials,
[switch]$SaveToCache,
[Parameter(Mandatory=$False)]
[String]$Tenant="common",
[Parameter(Mandatory=$False)]
[string]$OTPSecretKey,
[Parameter(Mandatory=$False)]
[string]$TAP
)
Process
{
# Prompt credentials as that's the only allowed method
$response = Prompt-Credentials -ClientID "dd762716-544d-4aeb-a526-687b73838a22" -Resource "urn:ms-drs:enterpriseregistration.windows.net" -RefreshTokenCredential $PRTToken -ForceNGCMFA $True -Credentials $Credentials -OTPSecretKey $OTPSecretKey -TAP $TAP -Tenant $Tenant
$parsedAccessToken = Read-Accesstoken -AccessToken $response.access_token
if([string]::IsNullOrEmpty($parsedAccessToken.DeviceId))
{
Write-Warning "No DeviceId claim present, device authentication failed. Expired PRT token?"
}
# Save to cache or return
if($SaveToCache)
{
Add-AccessTokenToCache -AccessToken $response.access_token -RefreshToken $response.refresh_token -ShowCache $true
}
else
{
return $response.access_token
}
}
}
# Gets an access token for compliance.microsoft.com
# Dec 13th 2024
function Get-AccessTokenForCompliance
{
<#
.SYNOPSIS
Gets OAuth Access Token for compliance.microsoft.com
.DESCRIPTION
Gets OAuth Access Token for compliance.microsoft.com
.Parameter Credentials
Credentials of the user.
.Parameter PRT
PRT token of the user.
.Parameter SAML
SAML token of the user.
.Parameter UserPrincipalName
UserPrincipalName of the user of Kerberos token
.Parameter KerberosTicket
Kerberos token of the user.
.Parameter UseDeviceCode
Use device code flow.
.Example
PS C:\>Get-AADIntAccessTokenForCompliance -SaveToCache
#>
[cmdletbinding()]
Param(
[Parameter(ParameterSetName='Credentials',Mandatory=$False)]
[System.Management.Automation.PSCredential]$Credentials,
[Parameter(ParameterSetName='PRT',Mandatory=$True)]
[String]$PRTToken,
[Parameter(ParameterSetName='SAML',Mandatory=$True)]
[String]$SAMLToken,
[Parameter(ParameterSetName='Kerberos',Mandatory=$True)]
[String]$KerberosTicket,
[Parameter(ParameterSetName='Kerberos',Mandatory=$True)]
[String]$Domain,
[Parameter(ParameterSetName='DeviceCode',Mandatory=$True)]
[switch]$UseDeviceCode,
[Parameter(ParameterSetName='MSAL',Mandatory=$True)]
[switch]$UseMSAL,
[switch]$SaveToCache,
[Parameter(Mandatory=$False)]
[String]$Tenant,
[Parameter(Mandatory=$False)]
[string]$OTPSecretKey,
[Parameter(Mandatory=$False)]
[string]$TAP,
# PRT + SessionKey
[Parameter(ParameterSetName='PRT_Skey',Mandatory=$True)]
[Parameter(ParameterSetName='PRT_Settings',Mandatory=$False)]
[String]$RefreshToken,
[Parameter(ParameterSetName='PRT_Skey',Mandatory=$True)]
[Parameter(ParameterSetName='PRT_Settings',Mandatory=$False)]
[Parameter(Mandatory=$False)]
[String]$SessionKey,
[Parameter(ParameterSetName='PRT_Skey',Mandatory=$False)]
[Parameter(ParameterSetName='PRT_Settings',Mandatory=$True)]
[Parameter(Mandatory=$False)]
$Settings,
# Continuous Access Evaluation
[Parameter(Mandatory=$False)]
[switch]$CAE,
# ESTS
[Parameter(ParameterSetName='ESTS',Mandatory=$True)]
[string]$ESTSAUTH
)
Process
{
Get-AccessToken -Resource "80ccca67-54bd-44ab-8625-4b79c4dc7775" -ClientId "1fec8e78-bce4-4aaf-ab1b-5451cc387264" -KerberosTicket $KerberosTicket -Domain $Domain -SAMLToken $SAMLToken -Credentials $Credentials -SaveToCache $SaveToCache -Tenant $Tenant -PRTToken $PRTToken -UseDeviceCode $UseDeviceCode -OTPSecretKey $OTPSecretKey -TAP $TAP -UseMSAL $UseMSAL -RefreshToken $RefreshToken -SessionKey $SessionKey -Settings $Settings -CAE $CAE -ESTSAUTH $ESTSAUTH
}
}
# Gets the access token for provisioning API and stores to cache
# Refactored Jun 8th 2020
function Get-AccessToken
{
<#
.SYNOPSIS
Gets OAuth Access Token for the given client and resource. Using the given authentication method. If not provided, uses interactive logon.
.DESCRIPTION
Gets OAuth Access Token for the given client and resource. Using the given authentication method. If not provided, uses interactive logon.
.Example
$at=Get-AADIntAccessToken -ClientId "d3590ed6-52b3-4102-aeff-aad2292ab01c" -Resource "https://graph.microsoft.com"
.Example
Get-AADIntAccessToken -ClientId "d3590ed6-52b3-4102-aeff-aad2292ab01c" -Resource "https://graph.microsoft.com" -SaveToCache $true -IncludeRefreshToken $true
AccessToken saved to cache.
Tenant : 9779e97e-de19-45be-87ab-a7ed3e86fa62
User : user@company.com
Resource : https://graph.microsoft.com
Client : d3590ed6-52b3-4102-aeff-aad2292ab01c
#>
[cmdletbinding()]
Param(
[Parameter(Mandatory=$False)]
[System.Management.Automation.PSCredential]$Credentials,
[Parameter(ParameterSetName='PRT',Mandatory=$False)]
[String]$PRTToken,
[Parameter(Mandatory=$False)]
[String]$SAMLToken,
[Parameter(Mandatory=$True)]
[String]$Resource,
[Parameter(Mandatory=$True)]
[String]$ClientId,
[Parameter(Mandatory=$False)]
[String]$Tenant="common",
[Parameter(Mandatory=$False)]
[String]$KerberosTicket,
[Parameter(Mandatory=$False)]
[String]$Domain,
[Parameter(Mandatory=$False)]
[bool]$SaveToCache,
[Parameter(Mandatory=$False)]
[bool]$SaveToMgCache,
[Parameter(Mandatory=$False)]
[bool]$IncludeRefreshToken=$false,
[Parameter(Mandatory=$False)]
[bool]$ForceMFA=$false,
[Parameter(Mandatory=$False)]
[bool]$ForceNGCMFA=$false,
[Parameter(Mandatory=$False)]
[bool]$UseDeviceCode=$false,
[Parameter(Mandatory=$False)]
[bool]$UseIMDS=$false,
[Parameter(Mandatory=$False)]
[String]$MsiResId,
[Parameter(Mandatory=$False)]
[String]$MsiClientId,
[Parameter(Mandatory=$False)]
[String]$MsiObjectId,
[Parameter(Mandatory=$False)]
[string]$BPRT,
[Parameter(Mandatory=$False)]
[System.Security.Cryptography.X509Certificates.X509Certificate2]$Certificate,
[Parameter(Mandatory=$False)]
[string]$PfxFileName,
[Parameter(Mandatory=$False)]
[string]$PfxPassword,
[Parameter(Mandatory=$False)]
[string]$TransportKeyFileName,
[Parameter(Mandatory=$False)]
[string]$OTPSecretKey,
[Parameter(Mandatory=$False)]
[string]$TAP,
[Parameter(Mandatory=$False)]
[string]$RedirectUri,
[Parameter(Mandatory=$False)]
[string]$ESTSAUTH,
[Parameter(Mandatory=$False)]
[string]$SubScope,
[Parameter(Mandatory=$False)]
[bool]$UseMSAL=$false,
# PRT + SessionKey
[Parameter(Mandatory=$False)]
[String]$RefreshToken,
[Parameter(Mandatory=$False)]
[String]$SessionKey,
[Parameter(Mandatory=$False)]
$Settings,
# Continuous Access Evaluation
[Parameter(Mandatory=$False)]
[bool]$CAE
)
Begin
{
# List of clients requiring the same client id
$requireClientId=@(
"cb1056e2-e479-49de-ae31-7812af012ed8" # Pass-through authentication
"c44b4083-3bb0-49c1-b47d-974e53cbdf3c" # Azure Admin web ui
"1fec8e78-bce4-4aaf-ab1b-5451cc387264" # Teams
"d3590ed6-52b3-4102-aeff-aad2292ab01c" # Office, ref. https://docs.microsoft.com/en-us/office/dev/add-ins/develop/register-sso-add-in-aad-v2
"a0c73c16-a7e3-4564-9a95-2bdf47383716" # EXO Remote PowerShell
"389b1b32-b5d5-43b2-bddc-84ce938d6737" # Office Management API Editor https://manage.office.com
"ab9b8c07-8f02-4f72-87fa-80105867a763" # OneDrive Sync Engine
"d3590ed6-52b3-4102-aeff-aad2292ab01c" # SPO
"29d9ed98-a469-4536-ade2-f981bc1d605e" # MDM
"0c1307d4-29d6-4389-a11c-5cbe7f65d7fa" # Azure Android App
"6c7e8096-f593-4d72-807f-a5f86dcc9c77" # MAM
"4813382a-8fa7-425e-ab75-3b753aab3abb" # Microsoft authenticator
"8c59ead7-d703-4a27-9e55-c96a0054c8d2"
"c7d28c4f-0d2c-49d6-a88d-a275cc5473c7" # https://www.microsoftazuresponsorships.com/
"04b07795-8ddb-461a-bbee-02f9e1bf7b46" # Azure CLI
"ecd6b820-32c2-49b6-98a6-444530e5a77a" # Edge
"1950a258-227b-4e31-a9cf-717495945fc2" # Microsoft Azure PowerShell
"9ba1a5c7-f17a-4de9-a1f1-6178c8d51223" # Microsoft Intune Company Portal
)
}
Process
{
# Check the tenant id
if([string]::IsNullOrEmpty($Tenant))
{
$Tenant = "common"
}
if(![String]::IsNullOrEmpty($KerberosTicket)) # Check if we got the kerberos token
{
# Get token using the kerberos token
$OAuthInfo = Get-AccessTokenWithKerberosTicket -KerberosTicket $KerberosTicket -Domain $Domain -Resource $Resource -ClientId $ClientId -Tenant $Tenant
$access_token = $OAuthInfo.access_token
}
elseif(![String]::IsNullOrEmpty($PRTToken)) # Check if we got a PRT token
{
# Get token using the PRT token
$OAuthInfo = Get-AccessTokenWithPRTToken -Cookie $PRTToken -Resource $Resource -ClientId $ClientId -Tenant $Tenant -SubScope $SubScope
$access_token = $OAuthInfo.access_token
}
# Check if we got a PRT and session key
elseif(![String]::IsNullOrEmpty($Settings) -or (![String]::IsNullOrEmpty($RefreshToken) -and ![String]::IsNullOrEmpty($SessionKey)))
{
if($Settings)
{
$RefreshToken = $Settings.refresh_token
$SessionKey = $Settings.session_key
}
# Get token using the PRT token
$OAuthInfo = Get-AccessTokenWithSignedPRTRequest -Resource $Resource -ClientId $ClientId -SubScope $SubScope -RefreshToken $RefreshToken -SessionKey $SessionKey -CAE $CAE
$access_token = $OAuthInfo.access_token
}
elseif($UseDeviceCode) # Check if we want to use device code flow
{
# Get token using device code
$OAuthInfo = Get-AccessTokenUsingDeviceCode -Resource $Resource -ClientId $ClientId -Tenant $Tenant -CAE $CAE
$access_token = $OAuthInfo.access_token
}
elseif($UseIMDS) # Check if we want to use IMDS
{
# Get token using Azure Instance Metadata Service (IMDS)
$OAuthInfo = @{
"refresh_token" = $null
"access_token" = Get-AccessTokenUsingIMDS -ClientId $MsiClientId -ObjectId $MsiObjectId -AzureResourceId $MsiResId -Resource $Resource
}
$access_token = $OAuthInfo.access_token
}
elseif(![String]::IsNullOrEmpty($BPRT)) # Check if we got a BPRT
{
# Get token using BPRT
$OAuthInfo = @{
"refresh_token" = $BPRT
"access_token" = Get-AccessTokenWithRefreshToken -Resource "urn:ms-drs:enterpriseregistration.windows.net" -ClientId "b90d5b8f-5503-4153-b545-b31cecfaece2" -TenantId "Common" -RefreshToken $BPRT -SubScope $SubScope -CAE $CAE
}
$access_token = $OAuthInfo.access_token
}
elseif($UseMSAL) # Use MSAL
{
# Get token using Microsoft Authentication Library
$response = Get-AccessTokenUsingMSAL -TenantId $Tenant -ClientId $ClientId -Resource $Resource -RedirectUri $RedirectUri -SubScope $SubScope -CAE $CAE
$OAuthInfo = @{
"refresh_token" = $null
"access_token" = $response.AccessToken
}
$access_token = $OAuthInfo.access_token
}
else # Authorization code grant flow - can use SAML or interactive prompt
{
if(![string]::IsNullOrEmpty($SAMLToken))
{
# Get token using SAML token
$OAuthInfo = Get-OAuthInfoUsingSAML -SAMLToken $SAMLToken -ClientId $ClientId -Resource "https://graph.windows.net"
}
elseif(![string]::IsNullOrEmpty($ESTSAUTH))
{
# Get token using ESTSAUTH
$OAuthInfo = Prompt-Credentials -Resource $Resource -ClientId $ClientId -Tenant $Tenant -RedirectURI $RedirectUri -SubScope $SubScope -ESTSAUTH $ESTSAUTH -CAE $CAE
}
else
{
# Prompt for credentials
if( $ClientId -eq "d3590ed6-52b3-4102-aeff-aad2292ab01c" <# Office #> -or
$ClientId -eq "a0c73c16-a7e3-4564-9a95-2bdf47383716" <# EXO #> -or
($ClientId -eq "29d9ed98-a469-4536-ade2-f981bc1d605e" -and $Resource -eq "https://enrollment.manage.microsoft.com/") <# MDM #>
)
{
$OAuthInfo = Prompt-Credentials -Resource $Resource -ClientId $ClientId -Tenant $Tenant -ForceMFA $ForceMFA -ForceNGCMFA $ForceNGCMFA -Credentials $Credentials -OTPSecretKey $OTPSecretKey -TAP $TAP -RedirectURI $RedirectUri -SubScope $SubScope -CAE $CAE
}
else
{
$OAuthInfo = Prompt-Credentials -Resource "https://graph.windows.net" -ClientId $ClientId -Tenant $Tenant -ForceMFA $ForceMFA -ForceNGCMFA $ForceNGCMFA -Credentials $Credentials -OTPSecretKey $OTPSecretKey -TAP $TAP -RedirectURI $RedirectUri -SubScope $SubScope -CAE $CAE
}
# Just return null
if(!$OAuthInfo)
{
return $null
}
}
# Save the refresh token and other variables
$RefreshToken= $OAuthInfo.refresh_token
$ParsedToken= Read-Accesstoken($OAuthInfo.access_token)
$tenant_id = $ParsedToken.tid
# Save the tokens to cache
if($SaveToCache)
{
Write-Verbose "ACCESS TOKEN: SAVE TO CACHE"
Add-AccessTokenToCache -AccessToken $OAuthInfo.access_token -RefreshToken $OAuthInfo.refresh_token -ShowCache $false
}
# If the token client id or resource is different than requested, get correct one using refresh token
if(($ParsedToken.appid -ne $ClientId) -or ($ParsedToken.aud -ne $Resource))
{
$tokens = Get-AccessTokenWithRefreshToken -Resource $Resource -ClientId $ClientId -TenantId $tenant_id -RefreshToken $RefreshToken -SaveToCache $SaveToCache -IncludeRefreshToken $true -SubScope $SubScope -CAE $CAE
$OAuthInfo = [pscustomobject]@{
"access_token" = $tokens[0]
"refresh_token" = $tokens[1]
}
}
$access_token = $OAuthInfo.access_token
}
# Check is this current, new, or deprecated FOCI client
IsFOCI -ClientId (Read-Accesstoken -AccessToken $OAuthInfo.access_token).appid -FOCI $OAuthInfo.foci | Out-Null
$refresh_token = $OAuthInfo.refresh_token
# Check whether we want to get the deviceid and (possibly) mfa in mra claim
if(($Certificate -ne $null -and [string]::IsNullOrEmpty($PfxFileName)) -or ($Certificate -eq $null -and [string]::IsNullOrEmpty($PfxFileName) -eq $false))
{
try
{
Write-Verbose "Trying to get new tokens with deviceid claim."
$deviceTokens = Set-AccessTokenDeviceAuth -AccessToken $access_token -RefreshToken $refresh_token -Certificate $Certificate -PfxFileName $PfxFileName -PfxPassword $PfxPassword -BPRT $([string]::IsNullOrEmpty($BPRT) -eq $False) -TransportKeyFileName $TransportKeyFileName
}
catch
{
Write-Warning "Could not get tokens with deviceid claim: $($_.Exception.Message)"
}
if($deviceTokens.access_token)
{
$access_token = $deviceTokens.access_token
$refresh_token = $deviceTokens.refresh_token
$claims = Read-Accesstoken $access_token
Write-Verbose "Tokens updated with deviceid: ""$($claims.deviceid)"" and amr: ""$($claims.amr)"""
}
}
# Save the final tokens to cache
if($SaveToCache -and $OAuthInfo -ne $null -and $access_token -ne $null)
{
Add-AccessTokenToCache -AccessToken $access_token -RefreshToken $refresh_token -ShowCache $false
}
if($SaveToMgCache -and $OAuthInfo -ne $null -and $access_token -ne $null)
{
Write-Verbose "Saving access token to MS Graph SDK cache"
# Import the module if needed
$MgModule = "Microsoft.Graph.Authentication"
if(!(Get-Module -Name $MgModule))
{
try
{
# Import-Module doesn't throw an error, just prints it out.
Import-Module -Name $MgModule -ErrorVariable "moduleImportError" -ErrorAction SilentlyContinue
}
catch
{
Throw "$MgModule module could not be imported!"
}
if($moduleImportError)
{
Throw "$MgModule module could not be imported!"
}
}
# Initialize the graph session
[Microsoft.Graph.PowerShell.Authentication.Common.GraphSessionInitializer]::InitializeSession()
# Create the AuthContext
$authContext = [Microsoft.Graph.PowerShell.Authentication.AuthContext]::new()
$authContext.PSHostVersion = (Get-Host).Version
$authContext.Environment = "Global"
$authContext.AuthType = [Microsoft.Graph.PowerShell.Authentication.AuthenticationType]::UserProvidedAccessToken
$authContext.TokenCredentialType = [Microsoft.Graph.PowerShell.Authentication.TokenCredentialType]::UserProvidedAccessToken
$authContext.ContextScope = [Microsoft.Graph.PowerShell.Authentication.ContextScope]::Process
# Initialize the GraphSession and store the access token
$graphSession = [Microsoft.Graph.PowerShell.Authentication.GraphSession]::Instance
$graphSession.InMemoryTokenCache = [Microsoft.Graph.PowerShell.Authentication.Core.TokenCache.InMemoryTokenCache]::new([text.encoding]::UTF8.GetBytes($access_token))
$graphSession.AuthContext = $authContext
}
# Return
if([string]::IsNullOrEmpty($access_token))
{
Throw "Could not get Access Token!"
}
# Don't print out token if saved to cache!
if($SaveToCache -or $SaveToMgCache)
{
$pat = Read-Accesstoken -AccessToken $access_token
$attributes=[ordered]@{
"Tenant" = $pat.tid
"User" = $pat.unique_name
"Resource" = $Resource
"Client" = $ClientID
}
Write-Host "AccessToken saved to cache."
if($SaveToMgCache)
{
Write-Host "You may now use MS Graph SDK commands, e.g. Get-MgUser"
}
return New-Object psobject -Property $attributes
}
else
{
if($IncludeRefreshToken) # Include refreshtoken
{
return @($access_token,$refresh_token)
}
else
{
return $access_token
}
}
}
}
# Gets the access token using a refresh token
# Jun 8th 2020
function Get-AccessTokenWithRefreshToken
{
<#
.SYNOPSIS
Gets OAuth Access Token for the given client and resource using the given refresh token.
.DESCRIPTION
Gets OAuth Access Token for the given client and resource using the given refresh token.
For FOCI refresh tokens, i.e.,Family Refresh Tokens (FRTs), you can use any FOCI client id.
.Example
PS:\>$tokens=Get-AADIntAccessToken -ClientId "d3590ed6-52b3-4102-aeff-aad2292ab01c" -Resource "https://graph.microsoft.com" -IncludeRefreshToken $true
PS:\>$at=Get-AADIntAccessTokenWithRefreshToken -ClientId "1fec8e78-bce4-4aaf-ab1b-5451cc387264" -Resource "https://graph.windows.net" -TenantId "company.com" -RefreshToken $tokens[1]
#>
[cmdletbinding()]
Param(
[String]$Resource,
[Parameter(Mandatory=$True)]
[String]$ClientId,
[Parameter(Mandatory=$True)]
[String]$TenantId,
[Parameter(Mandatory=$True)]
[String]$RefreshToken,
[Parameter(Mandatory=$False)]
[bool]$SaveToCache = $false,
[Parameter(Mandatory=$False)]
[bool]$IncludeRefreshToken = $false,
[Parameter(Mandatory=$False)]
[String]$SubScope,
[Parameter(Mandatory=$False)]
[bool]$CAE
)
Process
{
# Set the body for API call
$body = @{
"resource"= $Resource
"client_id"= $ClientId
"grant_type"= "refresh_token"
"refresh_token"= $RefreshToken
"scope"= "openid"
}
# Set Continuous Access Evaluation (CAE) token claims
if($CAE)
{
$body["claims"] = Get-CAEClaims
}
if($ClientId -eq "ab9b8c07-8f02-4f72-87fa-80105867a763") # OneDrive Sync Engine
{
$url = "https://login.windows.net/common/oauth2/token"
}
else
{
$url = "$(Get-TenantLoginUrl -SubScope $SubScope)/$TenantId/oauth2/token"
}
# Debug
Write-Debug "ACCESS TOKEN BODY: $($body | Out-String)"
# Set the content type and call the API
$contentType="application/x-www-form-urlencoded"
try
{
$response=Invoke-RestMethod -UseBasicParsing -Uri $url -ContentType $contentType -Method POST -Body $body
}
catch
{
$errorMessage = "Unable to get tokens using refresh token"
try
{
$errorDetails = $_.ErrorDetails.Message | ConvertFrom-Json
if(-not [string]::IsNullOrEmpty($errorDetails.error_description))
{
$errorMessage = $errorDetails.error_description.Split("`n")[0]
}
}
catch {}
throw $errorMessage
}
# Debug
Write-Debug "ACCESS TOKEN RESPONSE: $response"
# Check is this current, new, or deprecated FOCI client
IsFOCI -ClientId (Read-Accesstoken -AccessToken $response.access_token).appid -FOCI $response.foci | Out-Null
# Save the tokens to cache
if($SaveToCache)
{
Write-Verbose "ACCESS TOKEN: SAVE TO CACHE"
Add-AccessTokenToCache -AccessToken $response.access_token -RefreshToken $response.refresh_token -ShowCache $false
}
# Return
if($IncludeRefreshToken)
{
return @($response.access_token, $response.refresh_token)
}
else
{
return $response.access_token
}
}
}
# Gets access token using device code flow
# Oct 13th 2020
function Get-AccessTokenUsingDeviceCode
{
[cmdletbinding()]
Param(
[Parameter(Mandatory=$True)]
[String]$ClientId,
[Parameter(Mandatory=$False)]
[String]$Tenant,
[Parameter(Mandatory=$False)]
[String]$Resource="https://graph.windows.net",
[Parameter(Mandatory=$False)]
[bool]$CAE
)
Process
{
# Check the tenant
if([string]::IsNullOrEmpty($Tenant))
{
$Tenant="Common"
}
# Create a body for the first request
$body=@{
"client_id" = $ClientId
"resource" = $Resource
}
# Invoke the request to get device and user codes
$authResponse = Invoke-RestMethod -UseBasicParsing -Method Post -Uri "https://login.microsoftonline.com/$tenant/oauth2/devicecode?api-version=1.0" -Body $body
Write-Host $authResponse.message
$continue = $true
$response = $null
$interval = $authResponse.interval
$expires = $authResponse.expires_in
# Create body for authentication subsequent requests
$body=@{
"client_id" = $ClientId
"grant_type" = "urn:ietf:params:oauth:grant-type:device_code"
"code" = $authResponse.device_code
"resource" = $Resource
}
# Set Continuous Access Evaluation (CAE) token claims
if($CAE)
{
$body["claims"] = Get-CAEClaims
}
# Loop while pending or until timeout exceeded
while($continue)
{
Start-Sleep -Seconds $interval
$total += $interval
if($total -gt $expires)
{
Write-Error "Timeout occurred"
return
}
# Try to get the response. Will give 40x while pending so we need to try&catch
try
{
$response = Invoke-RestMethod -UseBasicParsing -Method Post -Uri "https://login.microsoftonline.com/$Tenant/oauth2/token?api-version=1.0 " -Body $body -ErrorAction SilentlyContinue
}
catch
{
# This normal flow, always returns 40x unless successful
$details=$_.ErrorDetails.Message | ConvertFrom-Json
$continue = $details.error -eq "authorization_pending"
Write-Verbose $details.error
Write-Host "." -NoNewline
if(!$continue)
{
# Not authorization_pending so this is a real error :(
Write-Error $details.error_description
return
}
}
# If we got response, all okay!
if($response)
{
Write-Host ""
return $response
}
}
}
}
# Gets the access token using device SAML token
# Feb 18th 2021
function Get-AccessTokenWithDeviceSAML
{
[cmdletbinding()]
Param(
[Parameter(Mandatory=$True)]
[String]$SAML,
[Parameter(Mandatory=$False)]
[bool]$SaveToCache
)
Process
{
$headers = @{
}
$ClientId = "1b730954-1685-4b74-9bfd-dac224a7b894" #"dd762716-544d-4aeb-a526-687b73838a22"
$Resource = "01cb2876-7ebd-4aa4-9cc9-d28bd4d359a9" #"urn:ms-drs:enterpriseregistration.windows.net"
# Set the body for API call
$body = @{
"resource"= $Resource
"client_id"= $ClientId
"grant_type"= "urn:ietf:params:oauth:grant-type:saml1_1-bearer"
"assertion"= Convert-TextToB64 -Text $SAML
"scope"= "openid"
}
# Debug
Write-Debug "ACCESS TOKEN BODY: $($body | Out-String)"
# Set the content type and call the API
$contentType = "application/x-www-form-urlencoded"
$response = Invoke-RestMethod -UseBasicParsing -Uri "https://login.microsoftonline.com/common/oauth2/token" -ContentType $contentType -Method POST -Body $body -Headers $headers
# Debug
Write-Debug "ACCESS TOKEN RESPONSE: $response"
# Save the tokens to cache
if($SaveToCache)
{
Write-Verbose "ACCESS TOKEN: SAVE TO CACHE"
Add-AccessTokenToCache -AccessToken $response.access_token -RefreshToken $response.refresh_token -ShowCache $false
}
else
{
# Return
return $response.access_token
}
}
}
# Logins to SharePoint Online and returns an IdentityToken
# TODO: Research whether can be used to get access_token to AADGraph
# TODO: Add support for Google?
# FIX: Web control stays logged in - clear cookies somehow?
# Aug 10th 2018
function Get-IdentityTokenByLiveId
{
<#
.SYNOPSIS
Gets identity_token for SharePoint Online for External user
.DESCRIPTION
Gets identity_token for SharePoint Online for External user using LiveId.
.Parameter Tenant
The tenant name to login in to WITHOUT .sharepoint.com part
.Example
PS C:\>$id_token=Get-AADIntIdentityTokenByLiveId -Tenant mytenant
#>
[cmdletbinding()]
Param(
[Parameter(Mandatory=$True)]
[String]$Tenant
)
Process
{
# Set variables
$auth_redirect="https://login.microsoftonline.com/common/federation/oauth2" # When to close the form
$url="https://$Tenant.sharepoint.com"
# Create the form
$form=Create-LoginForm -Url $url -auth_redirect $auth_redirect
# Show the form and wait for the return value
if($form.ShowDialog() -ne "OK") {
Write-Verbose "Login cancelled"
return $null
}
$web=$form.Controls[0]
$code=$web.Document.All["code"].GetAttribute("value")
$id_token=$web.Document.All["id_token"].GetAttribute("value")
$session_state=$web.Document.All["session_state"].GetAttribute("value")
return Read-Accesstoken($id_token)
}
}
# Tries to generate access token using cached AADGraph token
# Jun 15th 2020
function Get-AccessTokenUsingAADGraph
{
[cmdletbinding()]
Param(
[Parameter(Mandatory=$True)]
[String]$Resource,
[Parameter(Mandatory=$True)]
[String]$ClientId,
[switch]$SaveToCache
)
Process
{
# Try to get AAD Graph access token from the cache
$AccessToken = Get-AccessTokenFromCache -AccessToken $null -Resource "https://graph.windows.net" -ClientId "1b730954-1685-4b74-9bfd-dac224a7b894"
# Get the tenant id
$tenant = (Read-Accesstoken -AccessToken $AccessToken).tid
# Get the refreshtoken
$refresh_token = Get-RefreshTokenFromCache -ClientID "1b730954-1685-4b74-9bfd-dac224a7b894" -Resource "https://graph.windows.net"
if([string]::IsNullOrEmpty($refresh_token))
{
Throw "No refreshtoken found! Use Get-AADIntAccessTokenForAADGraph with -SaveToCache switch."
}
# Create a new AccessToken for Azure AD management portal API
$AccessToken = Get-AccessTokenWithRefreshToken -Resource $Resource -ClientId $ClientId -TenantId $tenant -RefreshToken $refresh_token -SaveToCache $SaveToCache
# Return
$AccessToken
}
}
# Apr 22th 2022
# Shows users stored in ESTS cookie
function Unprotect-EstsAuthPersistentCookie
{
<#
.SYNOPSIS
Decrypts and dumps users stored in ESTSAUTH or ESTSAUTHPERSISTENT
.DESCRIPTION
Decrypts and dumps users stored in ESTSAUTH or ESTSAUTHPERSISTENT using login.microsoftonline.com/forgetUser
.Parameter Cookie
Value of ESTSAUTH or ESTSAUTHPERSISTENT cookie
.Example
PS C:\>Unprotect-AADIntEstsAuthPersistentCookie -Cookie 0.ARMAqlCH3MZuvUCNgTAd4B7IRffhvoluXopNnz3s1gEl...
name : Some User
login : user@company.com
imageAAD : work_account.png
imageMSA : personal_account.png
isLive : False
isGuest : False
link : user@company.com
authUrl :
isSigned : True
sessionID : 1fb5e6b3-09a4-4ceb-bcad-3d6d0ee89bf7
domainHint :
isWindows : False
name : Another User
login : user2@company.com
imageAAD : work_account.png
imageMSA : personal_account.png
isLive : False
isGuest : False
link : user2@company.com
authUrl :
isSigned : False
sessionID : 1fb5e6b3-09a4-4ceb-bcad-3d6d0ee89bf7
domainHint :
isWindows : False
#>
[cmdletbinding()]
Param(
[Parameter(Mandatory=$True,ValueFromPipeline)]
[String]$Cookie,
[Parameter(Mandatory=$False)]
[String]$SubScope
)
Process
{
Remove-UserFromEstsAuthPersistentCookie -Cookie $Cookie -SessionID "00000000-0000-0000-0000-000000000000" -ShowContent $true
}
}
# Apr 22th 2022
# Removes a user from the ESTS cookie
function Remove-UserFromEstsAuthPersistentCookie
{
<#
.SYNOPSIS
Removes the given user from ESTSAUTH or ESTSAUTHPERSISTENT
.DESCRIPTION
Removes the given user from ESTSAUTH or ESTSAUTHPERSISTENT using login.microsoftonline.com/forgetUser
The signed in user or the only user can't be removed.
.Parameter Cookie
Value of ESTSAUTH or ESTSAUTHPERSISTENT cookie
.Parameter SessionID
The session ID to be removed
.Parameter UserName
The user to be removed
.Parameter ShowContent
If true, shows the content of the cookie instead of returning new cookie
.Example
PS C:\>$ESTSCookie = Remove-AADIntUserFromEstsAuthPersistentCookie -UserName "user@company.com" -Cookie "0.ARMAqlCH3MZuvUCNgTAd4B7IRffhvoluXopNnz3s1gEl..."
#>
[cmdletbinding()]
Param(
[Parameter(Mandatory=$True)]
[String]$Cookie,
[Parameter(ParameterSetName='ID',Mandatory=$True)]
[String]$SessionID,
[Parameter(ParameterSetName='User',Mandatory=$True)]
[String]$UserName,
[Parameter(Mandatory=$False)]
[boolean]$ShowContent=$False,
[Parameter(Mandatory=$False)]
[String]$SubScope
)
Process
{
if(![string]::IsNullOrEmpty($UserName))
{
# Get the list of users
$users = Unprotect-EstsAuthPersistentCookie -Cookie $Cookie
if($users.Count -eq 1)
{
Write-Warning "The only user can't be removed."
}
foreach($user in $users)
{
if($user.login -eq $UserName)
{
$SessionID = $user.sessionID
if($user.isSigned)
{
Write-Warning "Signed in user can't be removed"
}
break
}
}
if([string]::IsNullOrEmpty($SessionID))
{
throw "User $username not stored in the given token"
}
}
$session = New-Object Microsoft.PowerShell.Commands.WebRequestSession
$loginUrl = Get-TenantLoginUrl -SubScope $SubScope
$cookieDomain = $loginUrl.Split("/")[2]
$session.Cookies.Add((New-Object System.Net.Cookie("ESTSAUTHPERSISTENT", $Cookie, "/", $cookieDomain )))
$response = Invoke-WebRequest2 -Uri "$loginUrl/forgetuser?sessionid=$sessionID" -WebSession $session -ErrorAction SilentlyContinue
# Dump the content
if($ShowContent)
{
return $response.content | ConvertFrom-Json
}
else
{
# Return the new cookie
# For some reason, the web session is not updated with the new cookie :(
try
{
$ESTSCookie = Get-StringBetween -Start "ESTSAUTHPERSISTENT=" -End ";" -String $response.Headers.'Set-Cookie'
}
catch
{
Write-Warning "No ESTSAUTHPERSISTENT cookie was returned. The removed user/session didn't exist, the user was signed in, or there was just one user."
}
return $ESTSCookie
}
}
}
# Returns access token using Azure Instance Metadata Service (IMDS)
# Nov 8th 2022
function Get-AccessTokenUsingIMDS
{
<#
.SYNOPSIS
Gets access token using Azure Instance Metadata Service (IMDS)
.DESCRIPTION
Gets access token using Azure Instance Metadata Service (IMDS).
The ClientId of the token is the (Enterprise) Application ID of the managed identity.
.Parameter Resource
The App ID URI of the target resource. It also appears in the aud (audience) claim of the issued token.
.Parameter ObjectId
The ObjectId of the managed identity you would like the token for. Required, if your VM has multiple user-assigned managed identities.
.Parameter ClientId
The ClientId of the managed identity you would like the token for. Required, if your VM has multiple user-assigned managed identities.
.Parameter AzureResourceId
The Azure Resource ID of the managed identity you would like the token for. Required, if your VM has multiple user-assigned managed identities.
.Example
PS C:\>Get-AADIntAccessTokenUsingIMDS -Resource https://management.core.windows.net | Add-AADIntAccessTokenToCache
Name :
ClientId : 686d728a-2838-458d-9038-2d9808781b9a
Audience : https://management.core.windows.net
Tenant : ef35ef41-6e54-43f8-bdf0-b89827a3a991
IsExpired : False
HasRefreshToken : False
AuthMethods :
Device :
PS C:\>Get-AADIntAzureSubscriptions
subscriptionId displayName state
-------------- ----------- -----
233cd967-f2d4-41eb-897a-47ac77c7393d Production Enabled
PS C:\>Get-AADIntAzureResourceGroups -SubscriptionId "233cd967-f2d4-41eb-897a-47ac77c7393d"
name location tags
---- -------- ----
Production-Norway norwayeast
Production-Germany westeurope
Production-US-West westus3
Production-Sweden swedencentral
Production-US-East eastus
#>
[cmdletbinding()]
Param(
[Parameter(Mandatory=$True)]
[String]$Resource,
[Parameter(Mandatory=$False)]
[String]$ClientId,
[Parameter(Mandatory=$False)]
[String]$ObjectId,
[Parameter(Mandatory=$False)]
[String]$AzureResourceId,
[Parameter(Mandatory=$False)]
[String]$ApiVersion="2018-02-01"
)
Process
{
# Construct the url
# Ref: https://learn.microsoft.com/en-us/azure/active-directory/managed-identities-azure-resources/how-to-use-vm-token#get-a-token-using-http
$url = "http://169.254.169.254/metadata/identity/oauth2/token?api-version=$($ApiVersion)&resource=$($Resource)"
if($ClientId)
{
$url += "&client_id=$ClientId"
}
if($ObjectId)
{
$url += "&object_id=$ObjectId"
}
if($AzureResourceId)
{
$url += "&msi_res_id=$AzureResourceId"
}
# Create the header
$headers = @{
"Metadata" = "true"
}
# Invoke the request. Short timeout as this may be a computer not able to access IMDS.
$response = Invoke-RestMethod -UseBasicParsing -Uri $url -Method Get -Headers $headers -TimeoutSec 1
# Return
$response.access_token
}
}
# Gets app consent info
# Sep 13th 2024
function Get-AppConsentInfo
{
<#
.SYNOPSIS
Shows the consent information of the given application client id.
.DESCRIPTION
Shows the consent information of the given application client id by using authorization code flow.
.Parameter ClientId
The ClientId of the application which consent information you'd like to see
.Example
PS C:\>$creds = Get-Credential
PS C:\>Get-AADIntAppConsentInfo -Credentials $creds -ClientId "5a2d9517-0fe6-48ea-b09c-3c5ae4a3e7dc"
Name : www.myo365.site
VerifiedPublisher : Gerenios Oy
WebSite : www.gerenios.com
Created : 10/26/2017
TermsOfService :
PrivacyStatement :
Logo : https://secure.aadcdn.microsoftonline-p.com/c1c6b6c8-okmfqodscgr7krbq5-p48zooio1tqm9g2zcpryoikta/appbranding/ppgci70
wmk0edve-emzqa3tqk03sidrimjcehxhp-c/1033/bannerlogo?ts=636706112039062792
InDifferentTenant : True
Scopes : {@{label=Sign you in and read your profile; description=Allows you to sign in to the app with your work account and
let the app read your profile. It also allows the app to read basic company information.; adminLabel=Sign in and rea
d user profile; adminDescription=Allows users to sign in to the app, and allows the app to read the profile of signe
d-in users. It also allow the app to read basic company information of signed-in users.}}
ReplyUrls : {https://www.gerenios.com}
#>
[cmdletbinding()]
Param(
[Parameter(Mandatory=$True)]
[String]$ClientId,
[System.Management.Automation.PSCredential]$Credentials,
[Parameter(Mandatory=$False)]
[System.Security.Cryptography.X509Certificates.X509Certificate2]$Certificate,
[Parameter(Mandatory=$False)]
[string]$PfxFileName,
[Parameter(Mandatory=$False)]
[string]$PfxPassword,
[Parameter(Mandatory=$False)]
[string]$OTPSecretKey,
[Parameter(Mandatory=$False)]
[string]$TAP,
[Parameter(Mandatory=$False)]
[string]$RefreshTokenCredential
)
Process
{
# Get the config using the provided credentials
$config = Get-AuthorizationCode -ClientId $ClientId -Tenant "common" -AppConsent -OTPSecretKey $OTPSecretKey -TAP $TAP -RefreshTokenCredential $RefreshTokenCredential -Certificate $Certificate -PfxFileName $PfxFileName -PfxPassword $PfxPassword -Credentials $Credentials
if($config -eq $null)
{
Throw "Unable to get app information"
}
$appInfo = [pscustomobject][ordered]@{
"Name" = $config.sAppName
"VerifiedPublisher" = $config.sAppVerifiedPublisherName
"WebSite" = $config.sAppWebsite
"Created" = $config.sAppCreatedDate
#"Settings" = $config.urlAppSettings
"TermsOfService" = $config.urlAppTermsOfService
"PrivacyStatement" = $config.urlAppPrivacyStatement
"Logo" = $config.urlAppLogo
"InDifferentTenant" = $config.fAppInDifferentTenant
"Scopes" = $config.arrScopes
"ReplyUrls" = $config.arrAppReplyUrls
}
if([string]::IsNullOrEmpty($appInfo.Name))
{
Write-Warning "No information returned, maybe app is already consented?"
}
else
{
return $appInfo
}
}
}
# Dec 12th 2024
# Returns ESTSAUTH cookies
function Get-ESTSAUTHCookie
{
<#
.SYNOPSIS
Returns ESTSAUTH or ESTSAUTHPERSISTENT cookie
.DESCRIPTION
Returns ESTSAUTH or ESTSAUTHPERSISTENT cookie
.PARAMETER Persistent
Get ESTSAUTHPERSISTENT cookie
.Example
PS C:\>$ESTSAUTH = Get-AADIntESTSAUTHCookie
PS C:\>Get-AADIntAccessToken -ClientID "1b730954-1685-4b74-9bfd-dac224a7b894" -Resource "https://graph.windows.net" -ESTSAUTH $ESTSAUTH
.Example
PS C:\>$ESTSAUTH = Get-AADIntESTSAUTHCookie -Persistent
PS C:\>Get-AADIntAccessToken -ClientID "1b730954-1685-4b74-9bfd-dac224a7b894" -Resource "https://graph.windows.net" -ESTSAUTH $ESTSAUTH
.Example
PS C:\>$ESTSAUTH = Get-AADIntESTSAUTHCookie -Persistent -ForceMFA
PS C:\>Get-AADIntAccessToken -ClientID "1b730954-1685-4b74-9bfd-dac224a7b894" -Resource "https://graph.windows.net" -ESTSAUTH $ESTSAUTH
#>
[cmdletbinding()]
Param(
[Parameter(Mandatory=$False)]
[String]$Resource = "https://graph.windows.net",
[Parameter(Mandatory=$False)]
[String]$ClientId = "1b730954-1685-4b74-9bfd-dac224a7b894",
[Parameter(Mandatory=$False)]
[String]$Tenant = "Common",
[Parameter(Mandatory=$False)]
[switch]$ForceMFA,
[Parameter(Mandatory=$False)]
[switch]$ForceNGCMFA,
[Parameter(Mandatory=$False)]
[string]$RefreshTokenCredential,
[Parameter(Mandatory=$False)]
[System.Management.Automation.PSCredential]$Credentials,
[Parameter(Mandatory=$False)]
[string]$OTPSecretKey,
[Parameter(Mandatory=$False)]
[string]$TAP,
[Parameter(Mandatory=$False)]
[string]$RedirectURI,
[Parameter(Mandatory=$False)]
[string]$SubScope,
[Parameter(Mandatory=$False)]
[switch]$Persistent
)
Process
{
# Set AMR values as needed
$amr = $null
if($ForceMFA)
{
$amr = "mfa"
}
elseif($ForceNGCMFA)
{
$amr = "ngcmfa"
}
Get-AuthorizationCode -Resource $Resource -ClientId $ClientId -Tenant $Tenant -AMR $amr -RefreshTokenCredential $RefreshTokenCredential -Credentials $Credentials -OTPSecretKey $OTPSecretKey -TAP $TAP -RedirectURI $RedirectURI -SubScope $SubScope -DumpESTSAUTH -KMSI $Persistent
}
}