Published:
Jul 22, 2026
|
Last updated:
Jul 22, 2026
|
9
min read

How to Set SharePoint List Item-Level Permissions: 6 Practical Ways

Siam Rochanavichit
Siam is a Sales Engineer with a decade of experience in Microsoft 365, SharePoint, Teams, and enterprise collaboration governance.

I’ve found SharePoint item-level permissions are easy to set badly and hard to clean up later. In this guide, I break down which native method fits which access problem, where each one falls short, and when governance becomes the bigger issue.

In this article

Executive summary

In this blog, I break down the main ways to manage SharePoint list item-level permissions and explain when each one actually makes sense. I cover where advanced list settings work, when Power Automate is the better fit for field-driven access, when PnP PowerShell makes bulk changes practical, and when SharePoint Client-Side Object Model, or CSOM, belongs in a coded solution. I also show why breaking inheritance matters, where native methods become difficult to manage at scale, and what best practices help keep permissions explainable later. My main point is simple: the right method depends less on admin preference and more on the access problem you’re solving.

How to choose the right SharePoint list item-level permission method

Choosing the right method early saves a lot of cleanup later. SharePoint gives you several ways to control item-level access, but they are not interchangeable. Some are best for simple list-wide rules. Others are better for dynamic business logic, bulk remediation, or developer-managed solutions.

The easiest way to make this more complex than it needs to be is to start with the tool you already know, rather than the requirement you actually have. Before you build a flow, write a script, or break inheritance on dozens of items, it helps to define what kind of access problem you are solving.

If you need a quick rule of thumb, use this:

  • Use advanced list settings when you need basic built-in restrictions such as limiting whether users can read or edit only their own items.
  • Use Power Automate when permissions should change based on a field, status, approver, owner, or another item value.
  • Use PnP PowerShell when you need to update many items in bulk.
  • Use SharePoint CSOM when you’re building a custom application or repeatable code-based process.
  • Use a third-party administration platform when item-level permissions have turned into an operational problem, not just a one-off task.

One practical point here: the “based on column” scenario usually belongs in the Power Automate bucket. Native list settings don’t give you true field-driven permission logic.

What breaking permission inheritance means for SharePoint list items

By default, a SharePoint list item inherits permissions from its parent list, and the list inherits from the site.

If you want one item to have different access from the rest of the list, you usually need to break permission inheritance for that item first. Once inheritance is broken, you can assign unique permissions directly to that item.

This matters because admins sometimes assume item-level restrictions and unique item permissions are the same thing. They aren’t.

  • List advanced settings can control broad behavior, like whether users can read only their own items.
  • Unique item permissions are more specific, and usually require inheritance to be broken.

How to use advanced list settings for simple item-level restrictions

Advanced list settings are usually the first native option worth checking because they are already built into the list and require no separate tooling. They are also one of the most commonly misunderstood parts of SharePoint item-level permissions. On the surface, they look like a way to create custom item-by-item access. In practice, they are better thought of as a narrow set of list-wide behavior controls.

That distinction matters. If your requirement is simple, this method can solve it quickly and cleanly. If your requirement sounds conditional, role-based, or tied to business logic, this same method can send you down the wrong path. It is fast precisely because it does not offer much nuance.

So when I say this is the fastest native method, but also the most limited, what I mean is that it works best when the access rule applies broadly and predictably across the whole list. It is not really a custom permissions engine. It is a built-in restriction model for a small set of common scenarios.

When advanced list settings make sense

If you’re trying to decide whether to use SharePoint’s advanced list settings, this makes sense if your goal is something like:

  • users can read only items they created,
  • users can edit only items they created, or
  • the whole list should follow one simple item-level rule.

How to configure advanced list settings

If you’re using advanced settings, first make sure you’re editing a SharePoint list rather than a document library. The options are not the same, and item-level settings may not appear where some guides suggest.

  1. Open the SharePoint list.  
  2. Go to List Settings.  
  3. Open Advanced settings.  
  4. Look for the Item-level Permissions section.  
    NOTE: If you do not see an Item-level Permissions section, you may be in a document library rather than a list. In that case, access to a specific file or document is typically managed from the item itself through Manage access, not through the list’s advanced settings.
  5. Set the available options for Read access and Create and Edit access as needed.  
  6. Save the settings and test with a non-owner account.

What this method does well

There are things that SharePoint advanced list settings do well:  

  • They’re quick.
  • They require no automation or scripting.
  • They work well for straightforward owner-based scenarios.

Where this method falls short

While there are advantages to using advanced list settings, there are also some areas where they fall short:

  • They apply broad list behavior, not rich per-item logic.
  • They don’t handle permissions based on a column in a nuanced way.
  • They can confuse site owners who expect true custom access control.

In practice, this is the method I’d start with only if the requirement is very simple. If the rule sounds like “Finance managers can see approved items from their region,” this won’t be enough.

How to use Power Automate for dynamic SharePoint item permissions

Power Automate is usually the point where SharePoint list permissions move from static restriction to actual logic. If advanced list settings are about broad built-in behavior, Power Automate is about making access respond to what the item is, who owns it, where it sits in a process, or what stage it has reached.

That’s why this is the native option when permissions need to respond to item data. You are no longer just asking, “Should users see only their own items?” You’re asking things like, “Who should see this item when the department is Finance, the status is Approved, and the approver has changed?” That kind of requirement is much closer to workflow than to settings.

This is also the point where many admins realize the real problem is not setting permission once. It’s making sure permission changes happen consistently as the item changes over time. When the access rule depends on fields, status, ownership, or approval state, automation is usually the cleanest native path.

When Power Automate is the right choice

If you’re looking evaluate Power Automate as a method to help manage your SharePoint item permissions, it’s important to consider where it’s strengths lie. This breaks down into four key areas:

  • access depends on a field value,
  • access changes when item status changes,
  • an approver or assigned user should get access automatically, or
  • you want repeatable logic without writing full custom code.

How the Power Automate pattern usually works

At a high level, the Power Automate flow works like this:

  1. Trigger when an item is created or modified.
  2. Evaluate the relevant field or column value.
  3. Break inheritance on the item if needed.
  4. Remove inherited permissions or unwanted principals.
  5. Grant access to the right users or groups.

An example use case could be when permissions based on a column.

In this case you can configure the flow so that:

  • items marked HR are shared only with the HR group,
  • items marked Finance are shared only with the Finance group,
  • and draft items remain limited to the creator and approvers.

That’s the kind of requirement people often try to force into list settings. It belongs in automation.

What to watch out for with Power Automate

Of course, Power Automate isn’t perfect for every situation, here are some of the areas that can be problematic:

  • Flows can become difficult to troubleshoot if permission logic grows over time.
  • Item updates can retrigger flows unexpectedly if you don’t handle conditions carefully.
  • It’s easy to create a process that works for the happy path but fails on reassignment, reapproval, or ownership changes.

That last point is where experienced admins usually get cautious. Granting permission is easy. Keeping the permission model clean after six months of business changes is harder.

Learn how to apply unique permissions to a specific SharePoint item and then restore it back to inherited access using a simple scripted approach.

Below are the two PowerShell scripts I used in the video if you would like copy them.

PowerShell script 1: Add Permissions on a specific SharePoint item

param(
    [Parameter(Mandatory = $true)]
    [string]$SiteUrl = "Your SharePoint site URL",

    [Parameter(Mandatory = $true)]
    [string]$LibraryName,

    [Parameter(Mandatory = $true)]
    [string]$ItemPath,

    [Parameter(Mandatory = $true)]
    [string]$UserUPN,

    [Parameter(Mandatory = $true)]
    [string]$PnPClientId = "Your PNP App Client Id", #Register the PNP app using Register-PnPEntraIDAppForInteractiveLogin -ApplicationName "PnP.PowerShell" -Tenant "yourtenant.onmicrosoft.com" -Interactive

    [Parameter(Mandatory = $true)]
    [string]$PermissionLevel = "Read" #other possible values are Edit, Contribute, FullControl
)

try {
    # Connect to SharePoint
    Connect-PnPOnline -Url $SiteUrl -Interactive -ClientId $PnPClientId

    # Get the list item by file path
    $file = Get-PnPFile -Url $ItemPath -AsListItem

    if (-not $file) {
        throw "File not found at path: $ItemPath"
    }

    # Break permission inheritance if needed
    $hasUniquePerms = Get-PnPProperty -ClientObject $file -Property HasUniqueRoleAssignments

    if (-not $hasUniquePerms) {
        Set-PnPListItemPermission `
            -List $LibraryName `
            -Identity $file.Id `
            -User $UserUPN `
            -AddRole $PermissionLevel
    }
    else {
        Set-PnPListItemPermission `
            -List $LibraryName `
            -Identity $file.Id `
            -User $UserUPN `
            -AddRole $PermissionLevel
    }

    Write-Host "Successfully granted '$PermissionLevel' access to $UserUPN for file '$ItemPath'" -ForegroundColor Green
}
catch {
    Write-Error $_.Exception.Message
}

PowerShell script 2: Remove permissions on a specific SharePoint item

param(
    [Parameter(Mandatory = $true)]
    [string]$SiteUrl,

    [Parameter(Mandatory = $true)]
    [string]$ItemPathRelativeUrl,

    [Parameter(Mandatory = $true)]
    [string]$PnPClientId = "Your PNP App Client Id" #Register the PNP app using Register-PnPEntraIDAppForInteractiveLogin -ApplicationName "PnP.PowerShell" -Tenant "yourtenant.onmicrosoft.com" -Interactive
)

try {
    # Connect to SharePoint
    if ([string]::IsNullOrWhiteSpace($ClientId)) {
        Connect-PnPOnline -Url $SiteUrl -Interactive -ClientId $PnPClientId
    }
    else {
        Connect-PnPOnline -Url $SiteUrl $SiteUrl -Interactive -ClientId $PnPClientId
    }

    # Get the file as a list item
    $listItem = Get-PnPFile -Url $ItemPathRelativeUrl -AsListItem

    if (-not $listItem) {
        throw "File not found: $ItemPathRelativeUrl"
    }

    # Load current inheritance state
    Get-PnPProperty -ClientObject $listItem -Property HasUniqueRoleAssignments | Out-Null

    if (-not $listItem.HasUniqueRoleAssignments) {
        Write-Host "The file is already inheriting permissions." -ForegroundColor Yellow
        return
    }

    # Restore inheritance
    $listItem.ResetRoleInheritance()
    Invoke-PnPQuery

    Write-Host "Successfully restored permission inheritance on file: $ItemPathRelativeUrl" -ForegroundColor Green
}
catch {
    Write-Host "Error: $($_.Exception.Message)" -ForegroundColor Red
}

How to use PnP PowerShell for bulk item-level permission changes

PnP PowerShell is usually the point where the problem stops being “How do I change this one item?” and becomes “How do I change hundreds of items without spending all day in the browser?” It is the better native choice when the work is repetitive, scoped, and clearly defined in advance.

This matters because SharePoint’s UI is workable for one-off corrections, but it is not a serious way to handle list-wide cleanup or bulk remediation. Once you need to apply the same permission action across many existing items, scripting becomes the more realistic administrative route. You are trading clicks for control.

That said, this method is not really about convenience alone. It is about repeatability and scale. If you already know which items need to change, what the new permission state should be, and how to validate the result, PnP PowerShell can be much more efficient than manual changes. If those things are still fuzzy, scripting can make a messy permissions model move faster, but not necessarily become easier to govern.

[h3]When PnP PowerShell is the right choice

So when should you consider using PnP Powershell to manage SharePoint item permissions? If you want to achieve any of the following, things PnP Powershell is a good option:

  • apply unique permissions across many existing items,
  • remove direct permissions in bulk,
  • remediate a permission cleanup project,
  • or run a controlled admin task across a large list.

What the PnP PowerShell approach typically involves

If you’re considering using PnP Powershell to manage SharePoint item permissions, your process is going to look similar to this:

  1. Connect to the target site.
  2. Retrieve list items.
  3. Identify the items that need change.
  4. Break inheritance where required.
  5. Grant or remove permissions programmatically.
  6. Log the output for review.

Admins tend to use this method as it’s much faster than clicking item by item, it works well for controlled one-time projects, and it gives technical teams precision.

Where PnP PowerShell can become difficult

Like most things there is a tradeoff. With PnP Powershell this is operational.

Once you move into scripting, you also take on:

  • testing,
  • logging,
  • rerun safety,
  • exception handling,
  • and ongoing maintenance.

That’s fine for mature admin teams. It’s less fine when the script becomes the only record of what changed and why.

How to use SharePoint CSOM for programmatic item-level permission control

SharePoint Client-Side Object Model, or CSOM, is the most developer-oriented native option in this comparison. If Power Automate is aimed at admins who want logic without much code, and PnP PowerShell is aimed at bulk administrative scripting, CSOM is what you reach for when permissions are part of an application pattern rather than a standalone admin task.

That distinction is important. CSOM is usually not the easiest way to solve a basic SharePoint list permissions request. It becomes the right choice when the list is tied to a broader business process, a custom front end, or a managed codebase where permissions need to be set as one step inside a larger workflow. In other words, the permissions logic is not the whole solution. It is one component inside a deeper implementation.

This is why CSOM tends to show up in more specialized builds. You use it when you need precise, code-level handling of inheritance, role assignments, and execution flow, and when your team is already prepared to own that code over time.

When CSOM is the right choice

The CSOM is definitely an appropriate consideration for managing your SharePoint item permissions if:

  • you’re building a custom application,
  • you need permission logic embedded in a larger process,
  • or you need developer-managed control beyond no-code automation.

What the CSOM pattern usually involves

If you decide to go down the CSOM route, then a typical implementation will look like this:

  1. Connect to the site and list.
  2. Retrieve a target item.
  3. Break role inheritance on that item.
  4. Remove or preserve existing assignments as needed.
  5. Add specific role assignments for users or groups.
  6. Execute and validate the change.

Why use CSOM instead of Power Automate

If you’re considering CSOM vs Power Automate, then CSOM makes more sense when the permissions process is part of a larger coded workflow or application lifecycle.

If the requirement is mostly administrative, Power Automate or PnP PowerShell is usually easier to maintain.

The tradeoff with CSOM is that while it gives you flexibility, it also moves the problem into code ownership. That means versioning, support, and developer dependency.

For many organizations, that’s justified only when the list is part of a business application, not just a collaboration process.

Best practices for managing SharePoint list item permissions safely

The biggest mistake I see in item-level permission projects is treating the permission change itself as the finish line. It isn’t. The real work is making sure the model still makes sense later, when the original admin is gone, the workflow has changed, and someone needs to answer a basic question like, “Why can this person see this item?”

Risk tends to persist because the environment allows it to persist. Item-level permissions are a very practical example of that. A list can start with one neat exception, then grow into dozens of one-off breaks in inheritance, direct grants, and business rules that only exist in a script comment or someone’s memory.

So the safest way to manage item-level permissions is not just to assign access carefully, but to design for review, cleanup, and explanation from the start.

Be careful using groups

Be careful about using groups as the default answer for item-level permissions. They can reduce direct permission sprawl, but they can also make effective access harder to untangle later.

Assigning access is easy. Working out who is actually in that group when you need to check access can quickly become the problem. If you have to click through multiple groups, pages, or portals to trace access, especially where nested groups are involved, the permission scope becomes harder to maintain.

So I’d say use groups where they make long-term review easier, and be cautious where they make access harder to verify.

Keep the permission logic narrow

If every item can have its own custom rules, admins lose the ability to reason about access quickly. Use item-level uniqueness only where it’s genuinely needed.

Document what triggers unique permissions

If permissions depend on a status, owner, department, or approval stage, write that down. Don’t leave the logic buried in someone’s memory or a flow branch.

Test with non-owner accounts

Owners and admins often see more than standard users. Always validate with the actual permission level you’re trying to control.

Revisit old unique permissions

Unique item permissions tend to accumulate. Over time, they create visibility gaps, review overhead, and awkward audit questions.

A practical lesson from the broader SharePoint governance material in your supporting docs is that exposure usually persists because the environment allows it to persist. Item-level permissions are a good example of that.

Native limitations of SharePoint item-level permissions at scale

Native SharePoint methods can absolutely handle item-level permissions. The problem is what happens when the requirement stops being isolated.

Based on your supporting materials, the recurring operational issues are:

  • visibility — admins struggle to see where unique access already exists,
  • manual review overhead — investigations take time,
  • repeatability — scripts, flows, and UI changes all live in different places,
  • evidence — proving who changed what and why gets harder over time.

The issue isn’t just whether SharePoint can do it. It’s whether teams can manage the result cleanly once item-level control starts to spread.

For one list, native methods may be enough. For many lists, many owners, or recurring audit pressure, the challenge shifts from “How do I set this permission?” to “How do I keep this governable?”

How CoreView Control for SharePoint helps reduce manual work around SharePoint permissions

If your immediate problem is a SharePoint list, the value of CoreView Control for SharePoint is that it addresses the operational side that native methods leave behind.

CoreView Control for SharePoint is designed to extend governance below the site level with:

  • visibility into items with unique permissions,
  • policy-based detection and remediation,
  • delegated workflows,
  • and evidence of review and action.

That matters when item-level permissions are no longer a one-off admin task, but part of a wider governance problem across SharePoint.

A sensible next step is to use native methods when the requirement is small and well bounded, then evaluate a governance layer when:

  • unique permissions are spreading,
  • reviews are manual,
  • or admins can no longer answer access questions quickly.
Need to move beyond one-off fixes? Start by documenting where your SharePoint lists already rely on unique item permissions. If your team can’t review or explain those changes quickly, book a closer look at how CoreView supports item-level SharePoint governance.
CoreView Control for SharePoint

FAQs

Can you set item-level permissions in a SharePoint list?

Yes. You can do it in several ways depending on the requirement. Advanced list settings work for simple built-in restrictions, Power Automate works for field- or status-driven logic, PnP PowerShell works for bulk changes, and SharePoint CSOM works for developer-managed implementations.

How do I give different users access to different items in a SharePoint list?

If the access rule is simple and list-wide, advanced list settings may be enough. If access depends on a column value, status, approver, owner, or workflow stage, Power Automate is usually the better fit. If you need to change many existing items at once, PnP PowerShell is usually the better native route.

Do I need to break permission inheritance for SharePoint list items?

Usually, yes, if you want one item to have different permissions from the rest of the list. List items inherit from the parent list by default, and unique item permissions generally require inheritance to be broken before direct permissions can be assigned.

Can SharePoint list item permissions be based on a column value?

Not cleanly through native list settings alone. Permissions based on a column usually belong in the Power Automate bucket, because advanced list settings do not provide true field-driven permission logic.

What are the limitations of SharePoint item-level permissions at scale?

The recurring issues are limited visibility into where unique access already exists, high manual review overhead, weak repeatability across flows, scripts, and UI changes, and weaker evidence when teams need to prove who changed what and why. That’s where the problem shifts from setting permissions to keeping them governable.

Get a personalized demo today

Created by M365 experts, for M365 experts.