functions/New-RemoteAIPFileShare.ps1

function New-RemoteAIPFileShare {
    <#
    .SYNOPSIS
        Create a file share
 
    .DESCRIPTION
        Create a file share for the AIP scanner
 
     .PARAMETER AccountName
        Account name that will be added to the AIP file share and folder
 
    .PARAMETER FileServer
        Server to create the AIP file share
 
    .PARAMETER RootFolder
        Drive letter to create folder on (Example: C:\)
 
    .PARAMETER ShareName
        Name of shared folder
 
    .PARAMETER AIPScannerSharedFolderName
        Name for the SMB shared folder
 
    .PARAMETER Confirm
        Parameter used to prompt for user confirmation
 
    .PARAMETER WhatIf
        Parameter used to validate a run without making changes
 
    .PARAMETER EnableException
        Depending on whether $EnableException is true or false it will do the following:
            1. ($True) - Throw a bloody terminating error. Game over.
            2. ($False) - Write a nice warning about how Foo failed bar, then terminate the function. The return on the next line will then end the calling function.
 
    .EXAMPLE
        PS C:\> New-AIPFileShare -ComputerName Server01 -FolderName c:\temp -ShareName YourShareName
 
        Will create a new file folder and file share called YourShareName at c:\temp on Server01
 
    .NOTES
        Create has two rules:
            1. You must be an administrator on the machine.
            2. You must Run as administrator the Windows PowerShell console.
    #>


    [Diagnostics.CodeAnalysis.SuppressMessageAttribute('PSUseUsingScopeModifierInNewRunspaces', '', Justification = 'Using ArgumentList')]
    [CmdletBinding(SupportsShouldProcess)]
    [OutputType([System.String])]
    param (
        [string]
        $AccountName = (Get-PSFConfigValue -Fullname AIPScannerConfig.ScannerAccountName),

        [string]
        $FileServer = (Get-PSFConfigValue -Fullname AIPScannerConfig.FileServer),

        [string]
        $RootFolder = (Get-PSFConfigValue -Fullname AIPScannerConfig.RootFolder),

        [string]
        $ShareName = (Get-PSFConfigValue -Fullname AIPScannerConfig.AIPShare),

        [string]
        $AIPScannerSharedFolderName = (Get-PSFConfigValue -Fullname AIPScannerConfig.AIPScannerSharedFolderName),
        
        [switch]
        $EnableException
    )

    begin {
        Write-PSFMessage -Level Host -String 'New-RemoteAIPFileShare.Message1'
    }

    process {
        try {
            Write-PSFMessage -Level Host -String 'New-RemoteAIPFileShare.Message2' -StringValues $FileServer
            Invoke-Command -ComputerName $FileServer -ScriptBlock { param ($RootFolder, $ShareName, $AIPScannerSharedFolderName, $AccountName)
                if ( New-Item -Path ([string]::Format("{0}{1}", $using:RootFolder, $using:ShareName)) -ItemType Directory -ErrorAction SilentlyContinue -ErrorVariable Failed ) {
                    Write-PSFMessage -Level Host -String 'New-RemoteAIPFileShare.Message3' -StringValues $using:ShareName, $using:FileServer
                
                    Write-PSFMessage -Level Host -String 'New-RemoteAIPFileShare.Message4' -StringValues $using:ShareName, $using:FileServer
                    $NewAcl = Get-Acl -Path ([string]::Format("{0}{1}", $RootFolder, $ShareName))
                    
                    # Set properties
                    $identity = ([string]::Format("{0}\{1}", $env:USERDOMAIN, $AccountName))
                    $fileSystemRights = "FullControl"
                    $type = "Allow"
                    
                    # Create new rule
                    $fileSystemAccessRuleArgumentList = $identity, $fileSystemRights, $type
                    $fileSystemAccessRule = New-Object -TypeName System.Security.AccessControl.FileSystemAccessRule -ArgumentList $fileSystemAccessRuleArgumentList
                    
                    # Apply new rule
                    $NewAcl.SetAccessRule($fileSystemAccessRule)
                    Set-Acl -Path ([string]::Format("{0}{1}", $RootFolder, $ShareName)) -AclObject $NewAcl
                    Write-PSFMessage -Level Host -String 'New-RemoteAIPFileShare.Message5' -StringValues $using:ShareName, $FileServer
                }
                else { if ($Failed) { Write-PSFMessage -Level Host -String 'New-RemoteAIPFileShare.Message6' -StringValues $Failed } }
                
                Write-PSFMessage -Level Host -String 'New-RemoteAIPFileShare.Message7' -StringValues $ShareName, $FileServer
                if ( New-SMBShare -Name $AIPScannerSharedFolderName -Path ([string]::Format("{0}{1}", $RootFolder, $ShareName)) -FullAccess ([string]::Format("{0}\{1}", $env:USERDOMAIN, $AccountName)) -Description "AIP Folder Share" -FolderEnumerationMode AccessBased -ErrorAction SilentlyContinue -ErrorVariable Failed ) {
                    Write-PSFMessage -Level Host -String 'New-RemoteAIPFileShare.Message8' -StringValues $ShareName, $FileServer
                }
                else { if ($Failed) { Write-PSFMessage -Level Host -String 'New-RemoteAIPFileShare.Message9' -StringValues $Failed } }

                Write-PSFMessage -Level Host -String 'New-RemoteAIPFileShare.Message10' -StringValues $ShareName, $FileServer
                $null = Grant-SmbShareAccess -Name AIPScannerShareFolder -AccountName ([string]::Format("{0}\{1}", $env:USERDOMAIN, $AccountName)) -AccessRight Full -Force
            } -ArgumentList $RootFolder, $ShareName, $AIPScannerSharedFolderName, $AccountName
        }
        catch {
            Stop-PSFFunction -String 'New-RemoteAIPFileShare.Message9' -EnableException $EnableException -Cmdlet $PSCmdlet -ErrorRecord $_
        }
    }

    end {
        Write-PSFMessage -Level Host -String 'New-RemoteAIPFileShare.Message11' -StringValues $pathCheck
    }
}