Public/Connect-WindowsDeviceLink.ps1

function Connect-WindowsDeviceLink {
    [CmdletBinding(DefaultParameterSetName = 'Interactive')]
    param(
        [Parameter(Mandatory, ParameterSetName = 'Interactive')]
        [Parameter(Mandatory, ParameterSetName = 'DeviceCode')]
        [Parameter(Mandatory, ParameterSetName = 'Certificate')]
        [Parameter(Mandatory, ParameterSetName = 'CertificateThumbprint')]
        [Parameter(Mandatory, ParameterSetName = 'CertificateSubjectName')]
        [Parameter(Mandatory, ParameterSetName = 'ClientSecret')]
        [ValidateNotNullOrEmpty()]
        [string]$TenantId,

        [Parameter(ParameterSetName = 'Interactive')]
        [Parameter(Mandatory, ParameterSetName = 'Certificate')]
        [Parameter(Mandatory, ParameterSetName = 'CertificateThumbprint')]
        [Parameter(Mandatory, ParameterSetName = 'CertificateSubjectName')]
        [Parameter(Mandatory, ParameterSetName = 'ClientSecret')]
        [Parameter(ParameterSetName = 'ManagedIdentity')]
        [ValidateNotNullOrEmpty()]
        [string]$ClientId,

        [Parameter(ParameterSetName = 'Interactive')]
        [Parameter(ParameterSetName = 'DeviceCode')]
        [ValidateNotNullOrEmpty()]
        [string[]]$Scopes = @('DeviceManagementServiceConfig.ReadWrite.All'),

        [Parameter(Mandatory, ParameterSetName = 'DeviceCode')]
        [switch]$UseDeviceCode,

        [Parameter(Mandatory, ParameterSetName = 'AccessToken')]
        [ValidateNotNull()]
        [securestring]$AccessToken,

        [Parameter(Mandatory, ParameterSetName = 'Certificate')]
        [ValidateNotNull()]
        [System.Security.Cryptography.X509Certificates.X509Certificate2]$Certificate,

        [Parameter(Mandatory, ParameterSetName = 'CertificateThumbprint')]
        [ValidateNotNullOrEmpty()]
        [string]$CertificateThumbprint,

        [Parameter(Mandatory, ParameterSetName = 'CertificateSubjectName')]
        [ValidateNotNullOrEmpty()]
        [string]$CertificateSubjectName,

        [Parameter(ParameterSetName = 'Certificate')]
        [Parameter(ParameterSetName = 'CertificateThumbprint')]
        [Parameter(ParameterSetName = 'CertificateSubjectName')]
        [bool]$SendCertificateChain = $false,

        [Parameter(Mandatory, ParameterSetName = 'ClientSecret')]
        [ValidateNotNull()]
        [securestring]$ClientSecret,

        [Parameter(Mandatory, ParameterSetName = 'ManagedIdentity')]
        [Alias('ManagedIdentity')]
        [switch]$Identity,

        [Parameter(Mandatory, ParameterSetName = 'EnvironmentVariable')]
        [switch]$EnvironmentVariable,

        [ValidateNotNullOrEmpty()]
        [string]$Environment = 'Global',

        [ValidateRange(1, 600)]
        [double]$ClientTimeout = 100
    )

    Initialize-WindowsDeviceLinkOnline

    if (-not (Get-Command Connect-MgGraph -ErrorAction SilentlyContinue)) {
        throw 'Microsoft.Graph.Authentication is unavailable after dependency initialization.'
    }

    $parameters = @{ Environment = $Environment; ClientTimeout = $ClientTimeout; NoWelcome = $true }

    switch ($PSCmdlet.ParameterSetName) {
        'Interactive' {
            $parameters.TenantId = $TenantId
            $parameters.Scopes = $Scopes
            $parameters.ContextScope = 'Process'
            if ($ClientId) { $parameters.ClientId = $ClientId }
            if (Test-Path -LiteralPath 'HKLM:\SYSTEM\CurrentControlSet\Control\MiniNT') {
                Write-Warning 'Interactive browser authentication may not be available in WinPE. Use another supported authentication method if necessary.'
            }
        }
        'DeviceCode' {
            $parameters.TenantId = $TenantId
            $parameters.Scopes = $Scopes
            $parameters.ContextScope = 'Process'
            $parameters.UseDeviceCode = $true
        }
        'AccessToken' { $parameters.AccessToken = $AccessToken }
        'Certificate' {
            $parameters.TenantId = $TenantId; $parameters.ClientId = $ClientId; $parameters.Certificate = $Certificate
            $parameters.SendCertificateChain = $SendCertificateChain; $parameters.ContextScope = 'Process'
        }
        'CertificateThumbprint' {
            $parameters.TenantId = $TenantId; $parameters.ClientId = $ClientId; $parameters.CertificateThumbprint = $CertificateThumbprint
            $parameters.SendCertificateChain = $SendCertificateChain; $parameters.ContextScope = 'Process'
        }
        'CertificateSubjectName' {
            $parameters.TenantId = $TenantId; $parameters.ClientId = $ClientId; $parameters.CertificateSubjectName = $CertificateSubjectName
            $parameters.SendCertificateChain = $SendCertificateChain; $parameters.ContextScope = 'Process'
        }
        'ClientSecret' {
            $parameters.TenantId = $TenantId
            $parameters.ClientSecretCredential = New-Object System.Management.Automation.PSCredential($ClientId, $ClientSecret)
            $parameters.ContextScope = 'Process'
        }
        'ManagedIdentity' {
            $parameters.Identity = $true; $parameters.ContextScope = 'Process'
            if ($ClientId) { $parameters.ClientId = $ClientId }
        }
        'EnvironmentVariable' { $parameters.EnvironmentVariable = $true; $parameters.ContextScope = 'Process' }
        default { throw "Unsupported authentication parameter set: $($PSCmdlet.ParameterSetName)" }
    }

    Connect-MgGraph @parameters
}