Bulk User Creation in Microsoft Entra ID

Bulk User Creation in Microsoft Entra ID — vmorecloud
Identity & Access · Microsoft Entra ID

Bulk User Creation in Microsoft Entra ID

Onboarding twenty new hires is a task. Onboarding two thousand is an operation. Here’s how the CSV bulk-create pipeline, and its scriptable Microsoft Graph alternative, turn a spreadsheet into a tenant full of working identities.

EXHIBIT A — bulkCreateUserTemplate.csv
Name [displayName] User name [userPrincipalName] Initial password Block sign in Job title Department Usage location
Alain Charonalain@vmorecloud.onmicrosoft.com••••••••!NoSystems EngineerInfrastructureUS
Isabella Simonsenisabella@vmorecloud.onmicrosoft.com••••••••!NoCloud ArchitectPlatformUS
Joseph Pricejoseph@vmorecloud.onmicrosoft.com••••••••!NoService DeskIT OpsGB
Three rows, one upload, three working accounts — no wizard, no repetition. This is the entire mental model of bulk user creation.

Every tenant eventually meets its first mass-onboarding moment — a merger, a new site opening, a term of student accounts, a contractor wave. The New user wizard in Microsoft Entra ID was built for one person at a time. Bulk create was built for the other case: dozens, hundreds, or thousands of identities provisioned from a single file.

This piece walks through what bulk creation actually does under the hood, the two practical ways to run it — the built-in CSV pipeline and Microsoft Graph PowerShell — where each one breaks, and a full step-by-step tutorial to run your own bulk import safely, on the first attempt.

01Why Bulk Creation Earns Its Place

Manually creating accounts scales linearly with tedium: each user is a form, a password, a set of attributes, a license assignment, a group membership. At any real headcount, that process becomes the bottleneck for onboarding day one — badges are printed, desks are assigned, but sign-in still isn’t ready.

Bulk creation collapses that into a single reviewable artifact: a spreadsheet. It’s auditable before submission, repeatable across environments, and — critically — it’s the same shape of file whether five people are onboarding or five hundred.

i
Where this fits

Bulk create is for internal member accounts. If you’re bringing in external partners or vendors, you want Bulk invite for B2B guest users instead — it sends invitation emails and follows a different consent flow entirely.

02Two Roads In

Both paths land in the same place — new objects in the directory — but they suit different operators and different scales.

Portal-native

CSV Bulk Create

Download a template, fill rows, upload through the Entra admin center. No scripting required. Best for HR-adjacent admins and one-off batches.

Scriptable

Microsoft Graph PowerShell

Import a CSV and loop New-MgUser per row. Full control over attributes, error handling, and license assignment in the same run.

API-first

Graph Batch Requests

Bundle multiple POST /users calls into a single JSON batch payload. The right tool when provisioning is triggered from another system entirely.

For most IT teams, the decision comes down to volume and repeatability. A one-time batch of forty seasonal staff is a portal job. A recurring quarterly intake tied to an HR export belongs in a script that can be scheduled, logged, and re-run.

03Reading the CSV Template

The template downloaded from the portal isn’t an ordinary spreadsheet — its structure is load-bearing. Row one carries a version tag such as version:v1.0, and the column header row encodes both the human-readable label and the underlying property name, like Name [displayName] Required. Neither row should be touched.

ColumnPropertyRequiredNotes
NamedisplayNameRequiredFull display name shown across Entra and Microsoft 365
User nameuserPrincipalNameRequiredSign-in identity; no leading/trailing whitespace
Initial passwordpasswordProfileRequiredMust satisfy the tenant’s active password policy
Block sign inaccountEnabledRequiredYes/No — counter-intuitively inverted from “enabled”
First / Last namegivenName / surnameOptionalFeeds the global address list
Job title / DepartmentjobTitle / departmentOptionalUseful for dynamic group rules later
Usage locationusageLocationOptionalTwo-letter country code — required before license assignment will succeed

Only the first four columns are mandatory. Everything else can stay blank in the template and be enriched later — through a second bulk update, a HR sync, or manually.

!
Where imports fail

The single most common upload error is “Unknown CSV header found” — almost always caused by adding, renaming, or reordering a column. Extra columns are silently ignored, but a modified header row invalidates the whole file. Re-download a fresh template rather than editing an old one.

A bulk import is only as trustworthy as the row you didn’t check.

04What Bulk Create Doesn’t Do

  • No invitation email. Bulk create provisions internal member accounts with the password you specify — nothing is sent to the user. Credentials have to reach them through your own onboarding channel.
  • No license assignment. The CSV creates the identity, not the seat. Licensing is a separate step — group-based licensing tied to a security group is the least painful way to attach it at scale.
  • No group membership. Same story — accounts land with no group ties unless a dynamic group rule picks them up based on an attribute like department.
  • No large-batch guarantee. Jobs that don’t complete within the service’s processing window can partially fail. Splitting a very large population into smaller batches is safer than submitting one enormous file.

05When to Reach for PowerShell Instead

The portal CSV flow is deliberately narrow — it creates accounts and nothing more. The moment a batch needs conditional logic (different usage locations per office, license group assignment in the same run, custom attribute mapping from an HR export), Microsoft Graph PowerShell earns its complexity. The same source CSV can drive it — only the execution engine changes.

Add-BulkEntraUsers.ps1PowerShell 7 · Microsoft.Graph 2.x
# Connect with the minimum scope this task needs
Connect-MgGraph -Scopes "User.ReadWrite.All"

# Source rows — same shape as the portal template
$users = Import-Csv -Path "C:\Import\NewUsers.csv"

foreach ($u in $users) {
    $passwordProfile = @{
        Password                      = $u.InitialPassword
        ForceChangePasswordNextSignIn = $true
    }

    New-MgUser `
        -DisplayName $u.DisplayName `
        -UserPrincipalName $u.UserPrincipalName `
        -MailNickname ($u.UserPrincipalName -split "@")[0] `
        -AccountEnabled `
        -PasswordProfile $passwordProfile `
        -UsageLocation $u.UsageLocation `
        -JobTitle $u.JobTitle `
        -Department $u.Department

    Write-Host "Created:" $u.UserPrincipalName
}

The trade is explicit: the portal path needs zero setup and produces a built-in results file; the scripted path needs Graph module installation and delegated permissions, but earns per-row error handling, inline license assignment, and something the portal doesn’t give you at all — a re-runnable, source-controlled onboarding pipeline.

06Before You Submit — A Short Checklist

  • Re-download the template if it’s more than a few weeks old — column definitions do change between versions.
  • Confirm every userPrincipalName is unique and matches a verified domain on the tenant.
  • Set Usage location on every row you intend to license — it can’t be added retroactively through the same bulk job.
  • Test with a three-to-five row batch before submitting the full population. It’s cheaper to fix a bad password policy on five accounts than five hundred.
  • Keep the signed-in account at least User Administrator — lower roles can’t reach the Bulk create page at all.
Hands-On Lab

Tutorial: Bulk Create Users in Entra ID

Two tracks, same destination. Pick the Portal track for a one-off import with no tooling, or the PowerShell track if this needs to be repeatable.

01

Sign in with the right role

Go to entra.microsoft.com with an account holding at least User Administrator. Global Reader and lower roles won’t see the Bulk create option.

02

Open Bulk create

Navigate to Identity → Users → All users, then select Bulk operations → Bulk create from the toolbar.

03

Download the current template

Select Download to get a fresh bulkCreateUserTemplate.csv. Don’t reuse an old saved copy — header formats change between versions.

04

Fill in your rows

Starting at row 4, add one user per line. At minimum, populate Name, User name, Initial password, and Block sign in. Leave the version row and header row exactly as downloaded.

version:v1.0 Name [displayName] Required,User name [userPrincipalName] Required,Initial password [passwordProfile] Required,Block sign in (Yes/No) [accountEnabled] Required Alain Charon,alain@vmorecloud.onmicrosoft.com,P@ssw0rd2026!,No
05

Save as .csv and upload

Save the file with the .csv extension intact. Back on the Bulk create page, browse to the file and select it under Upload your CSV file.

06

Submit and let validation run

Select Submit. Entra ID validates the file’s structure before processing anything — a clean file shows File uploaded successfully. Fix any flagged rows and resubmit if needed.

07

Track the job and review results

Watch the notification bell for job status, then open Bulk operation results to download a results file — it lists exactly which rows failed and why.

08

Verify the accounts landed

Check Users → All users in the portal, or confirm from PowerShell with Get-MgUser -Filter "UserType eq 'Member'". Remember: no invitation email was sent — you still need to deliver credentials yourself.

01

Install the Graph module

From an elevated PowerShell 7 session:

Install-Module Microsoft.Graph -Scope CurrentUser
02

Connect with a scoped session

Request only what the task needs — broader scopes are a bigger blast radius if the script is ever compromised.

Connect-MgGraph -Scopes “User.ReadWrite.All”
03

Prepare your source CSV

Use plain, predictable column names of your own choosing — this file isn’t the portal template, so its structure is entirely up to you. Save it locally, e.g. C:\Import\NewUsers.csv.

04

Run the import loop

Use the script from the Editorial section above, or extend it to also call New-MgGroupMember or Set-MgUserLicense per row for a fully self-contained onboarding run.

05

Log and verify

Pipe results to a transcript or CSV export so failures are traceable, then confirm the batch with:

Get-MgUser -Filter “UserType eq ‘Member'” | Select DisplayName, UserPrincipalName, AccountEnabled

Leave a Reply

Your email address will not be published. Required fields are marked *

Ads Blocker Image Powered by Code Help Pro

Ads Blocker Detected!!!

We have detected that you are using extensions to block ads. Please support us by disabling these ads blocker.

Powered By
100% Free SEO Tools - Tool Kits PRO