DeviceABQ.ps1

if (-not (Get-Command Get-Connection -ErrorAction Ignore))
{
  . (Join-Path -Path $PSScriptRoot -ChildPath "shared.ps1")
}

function Get-Object($obj)
{
  if ($obj)
  {
    return $obj
  }
  return $null
}

class CASMailboxSource
{
  [string]$name = "CASMailbox"
  [string]$email
  CASMailboxSource([string]$email)
  {
    $this.email = $email
  }
  [object]GetSettings()
  {
    return Get-Object(Get-CASMailbox -Identity $this.email)
  }
}

class MobileDeviceSource
{
  [string]$name = "Mobile Device"
  [string]$email
  MobileDeviceSource([string]$email)
  {
    $this.email = $email
  }  
  [object]GetSettings()
  {
    return Get-Object(Get-MobileDevice -Mailbox $this.email)
  }
}

class MobileDeviceStatisticsSource
{
  [string]$name = "Mobile Device Statistics"
  [string]$email
  MobileDeviceStatisticsSource([string]$email)
  {
    $this.email = $email
  }  
  [object]GetSettings()
  {
    return Get-Object(Get-MobileDeviceStatistics -Mailbox $this.email)
  }
}

class MobileDeviceMailboxPolicySource
{
  [string]$name = "Mobile Device Mailbox Policy"
  [object]GetSettings()
  {
    return Get-Object(Get-MobileDeviceMailboxPolicy)
  }
}

class AccessRuleSource
{
  [string]$name = "ActiveSync Device Access Rule"
  [object]GetSettings()
  {
    return Get-Object(Get-ActiveSyncDeviceAccessRule)
  }
}

class OrganizationSettingsSource
{
  [string]$name = "ActiveSync Organization Settings"
  [object]GetSettings()
  {
    return Get-Object(Get-ActiveSyncOrganizationSettings)
  }
}

function Get-Settings($source, [string]$logPath)
{
  $sw = [System.Diagnostics.StopWatch]::new()
  $sw.Start()
  $settings = $source.GetSettings()
  $totalMs = $sw.ElapsedMilliseconds
  $sw.Stop()
  if (-not $settings)
  {
    $cnt = 0
  }
  elseif (-not $settings.Count)
  {
    $cnt = 1
  }
  else
  {
    $cnt = $settings.Count
  }
  $text = "It takes {0}ms to fetch {1} {2}." -f $totalMs, $cnt, $source.name
  Write-Log -obj $text -path $logPath
  Write-Log -obj $settings -path $logPath
  return $settings
}

<#
.SYNOPSIS
    Get Mobile Device Access Rule relevant settings.
.DESCRIPTION
    This cmdlet returns Mobile Device Access Rule relevant settings.
.EXAMPLE
    PS C:\>Get-AbqSettings -Mailbox user@contoso.com
    PS C:\>Get-AbqSettings -Mailbox user@contoso.com -LogPath d:\logs\abq.log
#>

function Get-AbqSettings
{
  param
  (
    [Parameter(Mandatory=$true)] [string]$Mailbox,
    [string]$LogPath = "logs\abq.log"
  )
  process
  {
    $text = "{0}: collecing ABQ settings for user {1}." -f (Get-Date).ToString("O"), $Mailbox
    Write-Log -obj $text -path $LogPath -toConsole

    Get-ExoConnection
    $cas = Get-Settings -source ([CASMailboxSource]::new($Mailbox)) -logPath $LogPath
    if (-not $cas)
    {
      $text = "The mailbox {0} is not found." -f $Mailbox
      Write-Log -obj $text -path $LogPath -toConsole
    }

    $null = Get-Settings -source ([MobileDeviceSource]::new($Mailbox)) -logPath $LogPath
    $null = Get-Settings -source ([MobileDeviceStatisticsSource]::new($Mailbox)) -logPath $LogPath
    $null = Get-Settings -source ([MobileDeviceMailboxPolicySource]::new()) -logPath $LogPath
    $null = Get-Settings -source ([AccessRuleSource]::new()) -logPath $LogPath
    $null = Get-Settings -source ([OrganizationSettingsSource]::new()) -logPath $LogPath
    
    Write-Log -obj "ABQ settings successfully collected." -path $LogPath -toConsole
  }
}