private static void applyTemplate(string siteUrl, ExecutionContext functionContext, ClientCredentials credentials, TraceWriter log) { try { using (var ctx = new AuthenticationManager().GetAppOnlyAuthenticatedContext(siteUrl, credentials.ClientID, credentials.ClientSecret)) { Web web = ctx.Web; ctx.Load(web, w => w.Title); ctx.ExecuteQueryRetry(); log.Info($"Successfully connected to site: {web.Title}"); string currentDirectory = functionContext.FunctionDirectory; DirectoryInfo dInfo = new DirectoryInfo(currentDirectory); var schemaDir = dInfo.Parent.FullName + "\\Templates"; XMLTemplateProvider sitesProvider = new XMLFileSystemTemplateProvider(schemaDir, ""); log.Info($"About to get template with with filename '{PNP_TEMPLATE_FILE}'"); ProvisioningTemplate template = sitesProvider.GetTemplate(PNP_TEMPLATE_FILE); log.Info($"Successfully found template with ID '{template.Id}'"); ProvisioningTemplateApplyingInformation ptai = new ProvisioningTemplateApplyingInformation { ProgressDelegate = (message, progress, total) => { log.Info(string.Format("{0:00}/{1:00} - {2}", progress, total, message)); } }; // Associate file connector for assets.. FileSystemConnector connector = new FileSystemConnector(Path.Combine(currentDirectory, "Files"), ""); template.Connector = connector; web.ApplyProvisioningTemplate(template, ptai); } } catch (Exception e) { log.Error("Error when applying PnP template!", e); throw; } }