KnowBe4.psm1

#Region Account
function Get-KnowBe4Account {
    Param(
        [CmdletBinding()]

        [Parameter(Mandatory = $true,
            HelpMessage = "If your server URL is training.knowbe4.com, your base URL is 'US'. If your server URL is eu.knowbe4.com, your base URL is 'EU.'")]
        [ValidateSet('US', 'EU')]
        [String]$BaseURL,

        [Parameter(Mandatory = $true,
            HelpMessage = "This token is generated by KnowBe4 and accessible from your Account Settings page under 'API.' You must check 'Enable API Access' to use this token.")]
        [String]$AccessToken,

        [Parameter(Mandatory = $false,
            HelpMessage = "Include the entire risk score history of your organization. If this parameter isn't used, six months of data will show by default.")]
        [Switch]$Full
    )

    $BaseURL = $BaseURL.ToUpper()
    switch ($BaseURL) {
        'US' { $URL = 'https://us.api.knowbe4.com/v1/account' }
        'EU' { $URL = 'https://eu.api.knowbe4.com/v1/account' }
    }

    if ($Full) {
        $URL = $URL + '?full=true'
    }

    $authorizationHeader = "Authorization: Bearer $AccessToken"
    $response = curl.exe --url $URL --header $authorizationHeader --silent

    return ($response | ConvertFrom-Json)
}
#EndRegion Account

#Region Users
function Get-KnowBe4User {
    Param(
        [CmdletBinding()]
        
        [Parameter(Mandatory = $true,
            HelpMessage = "If your server URL is training.knowbe4.com, your base URL is 'US'. If your server URL is eu.knowbe4.com, your base URL is 'EU.'")]
        [ValidateSet('US', 'EU')]
        [String]$BaseURL,

        [Parameter(Mandatory = $true,
            HelpMessage = "This token is generated by KnowBe4 and accessible from your Account Settings page under 'API.' You must check 'Enable API Access' to use this token.")]
        [String]$AccessToken,

        [Parameter(Mandatory = $false,
            HelpMessage = "Return all users of this status. Ex. Active, Archived.")]
        [ValidateSet('Active', 'Archived')]
        [String]$Status,

        [Parameter(Mandatory = $false,
            HelpMessage = "Get a specific user.")]
        [String]$UserID,

        [Parameter(Mandatory = $false,
            HelpMessage = "Specify a user group to return.")]
        [String]$GroupID,

        [Parameter(Mandatory = $false,
            HelpMessage = "Expands groups to provide additional details.")]
        [Switch]$Expand
    )

    $BaseURL = $BaseURL.ToUpper()
    switch ($BaseURL) {
        'US' { $URL = 'https://us.api.knowbe4.com/v1/users' }
        'EU' { $URL = 'https://eu.api.knowbe4.com/v1/users' }
    }

    # Conflicts
    if ($GroupID -and $UserID) {
        Write-Error 'UserID and GroupID are not compatible. Use one or the other.'
        Break
    }

    if ($Status -and $GroupID -or $Status -and $UserID) {
        Write-Error 'Status and GroupID/UserID is not compatible.'
        Break
    }

    # URL modification
    if ($Status) {
        $Status = $Status.ToLower()
        $URL = $URL + "?status=$Status"
    }    

    if ($UserID) {
        $URL = $URL + "/$UserID"
    }

    if ($GroupID) {
        $URL = $URL + "/$GroupID/members"
    }

    if ($Expand) {
        if ($URL -match '\?') {
            $URL = $URL + '&expand=group'
        }
        else {
            $URL = $URL + '?expand=group'
        }
    }

    $authorizationHeader = "Authorization: Bearer $AccessToken"
    $response = curl.exe --url $URL --header $authorizationHeader --silent

    return ($response | ConvertFrom-Json)
}
#EndRegion Users

#Region Groups
function Get-KnowBe4Group {
    Param(
        [CmdletBinding()]
        
        [Parameter(Mandatory = $true,
            HelpMessage = "If your server URL is training.knowbe4.com, your base URL is 'US'. If your server URL is eu.knowbe4.com, your base URL is 'EU.'")]
        [ValidateSet('US', 'EU')]
        [String]$BaseURL,

        [Parameter(Mandatory = $true,
            HelpMessage = "This token is generated by KnowBe4 and accessible from your Account Settings page under 'API.' You must check 'Enable API Access' to use this token.")]
        [String]$AccessToken,

        [Parameter(Mandatory = $false,
            HelpMessage = "Return all users of this status. Ex. Active, Archived.")]
        [ValidateSet('Active', 'Archived')]
        [String]$Status,

        [Parameter(Mandatory = $false,
            HelpMessage = "Specific group to return.")]
        [String]$GroupID
    )

    $BaseURL = $BaseURL.ToUpper()
    switch ($BaseURL) {
        'US' { $URL = 'https://us.api.knowbe4.com//v1/groups' }
        'EU' { $URL = 'https://eu.api.knowbe4.com//v1/groups' }
    }

    if ($Status -and $GroupID) {
        Write-Error 'Status and GroupID are not compatible.'
        Break
    }

    if ($GroupID) {
        $URL = $URL + "/$GroupID"   
    }

    if ($Status) {
        $Status = $Status.ToLower()
        $URL = $URL + "?status=$Status"
    }
    
    $authorizationHeader = "Authorization: Bearer $AccessToken"
    $response = curl.exe --url $URL --header $authorizationHeader --silent

    return ($response | ConvertFrom-Json)
}
#EndRegion Groups

#Region Phishing
function Get-PhishingCampaign {
    Param(
        [CmdletBinding()]
        
        [Parameter(Mandatory = $true,
            HelpMessage = "If your server URL is training.knowbe4.com, your base URL is 'US'. If your server URL is eu.knowbe4.com, your base URL is 'EU.'")]
        [ValidateSet('US', 'EU')]
        [String]$BaseURL,

        [Parameter(Mandatory = $true,
            HelpMessage = "This token is generated by KnowBe4 and accessible from your Account Settings page under 'API.' You must check 'Enable API Access' to use this token.")]
        [String]$AccessToken,

        [Parameter(Mandatory = $false,
            HelpMessage = 'Specific phishing campaign to return.')]
        [String]$CampaignID
    )

    $BaseURL = $BaseURL.ToUpper()
    switch ($BaseURL) {
        'US' { $URL = 'https://us.api.knowbe4.com/v1/phishing/campaigns' }
        'EU' { $URL = 'https://eu.api.knowbe4.com/v1/phishing/campaigns' }
    }

    if ($CampaignID) {
        $URL = $URL + "/$CampaignID"
    }

    $authorizationHeader = "Authorization: Bearer $AccessToken"
    $response = curl.exe --url $URL --header $authorizationHeader --silent

    return ($response | ConvertFrom-Json)
}

function Get-PhishingSecurityTest {
    Param(
        [CmdletBinding()]
        
        [Parameter(Mandatory = $true,
            HelpMessage = "If your server URL is training.knowbe4.com, your base URL is 'US'. If your server URL is eu.knowbe4.com, your base URL is 'EU.'")]
        [ValidateSet('US', 'EU')]
        [String]$BaseURL,

        [Parameter(Mandatory = $true,
            HelpMessage = "This token is generated by KnowBe4 and accessible from your Account Settings page under 'API.' You must check 'Enable API Access' to use this token.")]
        [String]$AccessToken,

        [Parameter(Mandatory = $false,
            HelpMessage = 'Returns a specific phishing security test.')]
        [String]$PstId,

        [Parameter(Mandatory = $false,
            HelpMessage = 'Specific a campaign from which to return all phishing security tests.')]
        [String]$CampaignID,

        [Parameter(Mandatory = $false,
            HelpMessage = 'Return all recpients of a specific phishing security test.')]
        [Switch]$Recipient
    )

    $BaseURL = $BaseURL.ToUpper()
    switch ($BaseURL) {
        'US' { $URL = 'https://us.api.knowbe4.com/v1/phishing/security_tests/' }
        'EU' { $URL = 'https://eu.api.knowbe4.com/v1/phishing/security_tests/' }
    }

    # Conflicts
    if ($CampaignID -and $PstId) {
        Write-Error 'CampaignID and Phishing Security Test ID are not compatible.'
        Break
    }

    if ($Recipient -and !($PstID)) {
        Write-Error 'Specify which campaign to return recipients for.'
        Break
    }

    # URL Modification
    if ($CampaignID) {
        $URL = $URL.Replace('security_tests/', "campaigns/$CampaignID/security_tests")
    }

    if ($PstId) {
        $URL = $URL + $PstId
    }

    if ($Recipient) {
        $URL = $URL + '/recipients'
    }

    $authorizationHeader = "Authorization: Bearer $AccessToken"
    $response = curl.exe --url $URL --header $authorizationHeader --silent

    return ($response | ConvertFrom-Json)
}
#EndRegion Phishing

#Region Training
function Get-TrainingCampaign {
    Param(
        [CmdletBinding()]
        
        [Parameter(Mandatory = $true,
            HelpMessage = "If your server URL is training.knowbe4.com, your base URL is 'US'. If your server URL is eu.knowbe4.com, your base URL is 'EU.'")]
        [ValidateSet('US', 'EU')]
        [String]$BaseURL,

        [Parameter(Mandatory = $true,
            HelpMessage = "This token is generated by KnowBe4 and accessible from your Account Settings page under 'API.' You must check 'Enable API Access' to use this token.")]
        [String]$AccessToken,

        [Parameter(Mandatory = $false,
            HelpMessage = 'A specific training campaign to reutrn.')]
        [String]$CampaignID
    )

    $BaseURL = $BaseURL.ToUpper()
    switch ($BaseURL) {
        'US' { $URL = 'https://us.api.knowbe4.com/v1/training/campaigns/' }
        'EU' { $URL = 'https://eu.api.knowbe4.com/v1/training/campaigns/' }
    }

    if ($CampaignID) {
        $URL = $URL + $CampaignID
    }

    $authorizationHeader = "Authorization: Bearer $AccessToken"    
    $response = curl.exe --url $URL --header $authorizationHeader --silent

    return ($response | ConvertFrom-Json)
}

function Get-TrainingEnrollment {
    Param(
        [CmdletBinding()]
        
        [Parameter(Mandatory = $true,
            HelpMessage = "If your server URL is training.knowbe4.com, your base URL is 'US'. If your server URL is eu.knowbe4.com, your base URL is 'EU.'")]
        [ValidateSet('US', 'EU')]
        [String]$BaseURL,
        
        [Parameter(Mandatory = $true,
            HelpMessage = "This token is generated by KnowBe4 and accessible from your Account Settings page under 'API.' You must check 'Enable API Access' to use this token.")]
        [String]$AccessToken,

        [Parameter(Mandatory = $false,
            HelpMessage = 'Return all training enrollments for a specific campaign.')]
        [String]$CampaignID,

        [Parameter(Mandatory = $false,
            HelpMessage = 'Return all training enrollments for a specific user.')]
        [String]$UserID
    )

    $BaseURL = $BaseURL.ToUpper()
    switch ($BaseURL) {
        'US' { $URL = 'https://us.api.knowbe4.com/v1/training/enrollments/' }
        'EU' { $URL = 'https://eu.api.knowbe4.com/v1/training/enrollments/' }
    }

    # Conflicts
    if ($CampaignID -and $UserID) {
        Write-Error 'CampaignID and UserID are not compatible.'
        Break
    }

    # URL Modifcation
    if ($CampaignID) {
        $URL = $URL + "?campaign_id=$CampaignID"
    }

    if ($UserID) {
        $URL = $URL + "?user_id=$UserID"
    }

    $authorizationHeader = "Authorization: Bearer $AccessToken"
    $response = curl.exe --url $URL --header $authorizationHeader --silent

    return ($response | ConvertFrom-Json)
}

#EndRegion Training