Reset Share Path

I am creating some test code to prepare for a task where I will need to reset the Share Path and Share Permissions to over 100+ Shares since the folder structure is changing.

I will initially make a copy of the data using robocopy and ensure NTFS permissions are in tact, so all I would have to do is Remove the share and then re - add with the same share permissions.

Here are the shares on my local machine in my ‘test’ directory.

C:\Users\bclanton\Google Drive\code\Projects\Custom_Objects> (get-smbshare | Where-Object {$_.path -like "c:\utility\test\*"})

Name          ScopeName Path                         Description
----          --------- ----                         -----------
NewShareTest$ *         C:\utility\test\NewshareTest            
Share10$      *         C:\utility\test\share10                 
Share3$       *         C:\utility\test\share3                  
Share4$       *         C:\utility\test\share4                  
Share5$       *         C:\utility\test\share5                  
Share6$       *         C:\utility\test\share6                  
Share7$       *         C:\utility\test\share7                  
Share8$       *         C:\utility\test\share8                  
Share9$       *         C:\utility\test\share9   

I have already copied the data with the same folders names to the directory c:\utility\test2.

Now I want to remove the share at c:\utlility\test and recreate it at c:\utility\test2.
My Problem is that I want to re-create the share based on the $sharePermissions variable I saved BEFORE I remove the share. I don’t see to have that option with ‘new-smbshare’ cmdlet where it seems I have to explicitly declare that permission.

Is there a way I can save share permissions from a folder and recreate those same share permissions on another folder?

$BCTestShares = (get-smbshare | Where-Object {$_.path -like "c:\utility\test\*"})
$BCTestPath = "c:\utility\test"
$BCTestPath2 = "c:\utility\test2"


$objectCollection = @()

$BCTestShares | 
ForEach-Object {

       
        
        #GetShareName
        $shareName = $_.Name

        #GetSharePermissions
        $sharePermissions = Get-SmbShareAccess $_.Name

        #Get Altered Path
        $CurrentPath = $_.path
        $alteredPath = ($CurrentPath -replace [regex]::Escape($BCTestPath), $BCTestPath2)

        #Remove Share Permission
        Remove-SmbShare $_.Name

        #Add New Share Permission
        #I don't seem to have an option to add the same share permission based on the variable $sharePermissions
        #New-SmbShare -Name $_.Name $shareName -Path $alteredPath

        


        $Properties =@{
        Share = $shareName;
        NewPath = $alteredPath
        }



       $object = New-Object -TypeName psobject -Property $Properties
       
       $objectCollection = $objectCollection + $object

    
}

$objectCollection

I think my answer lies in access the Class Properties and assigning those to my variables. Am I correct?

C:\Users\bclanton\Google Drive\Code> get-smbshareAccess share10$ | gm


   TypeName: Microsoft.Management.Infrastructure.CimInstance#ROOT/Microsoft/Windows/SMB/MSFT_SmbShareAccessControlEntry

Name                      MemberType     Definition                                                                                                       
----                      ----------     ----------                                                                                                       
Clone                     Method         System.Object ICloneable.Clone()                                                                                 
Dispose                   Method         void Dispose(), void IDisposable.Dispose()                                                                       
Equals                    Method         bool Equals(System.Object obj)                                                                                   
GetCimSessionComputerName Method         string GetCimSessionComputerName()                                                                               
GetCimSessionInstanceId   Method         guid GetCimSessionInstanceId()                                                                                   
GetHashCode               Method         int GetHashCode()                                                                                                
GetObjectData             Method         void GetObjectData(System.Runtime.Serialization.SerializationInfo info, System.Runtime.Serialization.Streaming...
GetType                   Method         type GetType()                                                                                                   
ToString                  Method         string ToString()                                                                                                
AccountName               Property       string AccountName {get;}                                                                                        
Name                      Property       string Name {get;}                                                                                               
PSComputerName            Property       string PSComputerName {get;}                                                                                     
ScopeName                 Property       string ScopeName {get;}                                                                                          
AccessControlType         ScriptProperty System.Object AccessControlType {get=[Microsoft.PowerShell.Cmdletization.GeneratedTypes.SmbShare.ShareAccessCo...
AccessRight               ScriptProperty System.Object AccessRight {get=[Microsoft.PowerShell.Cmdletization.GeneratedTypes.SmbShare.ShareAccessRight] (...

Have a look at the Server Migration Toolkit. It will migrate shares with permissions and even the data for you.

If you need more granular control for the migration you’ll want to look at the Win32_Share WMI class to identify shares, identify share permissions then create the shares and apply the permissions on the new server.

What would be ideal is if I can dynamically capture the ‘Full’ ‘Change’ and ‘Read’ access since I don’t know what all of the shares are going to have.

The migration toolkit will transfer everything you want server to server.

New-SMBShare uses multiple parameters for share permission that only accept input:
-NoAccess -ReadAccess -FullAccess -ChangeAccess
So you need to provide which users by string for each parameter

Thinking to use new-smbshare you need to use the AccessName and AccessRight that comes from get-smbshareaccess to create an array of accessright = accessname for each smbshare.

Then use the array to provide which users have -readaccess etc…

You maybe able to use a cimsession -class win32-share to get this done… Not sure
I want have time until this weekend to see if write up something, good luck

You can also use SecurityDescriptor from share object /Get-SmbShare/ to use with New-SmbShare -SecurityDescriptor if you need to transfer access untouched

Perfect! SecrityDescriptor property is exactly what I needed.

I have only been actively working with Powershell and applying it to production tasks for the last 5 weeks. If I need to research methods and properties of classes and/or cmdlets where the help files do not give an example or much detail even in ‘full’ or ‘detailed’ description, where else may I turn?

For instance, I saw that Security Descriptor Property as part of the get-smbshare commandlet when I piped a share to the ‘get-member’, but it was not immediately obvious what that was and there were no examples in the help pages for the new-smbshare cmdlet.

Is there another PS resource I can use in my research arsenal other than man/help pages that will go into detail about cmdlet methods?

I’m always first do $someObject | Get-Member and $someobject | Format-List * -Force to explore objects and it’s values. This help me to find correlation between Properties and Parameters even it’s not documented very well