In meinem letzten Beitrag hatte ich ja schon darüber berichtet wie ich meinen Nintex for Office365 Tenant nach Europa umgezogen habe, und dann vor der Herausforderung stand für alle Webs und Subwebs herauszufinden wo ich Nintex-Workflows verwendet habe um diese neu zu veröffentlichen
Wenn man denk es geht nicht mehr
kommt von irgendwo `ne PowerShell her
Es ist also sofort klar, dass hier nur PowerShell weiterhelfen kann!
Also mal ganz langsam und der Reihe nach. Zunächst will ich für eine Website wissen, ob dort Nintex Workflow for Office365 überhaupt aktiviert ist.
$userName = "[username]@[mydomain.fqdn]" $siteColUrl = "https://[tenant].sharepoint.com/sites/[mysite]" Add-Type -Path "d:\Microsoft.SharePoint.Client.Runtime.dll" Add-Type -Path "d:\Microsoft.SharePoint.Client.dll" $cred = Get-Credential -UserName $userName -Message "Enter SPO credentials" $spoCred = New-Object Microsoft.SharePoint.Client.SharePointOnlineCredentials ($cred.UserName, $cred.Password) $ctx = New-Object Microsoft.SharePoint.Client.ClientContext($siteColUrl) $ctx.Credentials = $spoCred $web = $ctx.Web $ctx.Load($web) $addInInstances=[Microsoft.SharePoint.Client.AppCatalog]::GetAppInstances($ctx,$web) $ctx.Load($addInInstances) $ctx.ExecuteQuery() $webUrl = $web.Url $addInInstances | % { if ($_.ProductId -eq "353e0dc9-57f5-40da-ae3f-380cd5385ab9") { Write-Host "Found Nintex Forms for Office 365 on $webUrl; got to $($_.AppWebFullUrl)" Write-Host "... Client-ID: $($_.AppPrincipalId)" } if ($_.ProductId -eq "5d3d5c89-3c4c-4b46-ac2c-86095ea300c7") { Write-Host "Found Nintex Workflow for Office 365 on $webUrl; got to $($_.AppWebFullUrl)" Write-Host "... Client-ID: $($_.AppPrincipalId)" } }
Betrachten wir das Skript mal ein wenig:
- Zu Beginn wird Benutzername und die zu untersuchende URL festgelegt
- Die DLLs für das Client-Side-Object-Modell (CSOM) werden geladen
- Die Credentials werden vom Benutzer abgefragt und für die weitere Ausführung zwischengespeichert
- Anschließend werden alle installierten Apps des aktuellen Webs abgerufen (Zeile 15)
- Am Ende werden alle Apps durchsucht, ob Nintex dort enthalten ist
Nun muss ich dieses Vorgehen rekursiv auch für alle Sub-Webs meines aktuellen Webs machen. Dazu verpacke ich die Zeilen 12 bis 29 in eine Funktion Execute-NintexAddFinder
. Außerdem erstelle ich eine Funktion, die Sub-Webs rekursiv untersucht.
function Process-SubWebs() { param ( [Microsoft.SharePoint.Client.Web] $rootWeb = $(throw "Please provide a root web"), [Microsoft.SharePoint.Client.ClientContext] $ctx = $(throw "Please provide a context") ) $webs = $rootWeb.Webs $ctx.Load($webs) $ctx.ExecuteQuery() $webs | % { Write-Progress -Activity "Analysing Site-Collections" -Status "Processing $siteColUrl" -PercentComplete ($i / $siteCount * 100) -Id 1 -CurrentOperation "Inspecting Web $($_.Title)" Execute-NintexAddFinder -web $_ -ctx $ctx Process-SubWebs -rootWeb $_ -ctx $ctx } }
Nun muss die Funktion Process-SubWebs
nur noch für alle Site-Collections einmal aufrufen. Dazu verwende ich die PnP-PowerShell-Cmdlets:
$adminUrl = "https://[tenant]-admin.sharepoint.com/" Connect-PnPOnline -Url $adminUrl -Credential $cred $allSites = Get-PnPSite -Limit ALL $sites | % { $siteColUrl = $_.Url $ctx = New-Object Microsoft.SharePoint.Client.ClientContext($siteColUrl) $ctx.Credentials = $spoCred $rootWeb = $ctx.Web $ctx.Load($rootWeb) $ctx.ExecuteQuery() Execute-NintexAddFinder -web $rootWeb -ctx $ctx Process-SubWebs -rootWeb $rootWeb -ctx $ctx }
Somit habe ich also eine Übersicht wo über Nintex Workflow for Office365 aktiviert ist.
Was nun noch fehlt ist eine Liste alle Workflows auf der jeweiligen Site – insbesondere alle Workflows aller Listen. Wie man das bekommt beschreibe ich im nächsten Teil.