MicrosoftGraphAPI.psm1

<#
.Synopsis
    Get a oAuth token to access Microsoft Graph API
.DESCRIPTION
    Get a oAuth token to access Microsoft Graph API. Token will be valid for 2 hours.
.EXAMPLE
    Get-GraphAuthToken -AADTenant "runbookguru.onmicrosoft.com" -ClientId "cdec3c46-b1cd-4ce7-859a-b6fac1ceafee" -RedirectUri "http://www.runbook.guru" -Credential (get-credential)
.NOTES
This is a preview/beta version. Please send any comments to jgs@coretech.dk
Developed by MVP Jakob Gottlieb Svendsen - jakob@runbook.guru - jgs@coretech.dk
.LINK
    http://graph.microsoft.io/
#>

function Get-GraphAuthToken {
    [CmdletBinding(DefaultParameterSetName = 'Default', 
        SupportsShouldProcess = $false, 
        PositionalBinding = $false,
        HelpUri = 'http://www.runbook.guru/')]
    param (
        [Parameter(Mandatory = $true, ParameterSetName = ’Connetion’)]
        [Hashtable] $Connection, 
        #Connection
        #"Name": "AADTenantName"
        #"Name": "ClientId"
        #"Name": "RedirectUri"
        #"Name": "UserName"
        #"Name": "Password"
        [Parameter(Mandatory = $true, ParameterSetName = ’Default’)] 
        [String] $AADTenant, 
        [Parameter(Mandatory = $true, ParameterSetName = ’Default’)]
        [String] $ClientId,
        [Parameter(Mandatory = $true, ParameterSetName = ’Default’)]
        [String]$RedirectUri,
        [Parameter(Mandatory = $true, ParameterSetName = ’Default’)]
        [PSCredential] $Credential
    )
   
    #On Connection
    if ($Connection) {   
        $AADTenant = $Connection.AADTenantName
        $ClientId = $Connection.ClientId
        $RedirectUri = $Connection.RedirectUri
    
        $username = $Connection.UserName
        $password = $Connection.Password | ConvertTo-SecureString -AsPlainText -Force
        $Credential = New-Object -typename System.Management.Automation.PSCredential -argumentlist $username, $password
    }
    
    $resourceAppIdURI = “https://graph.microsoft.com”
   
    $authority = “https://login.windows.net/$aadTenant”
   
    <#
   $authContext = New-Object "Microsoft.IdentityModel.Clients.ActiveDirectory.AuthenticationContext" -ArgumentList $authority
   $uc = new-object Microsoft.IdentityModel.Clients.ActiveDirectory.UserCredential -ArgumentList $Credential.Username,$Credential.Password
 
   $authResult = $authContext.AcquireToken($resourceAppIdURI, $clientId,$uc)
   #>

    try {
        $authContext = New-Object "Microsoft.IdentityModel.Clients.ActiveDirectory.AuthenticationContext" -ArgumentList $authority 
        $userCredentials = New-Object Microsoft.IdentityModel.Clients.ActiveDirectory.UserPasswordCredential -ArgumentList $Credential.Username, $Credential.Password
        $authResult = [Microsoft.IdentityModel.Clients.ActiveDirectory.AuthenticationContextIntegratedAuthExtensions]::AcquireTokenAsync($authContext, $resourceAppIdURI, $ClientId, $userCredentials);

        if ($authResult.Result.AccessToken) {
            return  $authResult.Result

        }
        elseif ($authResult.Exception) {
            throw "An error occured getting access token: $($authResult.Exception.InnerException)"
        }
    }
    catch { 
        throw $_.Exception.Message 
    }
   
}

<#
.Synopsis
    Invoke a request to the Microsoft Graph API
.DESCRIPTION
    Invoke a request to the Microsoft Graph API using the Token and setting content type to correct format (JSON)
.EXAMPLE
    $Token = Get-GraphAuthToken -AADTenant "runbookguru.onmicrosoft.com" -ClientId "cdec3c46-b1cd-4ce7-859a-b6fac1ceafee" -RedirectUri "http://www.runbook.guru" -Credential (get-credential)
    Invoke-GraphRequest -url "https://graph.microsoft.com/beta/subscriptions/303d5e85-d6c2-4c2d-9ed3-bd6b2fb5ecf1" -Token $Token -Method DELETE
.NOTES
    This is a preview/beta version. Please send any comments to jgs@coretech.dk
    Developed by MVP Jakob Gottlieb Svendsen - jakob@runbook.guru - jgs@coretech.dk
.LINK
    http://graph.microsoft.io/
#>

Function Invoke-GraphRequest {
    param($Token, $url, $Method, $Body)
    
    try {
        $headers = @{}
        $headers.Add('Authorization', 'Bearer ' + $Token.AccessToken)
        $headers.Add('Content-Type', "application/json")

        if ($Body) {
            $response = Invoke-WebRequest -Uri $url -Method $Method -Body $Body -Headers $headers -UseBasicParsing
        }
        else {
            $response = Invoke-WebRequest -Uri $url -Method $Method -Headers $headers -UseBasicParsing
        }

        return (ConvertFrom-Json $response.Content)
    }
    catch {
        $CurrentError = $error[0]
        #throw ($error[0].Exception.Response)
        if ($_.Exception.Response) {
            $result = $_.Exception.Response.GetResponseStream()
            $reader = New-Object System.IO.StreamReader($result)
            $responseBody = $reader.ReadToEnd();
            throw "Error: $($CurrentError.Exception.Message)`n $($CurrentError.InvocationInfo.PositionMessage) - Reponse:`n $responsebody"
        }
        else {
            throw $_
        }

    }
   
}

<#
.Synopsis
    Gets a subscription object from Microsoft Graph API
.DESCRIPTION
    Gets a subscription object from Microsoft Graph API
.EXAMPLE
    $Token = Get-GraphAuthToken -AADTenant "runbookguru.onmicrosoft.com" -ClientId "cdec3c46-b1cd-4ce7-859a-b6fac1ceafee" -RedirectUri "http://www.runbook.guru" -Credential (get-credential)
    Get-GraphSubscription -Token $Token -SubscriptionId "b539f640-7a5b-462e-960d-e7cb6a3460f6"
.NOTES
    This is a preview/beta version. Please send any comments to jgs@coretech.dk
    Developed by MVP Jakob Gottlieb Svendsen - jakob@runbook.guru - jgs@coretech.dk
.LINK
    http://graph.microsoft.io/
.LINK
    http://graph.microsoft.io/en-us/docs/api-reference/beta/resources/subscription/
.LINK
    http://graph.microsoft.io/en-us/docs/api-reference/beta/api/subscription_get/
#>

Function Get-GraphSubscription {
    [CmdletBinding()]
    param(
        [Parameter(Mandatory = $true)] 
        [Microsoft.IdentityModel.Clients.ActiveDirectory.AuthenticationResult] $Token, 
        [Parameter(Mandatory = $true)] 
        [String] $SubscriptionId
    )
  
    $url = "https://graph.microsoft.com/beta/subscriptions"
    $responseBody = Invoke-GraphRequest -url "https://graph.microsoft.com/beta/subscriptions/$SubscriptionId" -Token $Token -Method Get
    return $responseBody

}

<#
.Synopsis
    Creates a new subscription object in the Microsoft Graph API
.DESCRIPTION
    Creates a new subscription object in the Microsoft Graph API
.EXAMPLE
    $Token = Get-GraphAuthToken -AADTenant "runbookguru.onmicrosoft.com" -ClientId "cdec3c46-b1cd-4ce7-859a-b6fac1ceafee" -RedirectUri "http://www.runbook.guru" -Credential (get-credential)
    $webhook = "https://demo.azurewebsites.net/api/webhooks?code=dffdsfdj6pqfrldb6pghzxrihse1zm7vutbj4i&token=VYa2bgSAPCt9NoIx8%2f%2fmG2HrVMvp46vta5Zq6%2bo468Q%3d"
    $resource = "me/mailFolders('Inbox')/messages"
    New-GraphSubscription -Token $Token -ResourceUri $resource -WebhookUri $webhook -ChangeType Created,Deleted,Updated
.NOTES
This is a preview/beta version. Please send any comments to jgs@coretech.dk
Developed by MVP Jakob Gottlieb Svendsen - jakob@runbook.guru - jgs@coretech.dk
.LINK
    http://graph.microsoft.io/
.LINK
    http://graph.microsoft.io/en-us/docs/api-reference/beta/resources/subscription/
.LINK
    http://graph.microsoft.io/en-us/docs/api-reference/beta/api/subscription_post_subscriptions/
#>

Function New-GraphSubscription {
    [CmdletBinding()]
    param(
        [Parameter(Mandatory = $true)] 
        [Microsoft.IdentityModel.Clients.ActiveDirectory.AuthenticationResult] $Token, 
        [Parameter(Mandatory = $true)] 
        [String] $ResourceUri, 
        [Parameter(Mandatory = $true)] 
        [String] $WebhookUri, 
        [ValidateSet("Created", "Updated", "Deleted")]
        [String[]] $ChangeType = "Created", 
        [DateTime] $ExpiratetionDateTime = (get-date).ToUniversalTime().AddMinutes(4230), 
        [String] $ClientState = "DefaultClientState"
    )
  
    $url = "https://graph.microsoft.com/beta/subscriptions"

    $FormattedDate = $ExpiratetionDateTime.ToString("yyyy-MM-ddThh:mm:ss.FFFFFFFZ")

    $Request = @"
{
   "changeType": "$($ChangeType -join ",")",
   "notificationUrl": "$WebhookUri",
   "resource": "$ResourceUri",
   "expirationDateTime":"$FormattedDate",
   "clientState": "$ClientState"
}
"@


    $responseBody = Invoke-GraphRequest -Token $Token -url $Url -Method Post -Body $Request

    return $responseBody

}


<#
.Synopsis
    Removes a subscription object from Microsoft Graph API
.DESCRIPTION
    Removes a subscription object from Microsoft Graph API
.EXAMPLE
    $Token = Get-GraphAuthToken -AADTenant "runbookguru.onmicrosoft.com" -ClientId "cdec3c46-b1cd-4ce7-859a-b6fac1ceafee" -RedirectUri "http://www.runbook.guru" -Credential (get-credential)
    Remove-GraphSubscription -Token $Token -SubscriptionId "b539f640-7a5b-462e-960d-e7cb6a3460f6"
.NOTES
    This is a preview/beta version. Please send any comments to jgs@coretech.dk
    Developed by MVP Jakob Gottlieb Svendsen - jakob@runbook.guru - jgs@coretech.dk
.LINK
    http://graph.microsoft.io/
.LINK
    http://graph.microsoft.io/en-us/docs/api-reference/beta/resources/subscription/
.LINK
    http://graph.microsoft.io/en-us/docs/api-reference/beta/api/subscription_delete/
#>

Function Remove-GraphSubscription {
    [CmdletBinding()]
    param(
        [Parameter(Mandatory = $true)] 
        [Microsoft.IdentityModel.Clients.ActiveDirectory.AuthenticationResult] $Token, 
        [Parameter(Mandatory = $true)] 
        [String] $SubscriptionId
    )
  
    $url = "https://graph.microsoft.com/beta/subscriptions"
    $responseBody = Invoke-GraphRequest -url "https://graph.microsoft.com/beta/subscriptions/$SubscriptionId" -Token $Token -Method DELETE
    return $responseBody

}

<#
.Synopsis
Updates a subscription object in Microsoft Graph API
.DESCRIPTION
Updates a subscription object in Microsoft Graph API
.EXAMPLE
$Token = Get-GraphAuthToken -AADTenant "runbookguru.onmicrosoft.com" -ClientId "cdec3c46-b1cd-4ce7-859a-b6fac1ceafee" -RedirectUri "http://www.runbook.guru" -Credential (get-credential)
Remove-GraphSubscription -Token $Token -SubscriptionId "b539f640-7a5b-462e-960d-e7cb6a3460f6"
.NOTES
This is a preview/beta version. Please send any comments to jgs@coretech.dk
Developed by MVP Jakob Gottlieb Svendsen - jakob@runbook.guru - jgs@coretech.dk
.LINK
    http://graph.microsoft.io/
.LINK
    http://graph.microsoft.io/en-us/docs/api-reference/beta/resources/subscription/
.LINK
    http://graph.microsoft.io/en-us/docs/api-reference/beta/api/subscription_update/
#>

Function Update-GraphSubscription {
    [CmdletBinding()]
    param(
        [Parameter(Mandatory = $true)] 
        [Microsoft.IdentityModel.Clients.ActiveDirectory.AuthenticationResult] $Token, 
        [Parameter(Mandatory = $true)] 
        [String] $SubscriptionId,
        [DateTime] $ExpiratetionDateTime = (get-date).ToUniversalTime().AddMinutes(4230)
    )
  
    $url = "https://graph.microsoft.com/beta/subscriptions"
    $FormattedDate = $ExpiratetionDateTime.ToString("yyyy-MM-ddThh:mm:ss.FFFFFFFZ")

    
    $Request = @"
    {
       "expirationDateTime":"$FormattedDate",
    }
"@


    $responseBody = Invoke-GraphRequest -url "https://graph.microsoft.com/beta/subscriptions/$SubscriptionId" -Token $Token -Method PATCH -Body $Request
    return $responseBody

}