Forum Discussion
RESOLVED: How to change Modern page Author from the "Created By" field to something else
- 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
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
The Author field never gets updated for me. The code runs fine.
- FromelardOct 23, 2018Iron Contributor
It's difficult to give you support without any knowledge of your tenant.
The best way is to user the log writing to follow the execution and find what could be the reason for that issue you observed.
From my side, the change was applied and I validated that script on several different sites without hundreds of pages.
It's now running in another production script too.
Fab