Forum Discussion
Niclas Carlsson
Feb 13, 2017Copper Contributor
PnP PowerShell - PnP Provisioning package (pnp) with folders
Hi Is it possible to create a pnp provisioning file with a folder structure for a library by using Convert-PnPFolderToProvisioningTemplate or doesn't the current provisioning enging support pnp ...
Deleted
Feb 14, 2017You could create a extention in your template and use this code:
Snippet
private void CreateFolders(ClientContext context, Web web, List list, Project.Provisioning.Models.ListConfigurationListFolder[] folders) { foreach (var folder in folders) { ListItem newItem; try { // Create folder ListItemCreationInformation itemCreateInfo = new ListItemCreationInformation(); itemCreateInfo.UnderlyingObjectType = FileSystemObjectType.Folder; itemCreateInfo.LeafName = folder.Title; newItem = list.AddItem(itemCreateInfo); newItem["Title"] = folder.Title; newItem.Update(); context.ExecuteQueryRetry(); } catch (Exception e) { TraceHelper.WriteInformationToListener("LogFile", $"Couldn't create folder: {folder.Title}."); continue; } if (folder.ObjectSecurity != null) { // Set item security var securitySettings = folder.ObjectSecurity.BreakRoleInheritance; if (securitySettings.RoleAssignment.Length == 0) continue; try { var groups = context.LoadQuery(context.Web.SiteGroups.Include(g => g.LoginName)); var webRoleDefinitions = context.LoadQuery(context.Web.RoleDefinitions); context.ExecuteQueryRetry(); newItem.BreakRoleInheritance(securitySettings.CopyRoleAssignments, securitySettings.ClearSubscopes); foreach (var roleAssignment in securitySettings.RoleAssignment) { Principal principal = groups.FirstOrDefault(g => g.LoginName == roleAssignment.Principal); if (principal == null) { principal = context.Web.EnsureUser(roleAssignment.Principal); } var roleDefinitionBindingCollection = new RoleDefinitionBindingCollection(context); var roleDefinition = webRoleDefinitions.FirstOrDefault(r => r.Name == roleAssignment.RoleDefinition); if (roleDefinition != null) { roleDefinitionBindingCollection.Add(roleDefinition); } newItem.RoleAssignments.Add(principal, roleDefinitionBindingCollection); } context.ExecuteQueryRetry(); } catch (Exception e) { TraceHelper.WriteInformationToListener("LogFile", "Error occured when setting itemlevel security on folder."); continue; } } } }
Niclas Carlsson
Feb 20, 2017Copper Contributor
Yep I guess that I have to look at a custom extension. Too bad as it would have been nice if the Convert-PnPFolderToProvisioningTemplate command had packaged the files and folders in the same pnp package.
/Niclas