Forum Discussion

Fromelard's avatar
Fromelard
Iron Contributor
Jul 31, 2018
Solved

RESOLVED: How to change Modern page Author from the "Created By" field to something else

When we use the Modern Pages to Publish news, we can see the WebPart "Last Published News" with a vignette (Image, Title, first part of the text and Author).   The issue is this value when...
  • Fromelard's avatar
    Fromelard
    Oct 16, 2018

    Dear all,

    I finally found how to do that change based on a PowerShell script.

    This script will directly check the page list and for each item will check if the "Modified By" value is different than the "Created By", and check also if the "created by" account was not an admin (or system).

     

    If yes, the item fields (Author, Creator) will be updated with the values "Modified By" and the Modified Date will be applied into all the fields using the same type.

     

    You can easily adapt that script code if you need another logic, but the solution is working really well and I applied it in many Modern Page List.

     

    [string]$SitePagesURL ="https://[yourtenant].sharepoint.com/sites/YourSiteColl/YourSubsite"
    [string]$PageLibPublicName = "Site Pages"
    [DateTime]$modifiedDate = Get-Date
    
    [string]$DefaultEmailAddress = "PublisherEmail@yourdomain.com"
    [string]$MyTempEmailAddress = ""
    
    # ---------------------------------------------------------------------------------------------------------------
    function Load-DLLandAssemblies
    {
    	[string]$defaultDLLPath = ""
    
    	# Load assemblies to PowerShell session 
    	$defaultDLLPath = "C:\Program Files\SharePoint Online Management Shell\Microsoft.Online.SharePoint.PowerShell\Microsoft.SharePoint.Client.dll"
    	[System.Reflection.Assembly]::LoadFile($defaultDLLPath)
    
    	$defaultDLLPath = "C:\Program Files\SharePoint Online Management Shell\Microsoft.Online.SharePoint.PowerShell\Microsoft.SharePoint.Client.Runtime.dll"
    	[System.Reflection.Assembly]::LoadFile($defaultDLLPath)
    
    	$defaultDLLPath = "C:\Program Files\SharePoint Online Management Shell\Microsoft.Online.SharePoint.PowerShell\Microsoft.Online.SharePoint.Client.Tenant.dll"
    	[System.Reflection.Assembly]::LoadFile($defaultDLLPath)
    }
    
    # ---------------------------------------------------------------------------------------------------------------
    Function Get-All-PageList-UpdateMetadata($MyctxTemp, $MyspoRootwebTemp)
    {
    	$Alllists = $MyspoRootwebTemp.Lists
    	$MyPagelist = $Alllists.GetByTitle($PageLibPublicName)
    
    	$MyQuery = New-Object Microsoft.SharePoint.Client.CamlQuery;
    	$MyQuery.ViewXml = "<View><Query><OrderBy><FieldRef Name='Modified' Ascending='FALSE'></FieldRef></OrderBy></Query><RowLimit>9999</RowLimit></View>"
    	$MyPagelistItems = $MyPagelist.GetItems($MyQuery);
    
    	$MyctxTemp.load($MyPagelistItems)
    	$MyctxTemp.executeQuery()
    	
    	foreach($PageItem in $MyPagelistItems)
    	{
    		Write-Host ""
    		Write-Host ""
    		Write-Host "   --------------------------------------------------------- "
    <#	
    		foreach($MyFieldval in $PageItem.FieldValues)
    		{
    			Write-Host "     >>> FieldName:", $MyFieldval
    		}
    #>
    		$modifiedDate = $PageItem["Modified"]
    		$ModifiedByuser = [Microsoft.SharePoint.Client.FieldUserValue]$PageItem["Editor"]
    		$CreatedByuser = [Microsoft.SharePoint.Client.FieldUserValue]$PageItem["Author"]
    		Write-Host "ID:", $PageItem["ID"], "- Title:", $PageItem["Title"], "- Original Publication Date:", $modifiedDate.ToString("dd-MM-yyyy")
    		Write-Host "           ==>>> PromotedState:", $PageItem["PromotedState"], "- PageLayoutType:", $PageItem["PageLayoutType"] -ForegroundColor red
    		
    		Write-Host "   >> Description:", $PageItem["Description"] 
    		Write-Host "   >> BannerImageUrl:", $PageItem["BannerImageUrl"].URL, "- URLDesc:", $PageItem["BannerImageUrl"].Description
    		Write-Host "   >> ContentTypeId:", $PageItem["ContentTypeId"] 
    
    		if ($ModifiedByuser.LookupId -ne  $CreatedByuser.LookupId)
    		{
    			Write-Host "       ===> Modified by:", $ModifiedByuser.LookupValue, " - ", $ModifiedByuser.Email ,"[", $ModifiedByuser.LookupId, "]" -ForegroundColor green
    			Write-Host "       ===> Created by:", $CreatedByuser.LookupValue, " - ", $CreatedByuser.Email ,"[", $CreatedByuser.LookupId, "]" -ForegroundColor green
    
    			if($ModifiedByuser.Email -ne "")
    			{
    				$MyTempEmailAddress = $ModifiedByuser.Email
    			}
    			else
    			{
    				$MyTempEmailAddress = $DefaultEmailAddress #Admin Account to reset with the default one
    			}
    			$MyEditoruserAccount = $MyspoRootwebTemp.EnsureUser("i:0#.f|membership|$($MyTempEmailAddress)");
    			$MyctxTemp.load($MyEditoruserAccount)
    			$MyctxTemp.executeQuery()
    			Write-Host "                ===> Modified Account Login:", $MyEditoruserAccount.LoginName -ForegroundColor Magenta
    
    			$PageItem["Modified"] = $modifiedDate;
    			$PageItem["Created"] = $modifiedDate;
    			$PageItem["FirstPublishedDate"] = $modifiedDate;
    			$PageItem["Created_x0020_By"] = $MyEditoruserAccount.LoginName
    			$PageItem["Modified_x0020_By"] = $MyEditoruserAccount.LoginName
    			$PageItem["Editor"] = $MyEditoruserAccount.Id;
    			$PageItem["Author"] = $MyEditoruserAccount.Id
    			$PageItem.Update()
    			$MyctxTemp.ExecuteQuery()
    		}
    		else
    		{
    			Write-Host "       ===> Modified by:", $ModifiedByuser.LookupValue, " - ", $ModifiedByuser.Email ,"[", $ModifiedByuser.LookupId, "]" -ForegroundColor red
    			Write-Host "       ===> Created by:", $CreatedByuser.LookupValue, " - ", $CreatedByuser.Email ,"[", $CreatedByuser.LookupId, "]" -ForegroundColor red
    
    			if($ModifiedByuser.Email -eq "") #Admin Account to reset with the default one
    			{
    				$MyTempEmailAddress = $DefaultEmailAddress
    				$MyEditoruserAccount = $MyspoRootwebTemp.EnsureUser("i:0#.f|membership|$($MyTempEmailAddress)");
    				$MyctxTemp.load($MyEditoruserAccount)
    				$MyctxTemp.executeQuery()
    				Write-Host "                ===> Modified Account Login:", $MyEditoruserAccount.LoginName -ForegroundColor Magenta
    
    				$PageItem["Modified"] = $modifiedDate;
    				$PageItem["Created"] = $modifiedDate;
    				$PageItem["FirstPublishedDate"] = $modifiedDate;
    				$PageItem["Created_x0020_By"] = $MyEditoruserAccount.LoginName
    				$PageItem["Modified_x0020_By"] = $MyEditoruserAccount.LoginName
    				$PageItem["Editor"] = $MyEditoruserAccount.Id;
    				$PageItem["Author"] = $MyEditoruserAccount.Id
    				$PageItem.Update()
    				$MyctxTemp.ExecuteQuery()			
    			}
    		}
    		Write-Host "   --------------------------------------------------------- "
    	}  
    }
    
    
    # ---------------------------------------------------------------------------------------------------------------
    Load-DLLandAssemblies
    
    #get and save your O365 credentials
    [string]$username = "adminAccount@[yourtenant].onmicrosoft.com"
    [string]$PwdTXTPath = "C:\SECUREDPWD\ExportedPWD-$($username).txt"
    $secureStringPwd = ConvertTo-SecureString -string (Get-Content $PwdTXTPath)
    $cred = New-Object System.Management.Automation.PSCredential -ArgumentList $username, $secureStringPwd
    
    #connect to the web site using the stored credentials
    Write-host " "
    Write-host " -------------------------------------------------------------------------------------------- " -ForegroundColor green
    Write-host " ---- CONNECT THE SITE --- " -ForegroundColor green
    Write-host "   CONNECTED SITE:", $SitePagesURL  -ForegroundColor Yellow
    
    $Myctx = New-Object Microsoft.SharePoint.Client.ClientContext($SitePagesURL)
    
    $Myctx.Credentials = New-Object Microsoft.SharePoint.Client.SharePointOnlineCredentials($cred.UserName,$cred.Password)
    $Myctx.RequestTimeout = 1000000 # milliseconds
    $MyspoRootweb = $Myctx.Web
    $Myctx.Load($MyspoRootweb)
    $Myctx.ExecuteQuery()
    
    Write-Host " "
    Write-Host " ---------------------------------------------------------"
    Write-Host "  >>>> # Server Version:" $Myctx.ServerVersion " # <<<<<<" -ForegroundColor Green 
    Write-Host " ---------------------------------------------------------"
    Write-Host " "
    
    Write-host " -------------------------------------------------------- "
    Write-host "   -->> RootSite:", $MyspoRootweb.URL -ForegroundColor green
    
    Write-host " "
    
    Get-All-PageList-UpdateMetadata $Myctx $MyspoRootweb
    

    Thanks all for your help.

     

    French version of the article:

     

    Fabrice Romelard

     

Resources