Spring til indholdet

Find et websteds id i SharePoint

Webstedets GUID fra REST, det sammensatte id fra Microsoft Graph og begge fra PowerShell — og hvordan de to formater hænger sammen.

Opdateret Power AutomatePowerShellSharePoint Online 5 min. læsning

Graph-kald, flows på tværs af websteder, rettigheder til én app på ét websted og migreringsværktøjer vil have webstedets id, og det står ingen steder i brugerfladen. Der er to formater:

Simple GUID: <site-id>
Composite format: contoso.sharepoint.com,<site-id>,<web-id>
                   └─ hostname ─────┘ └─ site collection ID ┘ └─ web ID ┘

SharePoints REST-API bruger det første. Graph bruger det andet: værtsnavn, webstedssamlingens id og webbens id, adskilt af komma. Webbens id er en anden GUID end webstedssamlingens, også på rodwebben.

I browseren#

Hurtigst: /_api/site/id efter webstedets adresse.

https://contoso.sharepoint.com/sites/ProjectAlpha/_api/site/id
1<?xml version="1.0" encoding="utf-8"?>
2<d:Id xmlns:d="http://schemas.microsoft.com/ado/2007/08/dataservices"><site-id></d:Id>

/_api/web/id giver webbens id på samme måde. Browseren får XML, fordi den ikke beder om andet. Med $select og $format=json:

https://contoso.sharepoint.com/sites/ProjectAlpha/_api/site?$select=Id&$format=json
1{
2  "d": {
3    "Id": "<site-id>"
4  }
5}

Fra Power Automate med REST#

Send an HTTP request to SharePoint mod webstedet. Den hører til SharePoint-connectoren og kræver ikke Premium.

_api/site?$select=Id
1{
2  "Accept": "application/json;odata=nometadata",
3  "Content-Type": "application/json;odata=nometadata"
4}

Send an HTTP request to SharePoint med _api/site?$select=Id og nometadata i begge headers.

1{
2  "Id": "<site-id>"
3}
body('Send_an_HTTP_request_to_SharePoint_-_Get_SiteID')?['Id']

Hele forløbet:

Manual Trigger
  ↓
Initialize Variable: varSiteURL
  Value: "https://contoso.sharepoint.com/sites/ProjectAlpha"
  ↓
Send HTTP Request: Get Site ID
  Site: varSiteURL
  Method: GET
  Uri: _api/site?$select=Id
  Headers: {"Accept": "application/json;odata=nometadata"}
  ↓
Initialize Variable: varSiteID
  Value: @{body('Send_HTTP_Request')?['Id']}
  ↓
Compose: Display Site ID
  Inputs: @{variables('varSiteID')}

Som et underflow, der kan kaldes fra andre flows med en adresse og giver id’et tilbage:

Send HTTP Request
  Site: @{triggerBody()?['SiteURL']}
  Method: GET
  Uri: _api/site?$select=Id
  ↓
Respond to a PowerApp or flow
  SiteID: @{body('HTTP_Request')?['Id']}
Run a Child Flow: GetSiteID
  SiteURL: variables('varSiteURL')
  ↓
Set Variable: varSiteID
  Value: @{outputs('GetSiteID')?['body/SiteID']}

Fra Microsoft Graph#

Webstedet slås op på værtsnavn og sti, med kolon imellem:

https://graph.microsoft.com/v1.0/sites/contoso.sharepoint.com:/sites/ProjectAlpha
1{
2  "id": "contoso.sharepoint.com,<site-id>,<web-id>",
3  "displayName": "Project Alpha",
4  "name": "ProjectAlpha",
5  "webUrl": "https://contoso.sharepoint.com/sites/ProjectAlpha"
6}

I Power Automate med HTTP-handlingen (Premium) og Entra ID-godkendelse: tenant, audience https://graph.microsoft.com, klient-id og hemmelighed eller certifikat fra en app med Sites.Read.All.

Kolonet efter værtsnavnet skal med, og https:// skal ikke:

❌ sites/contoso.sharepoint.com/sites/ProjectAlpha  (missing colon)
❌ sites/https://contoso.sharepoint.com:/sites/ProjectAlpha  (includes https://)
✅ sites/contoso.sharepoint.com:/sites/ProjectAlpha  (correct)

Delene af det sammensatte id:

split(body('HTTP')?['id'], ',')[1]

[0] er værtsnavnet, [1] webstedssamlingens id — det samme som REST giver — og [2] webbens id.

Er adressen ukendt, kan der søges på navnet:

GET https://graph.microsoft.com/v1.0/sites?search=Project Alpha
 1{
 2  "value": [
 3    {
 4      "id": "contoso.sharepoint.com,<site-id>,<web-id>",
 5      "displayName": "Project Alpha",
 6      "name": "ProjectAlpha",
 7      "webUrl": "https://contoso.sharepoint.com/sites/ProjectAlpha"
 8    }
 9  ]
10}
HTTP (Azure AD auth)
  Method: GET
  Uri: https://graph.microsoft.com/v1.0/sites?search=@{variables('varSiteName')}
  ↓
Parse JSON: Response
  Schema: {...}
  ↓
Apply to Each: Sites in value array
  ↓
  Condition: displayName equals target site
    ↓ Yes
    Set variable: varSiteID = items('Apply_to_each')?['id']

Søgningen giver alle websteder, der ligner, så betingelsen på displayName skal med.

To veje, der ikke er efterprøvet: Send an HTTP request fra Office 365 Groups-connectoren med URI’en /sites/contoso.sharepoint.com:/sites/ProjectAlpha (Graph uden egen app-registrering, men handlingen har været begrænset til gruppe-endpoints), og SharePoints _api/v2.0/sites, der skulle give det sammensatte format direkte.

Fra PowerShell#

PnP PowerShell, ét websted:

 1# Install PnP PowerShell (if not installed)
 2Install-Module -Name PnP.PowerShell -Force -AllowClobber
 3
 4# Connect to SharePoint
 5Connect-PnPOnline -Url "https://contoso.sharepoint.com/sites/ProjectAlpha" -Interactive
 6
 7# Get site ID
 8$site = Get-PnPSite -Includes Id
 9$siteId = $site.Id
10Write-Host "Site ID: $siteId"

Adresser fra en CSV-fil med kolonnen URL, både webstedets og webbens id, og fejl pr. websted i stedet for at stoppe:

 1# Import site URLs from CSV
 2$sites = Import-Csv -Path "SiteURLs.csv"
 3
 4# CSV format:
 5# URL
 6# https://contoso.sharepoint.com/sites/Site1
 7# https://contoso.sharepoint.com/sites/Site2
 8
 9$results = @()
10foreach ($site in $sites) {
11    try {
12        Connect-PnPOnline -Url $site.URL -Interactive
13        $siteInfo = Get-PnPSite -Includes Id
14        $webInfo = Get-PnPWeb
15        
16        $results += [PSCustomObject]@{
17            URL = $site.URL
18            SiteID = $siteInfo.Id
19            WebID = $webInfo.Id
20            Title = $webInfo.Title
21            Status = "Success"
22        }
23    }
24    catch {
25        $results += [PSCustomObject]@{
26            URL = $site.URL
27            SiteID = "N/A"
28            WebID = "N/A"
29            Title = "N/A"
30            Status = "Error: $($_.Exception.Message)"
31        }
32    }
33}
34
35$results | Export-Csv -Path "SiteIDs_Results.csv" -NoTypeInformation
36Write-Host "Completed. Results exported to SiteIDs_Results.csv"

-Interactive kræver i dag et -ClientId fra en app-registrering i egen tenant, fordi PnP’s fælles app er fjernet.

Alle webstedssamlinger i tenanten med SharePoint Online Management Shell:

 1# Install SharePoint Online Management Shell (if not installed)
 2Install-Module -Name Microsoft.Online.SharePoint.PowerShell -Force
 3
 4# Connect to SharePoint admin center
 5Connect-SPOService -Url "https://contoso-admin.sharepoint.com"
 6
 7# Get all site collections with IDs
 8$sites = Get-SPOSite -Limit All | Select-Object Url, @{Name="SiteID"; Expression={$_.Id}}, Title
 9
10# Display results
11$sites | Format-Table -AutoSize
12
13# Filter specific site
14$site = Get-SPOSite -Identity "https://contoso.sharepoint.com/sites/ProjectAlpha"
15Write-Host "Site ID: $($site.Id)"

Gem dem#

Id’et ændrer sig ikke, så det behøver kun at blive hentet én gang. De kan holdes i en liste med kolonnerne SiteName, SiteURL (hyperlink), SiteID og LastUpdated, og et flow fylder id’erne ud om natten:

Recurrence: Daily at 2 AM
  ↓
Get Items: Site Registry List (contains URLs)
  ↓
Apply to Each: Site
  ↓
  Send HTTP Request: Get Site ID
    Site: @{items('Apply_to_each')?['SiteURL']}
    Method: GET
    Uri: _api/site?$select=Id
  ↓
  Update Item: Site Registry List
    ID: @{items('Apply_to_each')?['ID']}
    SiteID: @{body('HTTP_Request')?['Id']}

Det der driller#

  • Graph vil have kolon efter værtsnavnet og intet https:// foran. Uden kolon svarer Graph 404.
  • Webstedssamling og web er to id’er. _api/site/id og Get-SPOSite giver webstedssamlingens. En underweb har sit eget, som kun _api/web/id, Get-PnPWeb og Graphs tredje led giver.
  • “Access denied” betyder, at kontoen i forbindelsen ikke kan læse webstedet, eller at appen mangler Sites.Read.All.
  • Et tomt id fra PowerShell skyldes oftest en forbindelse, der peger et andet sted hen end forventet. Disconnect-PnPOnline og forbind igen.

Alle noter