Accedere a SharePoint da PowerShell tramite Add-in Permissions senza librerie
Dopo aver creato un Add-in permissions può tornare utile verificare velocemente il funzionamento.
Per fa questo si possono usare i comandi pnp o una console app in C#, oppure usa questo script PowerShell
La prima cosa da fare è invocare la url https://accounts.accesscontrol.windows.net/ <tenantId>/tokens/OAuth/2 per richiedere il bearer token.
Questo token andrà passato nell'header in tutte le chiamate successive per ottenere l'autenticazione.
Quello che serve come parametri sono il: TenantID, TenantName, ClientID e ClientSecret.
poi va richiesto il bearer token facendo una chiamata in post a 'https://accounts.accesscontrol.windows.net
nella variabile $tokenResponse c'è una risposta simile a questa e il token si trova nella proprietà Content (stringa JSON)
la proprietà Content una volta convertita in JSON è simile a questa
Con il token, posso richiamare, in modo autenticato, le API di SharePoint (https://tenantName.sharepoint.com/ ), ad esempio per elencare tutte le liste presenti nel sito ( _api/web/lists )
Oppure possono elencare tutti i files di una document library ( _api/web/GetFolderByServerRelativeUrl('/Shared Documents')/Files )
da un risultato simile a questo
Vedi anche Get to know the SharePoint REST service.
Per fa questo si possono usare i comandi pnp o una console app in C#, oppure usa questo script PowerShell
La prima cosa da fare è invocare la url https://accounts.accesscontrol.windows.net/ <tenantId>/tokens/OAuth/2 per richiedere il bearer token.
Questo token andrà passato nell'header in tutte le chiamate successive per ottenere l'autenticazione.
Quello che serve come parametri sono il: TenantID, TenantName, ClientID e ClientSecret.
PowerShell
# definire i parametri del tenant + client e client secret
$tenantId= "<tenant id>"
$tenantName= "<tenant name>"
$clientId = "<client id>"
$clientSecret = "<client secret>"
# neccessario per le chiamate alle api di SharePoint
$siteCollectionUrl= "sites/sito1"
PowerShell
# ottenere il token di accesso (Bearer) tramite client e clientsecret
$LOGIN_ENDPOINT = "https://accounts.accesscontrol.windows.net/$tenantId/tokens/OAuth/2";
$SHAREPOINT_PRINCIPAL = "00000003-0000-0ff1-ce00-000000000000";
$headers = @{
"Accept" = "application/json";
"Content-Type" = "application/x-www-form-urlencoded"
}
# il client secret va ecodato UrlEncode
$body = "grant_type=client_credentials&client_id=$($clientId)@$($tenantId)" +
"&client_secret=$([System.Net.WebUtility]::UrlEncode($clientSecret))" +
"&resource=$($SHAREPOINT_PRINCIPAL)/$($tenantName).sharepoint.com@$($tenantId)"
$tokenResponse = Invoke-WebRequest -Method POST -Uri $LOGIN_ENDPOINT -Body $body -Headers $headers
# content trasformato in JSON
$tokenJson = $tokenResponse.Content | ConvertFrom-Json
# il token si trova in $tokenJson.access_token
Write-Host "Bearer $($tokenJson.access_token)"
Text
StatusCode : 200
StatusDescription : OK
Content : {"token_type":"Bearer","expires_in":"86399","not_before":"1606857774","expires_on":"1606944474","re
source":"00000003-0000-0ff1-ce00-000000000000/sgart.sharepoint.com@DCD5C3F2-5BC6-4009-9AD1-E26AE353CF64
dc...
RawContent : HTTP/1.1 200 OK
Pragma: no-cache
Strict-Transport-Security: max-age=31536000; includeSubDomains
X-Content-Type-Options: nosniff
x-ms-request-id: 7922aa51-f5df-4637-a80a-9bf5ac213502
x-ms-ests-ser...
Forms : {}
Headers : {[Pragma, no-cache], [Strict-Transport-Security, max-age=31536000; includeSubDomains],
[X-Content-Type-Options, nosniff], [x-ms-request-id, 7922aa51-f5df-4637-a80a-9bf5ac213502]...}
Images : {}
InputFields : {}
Links : {}
ParsedHtml : mshtml.HTMLDocumentClass
RawContentLength : 1416
PowerShell
token_type : Bearer
expires_in : 86399
not_before : 1606858305
expires_on : 1606945005
resource : 00000003-0000-0ff1-ce00-000000000000/sgart.sharepoint.com@DCD5C3F2-5BC6-4009-9AD1-E26AE353CF64
access_token : eyJ0eXAiOiJKV ... NWlQ
Con il token, posso richiamare, in modo autenticato, le API di SharePoint (https://tenantName.sharepoint.com/ ), ad esempio per elencare tutte le liste presenti nel sito ( _api/web/lists )
PowerShell
# query per ottenere l'elenco delle liste presenti con il Bearer token passato nell'header
$apiUrl = "https://$($tenantName).sharepoint.com/$siteCollectionUrl/_api/web/lists"
Write-Host "Url: $apiUrl"
$headers = @{
"Accept" = "application/json";
"Content-Type" = "application/json";
"Authorization" = "Bearer $($tokenJson.access_token)"
}
$responseQuery = Invoke-WebRequest -Method GET -Uri $apiUrl -Headers $headers
$queryJson = $responseQuery.Content | ConvertFrom-Json
$queryJson.value | select id, title
Da notare che il bearer token viene passato nel parametro Authorization nell'header.
da un risultato simile a questo Text
Id Title
-- -----
33078264-dd19-40b1-b8ab-7cb5e9b6eadc appdata
dd90b1da-fa6d-410d-84e4-f5862a5f1e47 appfiles
c123cad9-7259-4fb7-8132-88e76d242df5 Apps for SharePoint
...
0798b432-1580-4525-9feb-1055a4025ddd Documents
...
Oppure possono elencare tutti i files di una document library ( _api/web/GetFolderByServerRelativeUrl('/Shared Documents')/Files )
PowerShell
# query per ottenere l'elenco delle degli items di una lista con il Bearer token passato nell'header
#$apiUrl = "https://$($tenantName).sharepoint.com/$siteCollectionUrl/_api/web/lists/GetByTitle('Documents')/items"
$apiUrl = "https://$($tenantName).sharepoint.com/$siteCollectionUrl/_api/web/GetFolderByServerRelativeUrl('/$siteCollectionUrl/Shared Documents')/Files?`$expand=ListItemAllFields"
Write-Host "Url: $apiUrl"
$headers = @{
"Accept" = "application/json";
"Content-Type" = "application/json";
"Authorization" = "Bearer $($tokenJson.access_token)"
}
$responseQuery = Invoke-WebRequest -Method GET -Uri $apiUrl -Headers $headers
$queryJson.value | select @{Label="ID"; Expression={$_.ListItemAllFields.ID}}, Name, ServerRelativeUrl
Text
ID Name ServerRelativeUrl
-- ---- -----------------
16 file13.txt /Shared Documents/file13.txt
21 Document11 (1).docx /Shared Documents/Document11 (1).docx
24 rubrica (2).html /Shared Documents/rubrica (2).html
...