Brugere og grupper på et websted med ensureUser
ensureUser lægger en bruger, en gæst eller en Entra-gruppe på webstedet og giver id’et tilbage — de rigtige claims for hver slags, og rettigheder bagefter.
Et nyt websted kender næsten ingen. En bruger kommer først på webstedets skjulte brugerliste, når vedkommende har været der, har fået rettigheder eller er blevet lagt der. Indtil da fejler en rettighedstildeling med “User cannot be found”, og et personfelt kan ikke sættes. ensureUser lægger brugeren eller gruppen på listen, hvis den ikke er der, og giver id’et tilbage. Er den der allerede, kommer det eksisterende id tilbage, så kaldet kan laves hver gang.
Hvordan id’et findes uden at lægge nogen på webstedet, står i Find en brugers id på et SharePoint-websted ud fra e-mailen. Claims i validateUpdateListItem står i Ret Oprettet af og Ændret af med validateUpdateListItem.
Kaldet#
Send an HTTP request to SharePoint. Webstedsadressen ligger i en miljøvariabel i mine flows, så det samme flow kan køre mod et testwebsted og et rigtigt.
Method: POST
Uri: _api/web/ensureUser
Headers:
{
"Accept": "application/json;odata=verbose",
"Content-Type": "application/json;odata=verbose"
}
Body:
{
"logonName": "i:0#.f|membership|john.doe@company.com"
}

Svaret:
1{
2 "d": {
3 "Id": 23,
4 "LoginName": "i:0#.f|membership|john.doe@company.com",
5 "Title": "John Doe",
6 "Email": "john.doe@company.com",
7 "IsSiteAdmin": false,
8 "IsHiddenInUI": false,
9 "PrincipalType": 1
10 }
11}
body('Send_an_HTTP_request_to_SharePoint_-_EnsureUser')?['d']?['Id']
PrincipalType er 1 for en bruger, 4 for en sikkerhedsgruppe (også en Microsoft 365-gruppe) og 8 for en SharePoint-gruppe.
logonName for hver slags#
Bruger i tenanten. Claimet med UPN’en, eller e-mailen alene, som SharePoint selv slår op:
i:0#.f|membership|user@domain.com
user@domain.com
Gæst. @ i gæstens egen adresse bliver til _, og #ext#@ og tenantens onmicrosoft.com-domæne kommer bagefter:
i:0#.f|membership|partner_company.com#ext#@contoso.onmicrosoft.com
Gæsten skal være inviteret og findes i Entra, før ensureUser kan finde vedkommende, og webstedet skal tillade deling med gæster. Den sikre vej til det præcise login er at slå det op:
GET _api/web/SiteUsers?$filter=Email eq 'external@domain.com'
Microsoft 365-gruppe. Gruppens objekt-id efter præfikset giver medlemmerne. Med _o efter id’et er det ejerne:
c:0o.c|federateddirectoryclaimprovider|<group-id>
c:0o.c|federateddirectoryclaimprovider|<group-id>_o
Det er de samme to claims, SharePoint selv bruger på et gruppeforbundet websted: medlemmerne i webstedets medlemsgruppe og ejerne som webstedssamlingsadministratorer.
Entra-sikkerhedsgruppe. Et andet præfiks end Microsoft 365-grupper:
c:0t.c|tenant|<group-id>
Ganesh Sanap sender i stedet gruppens visningsnavn som logonName og lader SharePoint slå det op. Det virker, så længe navnet er entydigt.
SharePoint Server med Windows-login:
i:0#.w|DOMAIN\username
SharePoint-grupper kan ikke lægges på med ensureUser. De findes allerede på webstedet. En bruger lægges ind i en SharePoint-gruppe sådan:
POST _api/web/sitegroups/getbyname('[Group Name]')/users
Body: {"__metadata": {"type": "SP.User"}, "LoginName": "i:0#.f|membership|user@domain.com"}
Gruppens objekt-id#
I Entra: Groups → gruppen → Object ID. Eller fra Microsoft Graph, som kræver en app eller forbindelse med adgang til Graph, ikke SharePoint-connectoren:
GET https://graph.microsoft.com/v1.0/groups?$filter=displayName eq 'Project Team Alpha'
Id’et står i value[0].id. En gruppe, der lige er oprettet med Graph, er ikke nødvendigvis synlig for SharePoint med det samme. Ikke efterprøvet, men værd at vide, hvis ensureUser fejler lige efter oprettelsen.
Rettigheder bagefter#
Hele webstedet:
POST _api/web/roleassignments/addroleassignment(principalid=@{variables('varUserID')},roledefid=1073741827)
En liste og et element har arv fra webstedet, som skal brydes først:
POST _api/web/lists/getByTitle('[List Name]')/breakroleinheritance(copyRoleAssignments=false,clearSubscopes=true)
POST _api/web/lists/getByTitle('[List Name]')/roleassignments/addroleassignment(principalid=23,roledefid=1073741827)
Samme mønster med /items([item-id]) for et element. Hvad copyRoleAssignments og clearSubscopes gør, står i Bryd og ret rettigheder på et listeelement med Power Automate.
| Rettighedsniveau | roledefid |
|---|---|
| Læse (Read) | 1073741826 |
| Bidrage (Contribute) | 1073741827 |
| Design | 1073741828 |
| Fuld kontrol (Full Control) | 1073741829 |
| Redigere (Edit) | 1073741830 |
Det er de indbyggede niveauer. GET _api/web/roledefinitions viser webstedets egne.
Et flow, der giver en gruppe adgang ud fra et valgt niveau:
Compose: Format Group Login Name
Inputs: c:0t.c|tenant|@{variables('varGroupID')}
Send HTTP Request: Ensure Group
Method: POST
Uri: _api/web/ensureUser
Body: {"logonName": "@{outputs('Compose_GroupLoginName')}"}
Switch: Permission Level
Case "Read": varRoleDefID = 1073741826
Case "Contribute": varRoleDefID = 1073741827
Case "Edit": varRoleDefID = 1073741830
Case "Full Control": varRoleDefID = 1073741829
Send HTTP Request: Assign Permission to Group
Method: POST
Uri: _api/web/roleassignments/addroleassignment(principalid=@{body('Ensure_Group')?['d']?['Id']},roledefid=@{variables('varRoleDefID')})
Forskellige websteder#
Skal flowet gøre noget forskelligt alt efter webstedstypen, står typen i WebTemplate og Configuration:
GET _api/web?$select=WebTemplate,Configuration
| Websted | WebTemplate | Configuration |
|---|---|---|
| Teamwebsted uden Microsoft 365-gruppe | STS | 3 |
| Teamwebsted med Microsoft 365-gruppe | GROUP | 0 |
| Kommunikationswebsted | SITEPAGEPUBLISHING | 0 |
Fejl#
“User cannot be found” efter ensureUser. Claimet passer ikke til typen: en sikkerhedsgruppe med Microsoft 365-præfikset, en gæst, der ikke er inviteret, eller en UPN, der ikke er e-mailen. Eller kaldet gik til et andet websted end det, rettigheden gives på.
“Access denied” ved tildelingen. Forbindelsens konto kan ikke administrere rettigheder på webstedet. Det kræver ejer eller fuld kontrol.
Tildelingen på et underwebsted fejler. Et underwebsted, der arver rettigheder, skal have arven brudt, før det kan få sine egne.
Det der driller#
- Sikkerhedsgrupper og Microsoft 365-grupper har forskellige claims.
c:0t.c|tenant|for sikkerhedsgrupper,c:0o.c|federateddirectoryclaimprovider|for Microsoft 365-grupper. _oer ejerne. Uden det er det medlemmerne.- Id’et gælder kun det websted,
ensureUserblev kaldt på. Kaldet skal gå til det samme websted som rettigheden. - Grupper frem for enkeltpersoner. Én Entra-gruppe på webstedet er ét kald, og medlemskabet styres i Entra.