Wird eine Datei in SharePoint Online oder OneDrive for Business geteilt ist der Freigabelink eine lange Zeichenfolge aus der die eigentliche Referenzdatei nicht mehr erkennbar ist. Über Microsoft Graph kann die Datei oder der Ordner aufgelöst werden.
Die Freigabelinks in SharePoint oder OneDrive sind vermutlich bekannt. Eine lange Zeichenfolge.
https://[Tenant].sharepoint.com/:w:/s/[Site]/EVi7b8BhVGtMhSknigKmf04B2n-K6FxPr-hXuPZBnYk_VA?e
Für interne Freigabelinks die niemals ablaufen kann es mit der Zeit schwierig sein zu wissen auf welche Datei/Ordner der Link verweist. Microsoft Graph bietet über die Shares API eine Möglichkeit das Ziel solcher Zeichenfolgen auszuwerten.
Was zu beachten ist:
- Die Auswertung ist für geteilte Dateien und Ordner in SharePoint und OneDrive möglich, inkl. aller Dateien die sich in einem Ordner befinden.
- Der referenzierte Inhalt muss noch bestehen. Wurde der Inhalt oder die Freigabe gelöscht kann es Graph nachträglich nicht mehr auswerten. Es wird ein 404 Not Found zurückgeben.
Wie immer benötigt es beim Zugriff via Microsoft Graph eine Azure App Registration. Hier findest du meine Anleitung zur Erstellung. Da ich die Datei nur finden möchte sind für die Berechtigungen Files.Read.All ausreichend. In meinem Beispiel hat der ausführende Account Zugriff auf die betroffene SharePoint Site. Für mich sind Delegated Permissions damit ausreichend. Hat der Account keinen Zugriff müssten es Application Permissions sein, oder dem Account temporär Leserechte gewährt werden.
Die eine Berechtigung ist ausreichend für die Abfrage. Das kurze Script ist am Ende von diesem Post via GitHub zusammengefasst.
- Wie immer muss zuerst über die App Registration ein Authentication Token für Microsoft Graph bezogen werden. Du könntest mein Command Get-TAMSAuthToken einsetzen.
$AuthHeader = Get-TAMSAuthToken -AppId "[ApplicationID]" -ClientSecret "[ClientSecret]" -Tenantname "[Tenant].onmicrosoft.com" -API Graph -PermissionType Delegated -AppRedirectUri "http://localhost/myapp/" -ReturnAuthHeader
- Als nächstes muss der komplette Freigabelink in einen Base64String encodiert werden.
$SharingUrl = "https://[Tenant].sharepoint.com/:w:/s/[Site]/EVi7b8BhVGtMhSknigKmf04B2n-K6FxPr-hXuPZBnYk_VA?e"
$Base64EncodedUrl = [Convert]::ToBase64String([System.Text.Encoding]::UTF8.GetBytes($SharingUrl))
- Eine encodierte Url kann bestimmte Sonderzeichen inkludieren. Die werden ersetzt und der Base64String etwas ergänzt.
$Base64EncodedUrl = "u!" + $Base64EncodedUrl.TrimEnd('=').Replace('/','_').Replace('+','-')
- Mit diesen wenigen Zeilen ist man bereits vorbereitet. Jetzt kann der Request abgesetzt werden. Wichtig an dem Request ist der Zusatz driveItem. Dadurch liefert es in der Antwort die vollständigen Informationen zur betroffenen Datei oder Ordner. Ohne würde es nur den Datei-/Ordnernamen zurückliefern. Zur Erinnerung, gibt es die Datei oder den Freigabelink nicht mehr wird es ein Not Found zurückgeben.
$Url = "https://graph.microsoft.com/v1.0/shares/$Base64EncodedUrl/driveItem"
$Result = Invoke-RestMethod -Method Get -uri $Url -Headers $AuthHeader
- Die Abfrage liefert alle Daten zurück die jemand benötigt um über Graph weitere Dateiaktionen abzusetzen. So wäre es beispielsweise auch möglich den Freigabelink via Graph zu löschen.
- Sollte es statt einer Datei ein Ordner sein wird der Request erweitert.
$Url = ("https://graph.microsoft.com/v1.0/shares/$Base64EncodedUrl/driveItem?" + '$expand=children')
$Result = Invoke-RestMethod -Method Get -uri $Url -Headers $AuthHeader
Zum Abschluss das vollständige Script via GitHub zusammengefasst.