# encoding: ascii
# api: powershell
# title: Copy Shares 
# description: Copies shared folders from one server to another. Run on the new server (as administrator).
# version: 0.1
# type: class
# author: themoblin
# license: CC0
# x-poshcode-id: 4630
# x-archived: 2014-02-09T09:39:40
# x-published: 2014-11-22T13:13:00
#
# Tested during migration of SBS 2003 to SBS 2011
#
$oldserver = "hostname"
# Exclude the following shares. Update to particular needs of your environment.
$excludes = @("DLOAgent","faxclient","CertEnroll","Resources$","FxsSrvCp$","tsweb","NETLOGON","WSUSTemp","prnproc$","SYSVOL","Address","tsclient","WsusContent","UpdateServicesPackages","print$")
$shares = get-wmiobject -computername $oldserver -Class win32_share|where-object {($_.type -eq 0) -and ($excludes -notcontains $_.name)}

foreach ($share in $shares)
 {
 #  This section was required as the old server had a C: and a D:
 #  The new server had only a C: so had to edit the paths to replace any reference of D: with C:
 	if ($share.path -like "D:*")
 	    {
		$newntfspath = $share.path.replace("D:\","C:\")
		Write-Host -foregroundcolor Green "Destination folder" $newntfspath
		}
	else {  $newntfspath = $share.path
		Write-Host -foregroundcolor Green "Destination folder" $newntfspath
		}

#       Test to see if the file paths already exist - only needed on the first run if you intend to robocopy more than once.

	    if (!(Test-Path $newntfspath))
		{
		Write-Host -foregroundcolor Green "Folder $newntfspath does not exist"
		Write-Host -foregroundcolor Green "Starting robocopy job"
#       Robocopy job - requires that the log folder exists already - in this case C:\RobocopyLogs
		robocopy \\$oldserver\$($share.name) $newntfspath /W:5 /R:2 /XO /E /PURGE /SEC /V /NFL /LOG:C:\RobocopyLogs\$($share.name).txt
		}
	else { Write-Host -foregroundcolor Red "Folder $newntfspath Already exists"
		Write-Host -foregroundcolor Red "Skipping this folder"
		Write-Host -ForegroundColor Red "Creating error log"
		New-Item -force -ItemType File -Path C:\RobocopyLogs\$($share.name)_Fail.txt
		Set-content -Value "Location already exists, Robocopy was not attempted" -Path C:\RobocopyLogs\$($share.name)_Fail.txt
		}

        $sourceperms = get-wmiobject -computername $oldserver -Class win32_LogicalShareSecuritySetting | Where-Object {$_.name -eq $share.name}
        $sourceperms = $sourceperms.GetSecurityDescriptor().Descriptor

#       FOR TESTING ONLY -- Drilling into the source permissions object to display friendly name and accessrights values
#	    $sourceperms = $sourceperms.DACL
#	    foreach ($DACL in $sourceperms)
#		    {
#		    $DACLname = $DACL.trustee.name
#		    $DACLname
#		    $Accessrights = $($DACL.Accessmask -as [Security.AccessControl.FileSystemRights])
#		    $Accessrights
#		    }

        if (!(get-wmiobject -Class Win32_Share |Where-Object {$_.name -eq $share.name}))
            {
            Write-Host -ForegroundColor Green "Creating shared folder"
#           Creates an object with the Win32_share class
            $newshare = [wmiclass]"Win32_Share"
#           Creates the share using the "create" method of the wmiclass object.
#           This take 7 arguments in a specific order 1.Path 2.Share Name 3.Type (0 is for file share) 4. Max connections allow 5. Description 6. Password 7.Permissions object 
            $newshare = $newshare.Create($newntfspath,$share.name,0,$null,$null,$null,$sourceperms)
		    }
        else { Write-Host -foregroundcolor RED "Shared folder already exists"
             }
 }
