Functions/Create/New-SOCatClient.psm1

#region: New-SOCatClient
<#
    .Synopsis
    Create a StoreOnce Catalyst Client on your StoreOnce system.
 
    .Description
    Create a StoreOnce Catalyst Client on all Service Sets on your StoreOnce system.
     
    .Parameter Server
    IP Address oder DNS Name of your StoreOnce system like defined via Connect-SOAppliance (check Get-SOConnections).
 
    .Parameter SOCatClientName
    Name for the new Client on your StoreOnce system.
 
    .Parameter SOCatClientPass
    Password for the new Client on your StoreOnce system.
 
    .Parameter SOCatClientCredential
    Name and Password per "Get-Credential" for the new Client on your StoreOnce system.
 
    .Parameter SOCatClientDesc
    Description for the new Client on your StoreOnce system.
 
    .Parameter Timeout
    Timeout for the Client creation process (Default is 30 Seconds).
 
    .Example
    New-SOCatClient -Server 192.168.2.1 -SOCatClientName MyNewClient -SOCatClientPass MyNewClientPass!!
 
    .Example
    New-SOCatClient -Server 192.168.2.1 -SOCatClientCredential (Get-Credential)
 
#Requires PS -Version 4.0
#>

function New-SOCatClient {
    [CmdletBinding(DefaultParametersetName="SOCatClientName")][OutputType('System.Management.Automation.PSObject')]
    param (
        [parameter(Mandatory=$true, Position=0)]
        [ValidateNotNullOrEmpty()]
            [String]$Server,
        [parameter(Mandatory=$true, Position=1, ParameterSetName="SOCatClientName")]
        [ValidateNotNullOrEmpty()]
            [String]$SOCatClientName,
        [parameter(Mandatory=$true, Position=2, ParameterSetName="SOCatClientName")]
        [ValidateNotNullOrEmpty()]
            [String]$SOCatClientPass,
        [Parameter(Mandatory=$true, Position=3, ParameterSetName="Credential")]
        [ValidateNotNullOrEmpty()]
            [Management.Automation.PSCredential]$SOCatClientCredential,
        [parameter(Mandatory=$false, Position=4)]
            [String]$SOCatClientDesc = $SOCatClientName,
        [parameter(Mandatory=$false, Position=5)]
            [Int]$Timeout = 30
            
    )
    Process {
        if (!$Global:SOConnections) {throw "No StoreOnce Appliance(s) connected! Use 'Connect-SOAppliance'"}
        if ($Server.count -gt 1) {throw "This Command only Supports one D2D System."}
        $Connection = $Global:SOConnections | Where {$_.Server -eq $Server}
        if (!$Connection) {throw "No D2D System found, check Get-SOConnections."}
        if ($Connection.count -gt 1) {throw "This Command only Supports one D2D System. Multiple Matches for $Server found..."}
        
        if ($PSBoundParameters.ContainsKey("SOCatClientCredential")){

            $SOCatClientName = $SOCatClientCredential.UserName
            $SOCatClientPass = $SOCatClientCredential.GetNetworkCredential().Password
        
        }  

        if (Test-IP -IP $($Connection.Server)) {
            if (Get-SOCatClients | where {$_.Name -eq $SOCatClientName -and $_.System -eq $($Connection.Server)}) {Throw "Client $SOCatClientName already Exists."}

            [Array]$IDs = (Get-SOSIDs | where {$_.System -eq $($Connection.Server)}).SSID

            for ($i = 1; $i -le $IDs.Count; $i++ ){
                $ClientCall = @{uri = "https://$($Connection.Server)/storeonceservices/cluster/servicesets/$i/services/cat/configs/clients/";
                                Method = 'POST';
                                Headers = @{Authorization = 'Basic ' + $($Connection.EncodedPassword);
                                            Accept = 'text/xml';
                                            'Content-Type' = 'application/x-www-form-urlencoded'
                                }
                                Body = @{name = $SOCatClientName;
                                        description = $SOCatClientDesc;
                                        password = $SOCatClientPass;
                                        canCreateStores = 'false';
                                        canSetServerProperties = 'false';
                                        canManageClientPermissions = 'false'
                                } 
                            }

                $ClientResponse = Invoke-RestMethod @ClientCall
            }
            
            $i = 0
            while(!(Get-SOCatClients | where {$_.Name -eq $SOCatClientName -and $_.System -eq $($Connection.Server)})){
                $i++
                Start-Sleep 1
            if($i -gt $Timeout) { Write-Error "Creating Client Failed."; break}
                Write-Progress -Activity "Creating Client" -Status "Wait for Client..."
            }
        }
        Return (Get-SOCatClients | where {$_.Name -eq $SOCatClientName -and $_.System -eq $($Connection.Server)} | ft * -AutoSize)
        
    }
}
#endregion