public static async Task <HttpResponseMessage> Run([HttpTrigger(AuthorizationLevel.Function, "post", Route = null)] HttpRequestMessage req, TraceWriter log, ExecutionContext executionContext) { try { var content = await req.Content.ReadAsStringAsync(); log.Info($"Function was triggered with the following payload { content }"); var request = JsonConvert.DeserializeObject <CreateCommunicationSiteRequest>(content); //Connect to the Tenant Root Url using (ClientContext clientContext = new SharePointUtility(log).GetClientContext(ConfigurationManager.AppSettings["o365:SpoTenantUrl"], executionContext)) { var tenant = new Tenant(clientContext); log.Info($"Site { request.Url} exists is {tenant.SiteExists(request.Url)}"); log.Info($"Preparing site creation info to { request.Url }"); // Create new "modern" communication site using PnP var communicationContext = await clientContext.CreateSiteAsync(new CommunicationSiteCollectionCreationInformation { Url = request.Url, // Mandatory Title = request.Title, // Mandatory Description = request.Description, // Mandatory Owner = request.Owner, // Optional AllowFileSharingForGuestUsers = request.AllowFileSharingForGuestUsers, // Optional SiteDesign = CommunicationSiteDesign.Topic, // Mandatory Lcid = 1033, // Mandatory Classification = "classification", // Optional }); communicationContext.Load(communicationContext.Web, w => w.Url); communicationContext.ExecuteQueryRetry(); log.Info($"New communication site created at {communicationContext.Web.Url}"); //Somehow the codes above does not add request.Owner as site collection admin using (ClientContext newSiteClientContext = new SharePointUtility(log).GetClientContext(communicationContext.Web.Url, executionContext)) { var siteCollectionAdmins = new List <UserEntity>(); siteCollectionAdmins.Add(new UserEntity() { LoginName = request.Owner, Email = request.Owner }); newSiteClientContext.Web.AddAdministrators(siteCollectionAdmins, true); log.Info($"{ request.Owner} was added as site collection admin"); } } return(req.CreateResponse(HttpStatusCode.OK, new { siteCreated = true, siteUrl = request.Url })); } catch (System.Exception e) { log.Info(e.ToString()); return(req.CreateResponse(HttpStatusCode.InternalServerError, new { siteCreated = false, message = e.ToString() })); } }