Spring til indholdet

Find en brugers id på et SharePoint-websted ud fra e-mailen

getByEmail, ensureUser og et filter på siteusers — tre måder at komme fra en e-mailadresse til det tal, personfelter og rettigheder vil have, og hvornår hver af dem fejler.

Opdateret Power AutomateSharePoint Online 4 min. læsning

Personfelter, rettigheder og filtre på personkolonner vil have brugerens id på webstedet. Det er et tal fra webstedets skjulte brugerliste (User Information List), og det er hverken e-mailen, UPN’en eller Entra-objekt-id’et fra Get user profile (V2). Den samme person har et andet id på hvert websted.

Hvordan id’et bruges i et personfelt, står i Opret listeelementer med REST fra Power Automate. Rettigheder på et element står i Bryd og ret rettigheder på et listeelement med Power Automate. Grupper og gæster står i Brugere og grupper på et websted med ensureUser.

MetodeKaldFindes brugeren ikke på webstedet
getByEmailGETFejler: “User cannot be found”
siteusers?$filterGETTomt svar, ingen fejl
ensureUserPOSTBrugeren lægges på webstedet, og id’et kommer tilbage

getByEmail#

Til brugere, der allerede er på webstedet. Send an HTTP request to SharePoint:

Site Address: https://[tenant].sharepoint.com/sites/[site-name]
Method: GET
Uri: _api/web/SiteUsers/getByEmail('john.doe@company.com')
Headers:
{
  "Accept": "application/json;odata=verbose"
}

Opslaget med getByEmail i flowdesigneren, med e-mailen som dynamisk værdi.

Svaret:

 1{
 2  "d": {
 3    "__metadata": {
 4      "id": "https://contoso.sharepoint.com/sites/ProjectAlpha/_api/Web/GetUserById(23)",
 5      "type": "SP.User"
 6    },
 7    "Id": 23,
 8    "LoginName": "i:0#.f|membership|john.doe@company.com",
 9    "Title": "John Doe",
10    "PrincipalType": 1,
11    "Email": "john.doe@company.com",
12    "IsHiddenInUI": false,
13    "IsSiteAdmin": false,
14    "UserId": {
15      "NameId": "<puid>",
16      "NameIdIssuer": "urn:federation:microsoftonline"
17    }
18  }
19}

Id’et:

body('Send_an_HTTP_request_to_SharePoint_-_Get_UserID')?['d']?['Id']

getByEmail slår op på feltet Email i brugerlisten. Er brugerens e-mail en anden end UPN’en, eller står feltet tomt, finder den ikke brugeren.

Et filter i stedet#

Samme opslag uden at handlingen fejler:

Method: GET
Uri: _api/web/siteusers?$filter=Email eq 'john.doe@company.com'
Headers:
{
  "Accept": "application/json;odata=verbose"
}

Svaret er en liste i d.results. Er den tom, er brugeren ikke på webstedet:

length(body('Get_Site_User')?['d']?['results'])
first(body('Get_Site_User')?['d']?['results'])?['Id']

Det er også vejen til en gæsts LoginName, som er besværligt at skrive selv.

ensureUser#

Til brugere, der måske ikke er på webstedet endnu. Et nyt websted har en næsten tom brugerliste, og en bruger kommer først på den, når vedkommende har været der, har fået rettigheder eller er blevet lagt der med ensureUser.

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 har samme form som getByEmail, og id’et står i d.Id. logonName kan også være e-mailen alene, som SharePoint selv slår op. Resten — grupper, gæster, claims — står i noten om ensureUser.

getByEmail med ensureUser som reserve#

Send HTTP Request: Get User by Email
  Method: GET
  Uri: _api/web/SiteUsers/getByEmail('@{variables('varUserEmail')}')

Set varUserID (Configure run after: is successful)
  Value: @{body('Get_User_by_Email')?['d']?['Id']}

Send HTTP Request: Ensure User (Configure run after: has failed)
  Method: POST
  Uri: _api/web/ensureUser
  Body: {"logonName": "i:0#.f|membership|@{variables('varUserEmail')}"}

Set varUserID (Configure run after: is successful)
  Value: @{body('Ensure_User')?['d']?['Id']}

Uden Configure run after på reserven når flowet aldrig så langt: en fejlet getByEmail stopper det. Det røde kryds står stadig i kørselshistorikken og ligner en fejl, når man kigger efter. Filteret på siteusers er den renere vej.

Id’et i brug#

Filtrer elementer på en personkolonne:

GET _api/web/lists/getByTitle('Projects')/items?$filter=ProjectManagerId eq @{variables('varUserID')}

Personfeltet i et MERGE-kald hedder feltets interne navn plus Id: ProjectManagerId for et enkelt, og en samling for flere personer. Formatet står i noten om at oprette listeelementer.

Id’et er også principalid i en rettighedstildeling. Kaldene og tallene for rettighedsniveauerne står i noten om ensureUser.

Mange opslag i ét flow#

Slås de samme personer op igen og igen, kan id’erne gemmes i en objektvariabel undervejs. En variabel kan ikke sættes ud fra sig selv, så det går gennem en Compose:

Compose - Add to cache:
  setProperty(variables('varUserIDCache'), variables('varUserEmail'), body('Ensure_User')?['d']?['Id'])

Set variable - varUserIDCache:
  outputs('Compose_-_Add_to_cache')
variables('varUserIDCache')?[variables('varUserEmail')]

Er værdien null, er personen ikke slået op endnu.

Det der driller#

  • _api/web/currentUser i et flow er forbindelsens konto, ikke den, der startede flowet. Den, der har oprettet elementet, står i triggerens Author.
  • Id’et gælder ét websted. Et id fra ét websted i et kald mod et andet giver en anden person eller ingen.
  • E-mail og UPN er ikke altid det samme. getByEmail bruger e-mailen, ensureUser med i:0#.f|membership| bruger UPN’en.
  • Get user profile (V2) giver Entra-objekt-id’et. Det kan ikke bruges i et personfelt eller en rettighed.

Alle noter