Spring til indholdet

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.

Opdateret Power AutomateAdgangsstyringSharePoint Online 4 min. læsning

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"
}

Kaldet i flowdesigneren, med webstedsadressen fra en miljøvariabel og brugernavnet sat ind i claimet i body.

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.

Rettighedsniveauroledefid
Læse (Read)1073741826
Bidrage (Contribute)1073741827
Design1073741828
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
WebstedWebTemplateConfiguration
Teamwebsted uden Microsoft 365-gruppeSTS3
Teamwebsted med Microsoft 365-gruppeGROUP0
KommunikationswebstedSITEPAGEPUBLISHING0

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.
  • _o er ejerne. Uden det er det medlemmerne.
  • Id’et gælder kun det websted, ensureUser blev 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.

Alle noter