Hi,
When I was working to get powershell scripts from MSDN samples to get/set information, I created too one for reading the changelog. It was a bit tricky to build, but I manage to port Querying for specific changes to PowerShell.
You can review the changelog API in the Microsoft SharePoint Developer Documentation Team Blog and MSDN (previous link):
We wanted to monitor which changes were been read by the crawl process and been able to filter specific changes.
## SharePoint Reference [void][System.Reflection.Assembly]::LoadWithPartialName("Microsoft.SharePoint") [void][System.Reflection.Assembly]::LoadWithPartialName("Microsoft.SharePoint.Administration") [void][System.Reflection.Assembly]::LoadWithPartialName("Microsoft.Office.Server.Search.Administration") [void][System.Reflection.Assembly]::LoadWithPartialName("Microsoft.Office.Server.Search") [void][System.Reflection.Assembly]::LoadWithPartialName("Microsoft.Office.Server")
function global:Get-ChangeLog($url, $minutes, $changetype){ trap [Exception] { write-error $("ERROR: " + $_.Exception.GetType().FullName); write-error $("ERROR: " + $_.Exception.Message); continue; } $s = new-Object Microsoft.SharePoint.SPSite($url); $startTime = [System.DateTime]::Now.Subtract([System.TimeSpan]::FromMinutes($minutes)); $db_id = [Microsoft.SharePoint.Administration.SPContentDatabase].getmethod("get_Id"); $result_id = $db_id.Invoke($s.ContentDatabase, "instance,public", $null, $null, $null); $db_CurrentChangeToken = [Microsoft.SharePoint.Administration.SPContentDatabase].getmethod("get_CurrentChangeToken"); $result_CurrentChangeToken = $db_CurrentChangeToken.Invoke($s.ContentDatabase, "instance,public", $null, $null, $null); $startToken = New-Object Microsoft.SharePoint.SPChangeToken([Microsoft.SharePoint.SPChangeCollection+CollectionScope]::ContentDB, $result_id.ToString(), $startTime); $changeQuery = New-Object Microsoft.SharePoint.SPChangeQuery($False, $False); $changeQuery.User = $True; $changeQuery.ContentType = $True; $changeQuery.Add = $True; $changeQuery.Delete = $True; $changeQuery.Field = $True; $changeQuery.File = $True; $changeQuery.Folder = $True; $changeQuery.Group = $True; $changeQuery.GroupMembershipAdd = $True; $changeQuery.GroupMembershipDelete = $True; $changeQuery.Item = $True; $changeQuery.List = $True; $changeQuery.Move = $True; $changeQuery.Rename = $True; $changeQuery.Site = $True; $changeQuery.SystemUpdate = $True; $changeQuery.Update = $True; $changeQuery.ChangeTokenStart = $startToken; $changeQuery.ChangeTokenEnd = $result_CurrentChangeToken; $db_GetChanges = [Microsoft.SharePoint.Administration.SPContentDatabase].getmethod("GetChanges", [Microsoft.SharePoint.SPChangeQuery]); $result_GetChanges = $db_GetChanges.Invoke($s.ContentDatabase, "instance,public", $null, $changeQuery, $null); write-Output $result_GetChanges | Where-Object { $_.ChangeType -eq $changetype }; $s.Dispose();} Get-ChangeLog -url http://your_site_url -minutes 120 -changetype Add Take into account that the time will get changes based on UTC Bye!
function global:Get-ChangeLog($url, $minutes, $changetype){ trap [Exception] { write-error $("ERROR: " + $_.Exception.GetType().FullName); write-error $("ERROR: " + $_.Exception.Message); continue; }
$s = new-Object Microsoft.SharePoint.SPSite($url); $startTime = [System.DateTime]::Now.Subtract([System.TimeSpan]::FromMinutes($minutes)); $db_id = [Microsoft.SharePoint.Administration.SPContentDatabase].getmethod("get_Id"); $result_id = $db_id.Invoke($s.ContentDatabase, "instance,public", $null, $null, $null); $db_CurrentChangeToken = [Microsoft.SharePoint.Administration.SPContentDatabase].getmethod("get_CurrentChangeToken"); $result_CurrentChangeToken = $db_CurrentChangeToken.Invoke($s.ContentDatabase, "instance,public", $null, $null, $null); $startToken = New-Object Microsoft.SharePoint.SPChangeToken([Microsoft.SharePoint.SPChangeCollection+CollectionScope]::ContentDB, $result_id.ToString(), $startTime); $changeQuery = New-Object Microsoft.SharePoint.SPChangeQuery($False, $False); $changeQuery.User = $True; $changeQuery.ContentType = $True; $changeQuery.Add = $True; $changeQuery.Delete = $True; $changeQuery.Field = $True; $changeQuery.File = $True; $changeQuery.Folder = $True; $changeQuery.Group = $True; $changeQuery.GroupMembershipAdd = $True; $changeQuery.GroupMembershipDelete = $True; $changeQuery.Item = $True; $changeQuery.List = $True; $changeQuery.Move = $True; $changeQuery.Rename = $True; $changeQuery.Site = $True; $changeQuery.SystemUpdate = $True; $changeQuery.Update = $True; $changeQuery.ChangeTokenStart = $startToken; $changeQuery.ChangeTokenEnd = $result_CurrentChangeToken; $db_GetChanges = [Microsoft.SharePoint.Administration.SPContentDatabase].getmethod("GetChanges", [Microsoft.SharePoint.SPChangeQuery]); $result_GetChanges = $db_GetChanges.Invoke($s.ContentDatabase, "instance,public", $null, $changeQuery, $null);
write-Output $result_GetChanges | Where-Object { $_.ChangeType -eq $changetype };
$s.Dispose();}
Get-ChangeLog -url http://your_site_url -minutes 120 -changetype Add
Take into account that the time will get changes based on UTC
Bye!
This week has been action packed with posts! Six ways to store settings in SharePoint by Wicton Wilen