functions/Tenant/Search-OspreyTenantActivityByIP.ps1

Function Search-OspreyTenantActivityByIP {
    <#
.SYNOPSIS
    Gathers logon activity based on a submitted IP Address.
.DESCRIPTION
    Pulls logon activity from the Unified Audit log based on a provided IP address.
    Processes the data to highlight successful logons and the number of users accessed by a given IP address.
.PARAMETER IPaddress
    IP address to investigate
.OUTPUTS
    All_Events.csv \ All_Events.xml \ All_Events.json
    Login_Success_Events.csv \ Login_Success_Events.xml \ Login_Success_Events.json
    Login_Failure_Events.csv \ Login_Failure_Events.xml \ Login_Failure_Events.json
    Unique_Users_Login.csv \ Unique_Users_Login.xml \ Unique_Users_Login.json
.EXAMPLE
    Search-OspreyTenantActivityByIP -IPAddress 10.234.20.12
    Searches for all Logon activity from IP 10.234.20.12.
#>

    param
    (
        [parameter(Mandatory = $true)]
        [string]$IpAddress
    )

    Test-EXOConnection
    $InformationPreference = "Continue"

    # Replace an : in the IP address with . since : isn't allowed in a directory name
    $DirectoryName = $IpAddress.replace(":", ".")

    # Make sure we got only a single IP address
    if ($IpAddress -like "*,*") {
        Out-LogFile "Please provide a single IP address to search."
        Write-Error -Message "Please provide a single IP address to search." -ErrorAction Stop
    }

    Out-LogFile ("Searching for login events related to " + $IpAddress) -action

    ##Gather all of the events related to these IP addresses##
    Out-LogFile ("Hold tight, this may take some time...")

    [array]$ipevents = Get-AllUnifiedAuditLogEntry -UnifiedSearch ("Search-UnifiedAuditLog -RecordType AzureActiveDirectoryStsLogon -IPAddresses " + $IPAddress )

    # If we didn't get anything back log it
    if ($null -eq $ipevents) {
        Out-LogFile ("No IP login events found for IP "    + $IpAddress)
    }
    # If we did then process it
    else {

        ##Expand out the Data and convert from JSON##
        [array]$ipeventsexpanded = $ipevents | Select-object -ExpandProperty AuditData | ConvertFrom-Json
        Out-LogFile ("Found " + $ipeventsexpanded.count + " related to provided IP" )
        $ipeventsexpanded | Out-MultipleFileType -FilePrefix "All_Login_Events" -csv -json -xml -User $DirectoryName

        ##Get the logon events that were a success##
        [array]$successipevents = $ipeventsexpanded | Where-Object { $_.Operation -eq "UserLoggedIn" }
        if ($null -eq $successipevents) {
            Out-LogFile ("No successful logon events found for IP "    + $IpAddress)
        }
        else {
            Out-LogFile ("Found " + $successipevents.Count + " successful logons related to provided IP")
            $successipevents | Out-MultipleFileType -FilePrefix "Login_Success_Events" -csv -json -xml -User $DirectoryName
        }

        ##Get the logon events that were a failure##
        [array]$failedipevents = $ipeventsexpanded | Where-Object { $_.Operation -eq "UserLoginFailed" }
        if ($null -eq $successipevents) {
            Out-LogFile ("No failed logon events found for IP "    + $IpAddress)
        }
        else {
            Out-LogFile ("Found " + $failedipevents.Count + " failed logons related to provided IP")
            $failedipevents | Out-MultipleFileType -FilePrefix "Login_Failure_Events" -csv -json -xml -User $DirectoryName
        }

        # Select all unique users accessed by this IP
        [array]$uniqueuserlogons = Select-UniqueObject -ObjectArray $ipeventsexpanded -Property "UserID"
        Out-LogFile ("IP " + $ipaddress + " has tried to access " + $uniqueuserlogons.count + " users") -notice
        $uniqueuserlogons | Out-MultipleFileType -FilePrefix "Unique_Users_Login" -csv -json -User $DirectoryName -Notice

    }

}