functions/discovery/New-TssDiscoverySource.ps1

function New-TssDiscoverySource {
    <#
    .SYNOPSIS
    Create a discovery source
 
    .DESCRIPTION
    Creates a discovery source with no scanners. Add scanners with Add-TssDiscoverySourceScanner.
    With -ActiveDirectory, creates an Active Directory discovery source for a domain instead, using the domain settings given.
    An Active Directory source is created active unless -Active:$false is given.
    Secret Server always creates the domain as an Active Directory domain with the user principal name import format.
 
    .PARAMETER TssSession
    TssSession object created by New-TssSession for authentication
 
    .PARAMETER DiscoverySourceType
    Type of discovery source to create
 
    .PARAMETER Name
    Discovery source name
 
    .PARAMETER SiteId
    ID of the site that runs the scanners of the source (Get-TssSite)
 
    .PARAMETER SecretId
    ID of the secret used as the default discovery credential of the source; required with -ActiveDirectory
 
    .PARAMETER ActiveDirectory
    Create an Active Directory discovery source
 
    .PARAMETER Active
    Create the Active Directory source active (default true)
 
    .PARAMETER DiscoverSpecificOUs
    Only discover the OUs in the filter of the source
 
    .PARAMETER MachineNameResolutionType
    How discovered machines are named: UseMachineNameAndFQDM or OnlyUseMachineName
 
    .PARAMETER FullyQualifiedDomainName
    Fully qualified name of the domain, for example corp.example.com
 
    .PARAMETER FriendlyName
    Display name of the domain
 
    .PARAMETER UseSecureLdap
    Connect to the domain with LDAPS
 
    .EXAMPLE
    $session = New-TssSession -SecretServer https://alpha -Credential $ssCred
    New-TssDiscoverySource -TssSession $session -Name 'Linux servers' -DiscoverySourceType Unix -SiteId 1
 
    Create a Unix discovery source run by site 1
 
    .EXAMPLE
    $session = New-TssSession -SecretServer https://alpha -Credential $ssCred
    New-TssDiscoverySource -TssSession $session -ActiveDirectory -Name 'Corp domain' -FullyQualifiedDomainName corp.example.com -FriendlyName CORP -SecretId 42 -SiteId 1
 
    Create an Active Directory discovery source for corp.example.com that scans with secret 42
 
    .LINK
    https://thycotic-ps.github.io/thycotic.secretserver/commands/discovery/New-TssDiscoverySource
 
    .LINK
    https://github.com/thycotic-ps/thycotic.secretserver/blob/main/src/functions/discovery/New-TssDiscoverySource.ps1
 
    .NOTES
    Requires TssSession object returned by New-TssSession
    #>

    [CmdletBinding(DefaultParameterSetName = 'Default', SupportsShouldProcess)]
    [OutputType('Thycotic.PowerShell.Discovery.Source')]
    param (
        [Parameter(Mandatory, ValueFromPipeline, Position = 0)]
        [Thycotic.PowerShell.Authentication.Session]
        $TssSession,

        [Parameter(Mandatory, ParameterSetName = 'Default')]
        [ValidateSet('Unix', 'ODBC', 'FileLoad', 'ManualInput', 'ESX', 'ActiveDirectory', 'PowerShell', 'AmazonWebService', 'GoogleCloudProvider', 'EntraId')]
        [string]
        $DiscoverySourceType,

        [Parameter(Mandatory, ParameterSetName = 'Default')]
        [Parameter(Mandatory, ParameterSetName = 'ActiveDirectory')]
        [string]
        $Name,

        [Parameter(Mandatory, ParameterSetName = 'Default')]
        [Parameter(Mandatory, ParameterSetName = 'ActiveDirectory')]
        [int]
        $SiteId,

        [Parameter(ParameterSetName = 'Default')]
        [Parameter(Mandatory, ParameterSetName = 'ActiveDirectory')]
        [int]
        $SecretId,

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

        [Parameter(ParameterSetName = 'ActiveDirectory')]
        [switch]
        $Active,

        [Parameter(ParameterSetName = 'ActiveDirectory')]
        [switch]
        $DiscoverSpecificOUs,

        [Parameter(ParameterSetName = 'ActiveDirectory')]
        [ValidateSet('UseMachineNameAndFQDM', 'OnlyUseMachineName')]
        [string]
        $MachineNameResolutionType,

        [Parameter(ParameterSetName = 'ActiveDirectory')]
        [string]
        $FullyQualifiedDomainName,

        [Parameter(ParameterSetName = 'ActiveDirectory')]
        [string]
        $FriendlyName,

        [Parameter(ParameterSetName = 'ActiveDirectory')]
        [switch]
        $UseSecureLdap
    )
    begin {
        $tssParams = $PSBoundParameters
        $invokeParams = . $GetInvokeApiParams $TssSession
    }
    process {
        Get-TssInvocation $PSCmdlet.MyInvocation
        if ($tssParams.ContainsKey('TssSession') -and $TssSession.IsValidSession()) {
            Compare-TssVersion $TssSession '10.9.000000' $PSCmdlet.MyInvocation
            switch ($PSCmdlet.ParameterSetName) {
                'ActiveDirectory' {
                    $uri = $TssSession.ApiUrl, 'discovery', 'source', 'active-directory' -join '/'
                    $body = @{
                        data = @{
                            name               = $Name
                            siteId             = $SiteId
                            secretId           = $SecretId
                            discoveryScannerId = 'ActiveDirectory'
                            active             = (-not $tssParams.ContainsKey('Active')) -or [boolean]$Active
                        }
                    }
                    $settings = @{ }
                    switch ($tssParams.Keys) {
                        'DiscoverSpecificOUs' {
                            $body.data.Add('discoverSpecificOUs', [boolean]$DiscoverSpecificOUs)
                        }
                        'MachineNameResolutionType' {
                            $body.data.Add('machineNameResolutionType', $MachineNameResolutionType)
                        }
                        'FullyQualifiedDomainName' {
                            $settings.Add('fullyQualifiedDomainName', $FullyQualifiedDomainName)
                        }
                        'FriendlyName' {
                            $settings.Add('friendlyName', $FriendlyName)
                        }
                        'UseSecureLdap' {
                            $settings.Add('useSecureLDAP', [boolean]$UseSecureLdap)
                        }
                    }
                    if ($settings.Count -gt 0) {
                        $body.data.Add('discoverySourceSettings', $settings)
                    }
                }
                default {
                    $uri = ($TssSession.ApiUrl -replace '/api/v1$','/api/v2'), 'discovery', 'source' -join '/'
                    $body = @{
                        data = @{
                            discoverySourceType = $DiscoverySourceType
                            name                = $Name
                            siteId              = $SiteId
                        }
                    }
                    if ($tssParams.ContainsKey('SecretId')) {
                        $body.data.Add('secretId', $SecretId)
                    }
                }
            }
            $invokeParams.Body = $body | ConvertTo-Json -Depth 100
            $invokeParams.Uri = $uri
            $invokeParams.Method = 'POST'
            if ($PSCmdlet.ShouldProcess("Discovery source: $Name", "$($invokeParams.Method) $uri with:`n$($invokeParams.Body)`n")) {
                Write-Verbose "Performing the operation $($invokeParams.Method) $uri with:`n$($invokeParams.Body)`n"
                try {
                    $apiResponse = Invoke-TssApi @invokeParams
                    $restResponse = . $ProcessResponse $apiResponse
                } catch {
                    Write-Warning 'Issue with New-TssDiscoverySource request'
                    $err = $_
                    . $ErrorHandling $err
                }
                if ($restResponse) {
                    [Thycotic.PowerShell.Discovery.Source](. $FilterTssResponse $restResponse ([Thycotic.PowerShell.Discovery.Source]))
                }
            }
        } else {
            Write-Warning 'No valid session found'
        }
    }
}