functions/Connect-XdrByBrowser.ps1
|
function Connect-XdrByBrowser { <# .SYNOPSIS Authenticates to Microsoft Defender XDR using an interactive browser sign-in. .DESCRIPTION Launches a dedicated Chromium-based browser profile, waits for you to complete the browser sign-in flow, captures the resulting authentication cookies, and establishes the Defender XDR session. This browser-driven flow is intended for interactive authentication branches such as FIDO2/passkeys and Temporary Access Pass. By default the cmdlet uses a dedicated secondary browser profile so browser and device state can participate in authentication without reusing the user's primary profile. On macOS and Linux, this cmdlet remains interactive. Complete any browser prompts until Microsoft Defender XDR finishes loading so the cmdlet can capture the final session cookies. .PARAMETER Username Optional username to display while completing the browser sign-in. If omitted, the browser sign-in flow lets you choose an account interactively. .PARAMETER TenantId Optional tenant ID to use when bootstrapping the Defender XDR session. .PARAMETER TimeoutSeconds Maximum time to wait for the browser sign-in to complete. .PARAMETER BrowserPath Optional browser executable path or command name. When omitted, a supported Chromium-based browser is auto-discovered. .PARAMETER ProfilePath Optional dedicated browser profile path. When omitted, a default secondary profile location is used. .PARAMETER ResetProfile Clears the dedicated browser profile before launching the sign-in flow. .PARAMETER PrivateSession Uses a temporary private/incognito browser session instead of the default dedicated profile. .PARAMETER UserAgent Optional User-Agent override for the launched browser. .EXAMPLE Connect-XdrByBrowser -Username 'admin@contoso.com' Launches the browser sign-in flow and connects to Defender XDR. #> [Diagnostics.CodeAnalysis.SuppressMessageAttribute('PSAvoidUsingWriteHost', '')] [CmdletBinding()] param( [string]$Username, [string]$TenantId, [ValidateRange(30, 1800)] [int]$TimeoutSeconds = 300, [string]$BrowserPath, [string]$ProfilePath, [switch]$ResetProfile, [switch]$PrivateSession, [string]$UserAgent ) process { if ($PrivateSession -and $ProfilePath) { throw 'Do not combine -PrivateSession with -ProfilePath. Private session uses a temporary profile automatically.' } $authParams = @{ TimeoutSeconds = $TimeoutSeconds } if ($PSBoundParameters.ContainsKey('Username')) { $authParams.Username = $Username } if ($TenantId) { $authParams.TenantId = $TenantId } if ($BrowserPath) { $authParams.BrowserPath = $BrowserPath } if ($ProfilePath) { $authParams.ProfilePath = $ProfilePath } if ($ResetProfile) { $authParams.ResetProfile = $true } if ($PrivateSession) { $authParams.PrivateSession = $true } if ($UserAgent) { $authParams.UserAgent = $UserAgent } $browserAuth = Invoke-XdrBrowserAuthentication @authParams if (-not $browserAuth) { throw 'Browser sign-in failed - no authentication cookies were returned.' } $estsAuthCookieValue = if ($browserAuth -is [string]) { $browserAuth } else { $browserAuth.EstsAuthCookieValue } $sccAuthCookieValue = if ($browserAuth -is [string]) { $null } else { $browserAuth.SccAuthCookieValue } $xsrfToken = if ($browserAuth -is [string]) { $null } else { $browserAuth.XsrfToken } return Connect-XdrAuthArtifactSet -EstsAuthCookieValue $estsAuthCookieValue -SccAuthCookieValue $sccAuthCookieValue -XsrfToken $xsrfToken -TenantId $TenantId -ConnectionPreference PreferEsts -FallbackToPortalOnEstsBootstrapFailure -FailureLabel 'Browser sign-in' } } |