functions/New-AIPFileShare.ps1
function New-AIPFileShare { <# .SYNOPSIS Create a file share .DESCRIPTION Create a file share for the AIP scanner .PARAMETER FolderName Folder name of the AIP file share .PARAMETER ShareName Name of the 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 https://docs.microsoft.com/en-us/windows/win32/cimwin32prov/create-method-in-class-win32-share?redirectedfrom=MSDN Create has two rules: 1. You must be an administrator on the machine. 2. You must Run as administrator the Windows PowerShell console. #> [CmdletBinding(SupportsShouldProcess)] [OutputType([System.Boolean])] param ( [string] $folderName = (Get-PSFConfigValue -Fullname AIPScannerConfig.RootFolder), [string] $ShareName = (Get-PSFConfigValue -Fullname AIPScannerConfig.AIPShare), [switch] $EnableException ) begin { Write-PSFMessage -Level Host -String 'New-AIPFileShare.Message1' } process { try { $pathCheck = Join-Path $folderName -ChildPath $ShareName -ErrorAction Stop Write-PSFMessage -Level Verbose -String 'New-AIPFileShare.Message2' -StringValues $pathCheck } catch { Stop-PSFFunction -String 'New-AIPFileShare.Message3' -EnableException $EnableException -Cmdlet $PSCmdlet -ErrorRecord $_ } try { If (Test-Path -Path $pathCheck) { Write-PSFMessage -Level Verbose -String 'New-AIPFileShare.Message4' -StringValues $pathCheck } else { if (New-Item -Path $pathCheck -ItemType Directory -ErrorAction Stop ) { Write-PSFMessage -Level Verbose -String 'New-AIPFileShare.Message5' -StringValues $pathCheck } } } catch { Stop-PSFFunction -String 'New-AIPFileShare.Message6' -EnableException $EnableException -Cmdlet $PSCmdlet -ErrorRecord $_ } try { Write-PSFMessage -Level Verbose -String 'New-AIPFileShare.Message7' -StringValues $pathCheck if (Get-SmbShare -Name $ShareName -ErrorAction SilentlyContinue) { Write-PSFMessage -Level Host -String 'New-AIPFileShare.Message8' -StringValues $pathCheck return } else { if (New-SMBShare –Name (Get-PSFConfigValue -FullName AIPScannerConfig.AIPShare) –Path $pathCheck -Description "AIP Shared Folder" -FullAccess "$env:COMPUTERNAME\AIPScanner") { Write-PSFMessage -Level Verbose -String 'New-AIPFileShare.Message9' -StringValues (Get-PSFConfigValue -FullName AIPScannerConfig.AIPShare) $account = (Get-PSFConfigValue -FullName 'AIPScannerConfig.ScannerAccountName') $acl = (Get-Item $pathCheck).GetAccessControl('Access') Write-PSFMessage -Level Verbose -String 'New-AIPFileShare.Message10' -StringValues (Get-PSFConfigValue -FullName AIPScannerConfig.AIPShare) if (($acl.Access | Where-Object { ($_.IdentityReference.Value.Contains($account.ToUpperInvariant()) -or $_.IdentityReference.Value.Contains($account)) -and $_.FileSystemRights -eq [System.Security.AccessControl.FileSystemRights]::FullControl }).Count -eq 1) { Write-PSFMessage -Level Host -String 'New-AIPFileShare.Message11' -StringValues $pathCheck return } } else { Write-PSFMessage -Level Host -String 'New-AIPFileShare.Message12' -StringValues $pathCheck return } } } catch { Stop-PSFFunction -String 'New-AIPFileShare.Message13' -EnableException $EnableException -Cmdlet $PSCmdlet -ErrorRecord $_ } try { Write-PSFMessage -Level Verbose -String 'New-AIPFileShare.Message14' -StringValues $pathCheck $accessControlRule = New-Object System.Security.AccessControl.FileSystemAccessRule((Get-PSFConfigValue -FullName AIPScannerConfig.ScannerAccountName), "FullControl", "ContainerInherit,ObjectInherit", "None", "Allow") $acl.SetAccessRule($accessControlRule) if ( Set-Acl $pathCheck $acl -Passthru ) { Write-PSFMessage -Level Verbose -String 'New-AIPFileShare.Message15' -StringValues $pathCheck } else { Write-PSFMessage -Level Verbose -String 'New-AIPFileShare.Message16' -StringValues $pathCheck } } catch { Stop-PSFFunction -String 'New-AIPFileShare.Message17' -EnableException $EnableException -Cmdlet $PSCmdlet -ErrorRecord $_ } } end { Write-PSFMessage -Level Host -String 'New-AIPFileShare.Message18' -StringValues $pathCheck } } |