SPClean
1.5.1
Minimum PowerShell version
7.0
Installation Options
Owners
Copyright
(c) 2026 David Pham. Licensed under the MIT License.
Package Details
Author(s)
- David Pham
Tags
SharePoint SPO SharePointOnline Orphaned Cleanup M365 MicrosoftGraph PnP Governance Remediation EntraID
Functions
Connect-SPCTenant Disconnect-SPCTenant Get-SPCOrphanedUser Get-SPCMismatchUser Export-SPCReport Remove-SPCOrphanedUser Restore-SPCOrphanedUser Repair-SPCMismatchUser New-SPCScanSchedule Register-SPCLicense Get-SPCLicenseInfo Get-SPCGuestAccess Get-SPCPrivilegedUser Get-SPCOverPermissionedUser
Dependencies
-
- Microsoft.Graph.Authentication (>= 2.0.0)
- PnP.PowerShell (>= 2.0.0)
Release Notes
## 1.3.0 - 2026-07-17
- Feature (Module 2): Added `Get-SPCMismatchUser` to detect User ID Mismatches between SharePoint UIL and Entra ID.
- Feature (Module 2): Added `Repair-SPCMismatchUser` to automatically backup, clean, and restore Web and List level permissions for mismatched users.
## 1.2.3 - 2026-07-15
- Fix: Guest users are now correctly skipped during Mismatch Repair.
## 1.1.6 - 2026-06-27
- Fix: New-SPCScanSchedule scheduled task no longer opens a visible PowerShell window (-WindowStyle Hidden added)
## 1.1.5 — 2026-06-27
- Fix: New-SPCScanSchedule incorrectly detected Windows as non-Windows (Get-Variable $IsWindows unreliable inside module scope); replaced with [System.Environment]::OSVersion.Platform check
## 1.1.4 — 2026-06-27
- Fix: New-SPCScanSchedule -OutputPath alias added (parameter was named -ReportOutputPath, causing ParameterNotFound error)
- Docs: Restore-SPCOrphanedUser limitations — clarify soft-deleted accounts must be restored in Entra first
## 1.1.3 — 2026-06-27
- Fix: Export-SPCReport HTML footer shows correct version instead of System.Object[]
## 1.1.2 — 2026-06-27
- Fix: CI publish workflow now injects HMAC secret before packaging (license key validation works in published module)
- Fix: Interactive auth docs — add http://localhost redirect URI requirement (AADSTS50011)
## 1.1.1 — 2026-06-27
- Fix: exclude .git folder from PSGallery package
## 1.1.0 — 2026-06-26
- Register-SPCLicense: offline HMAC-SHA256 license key activation
- Get-SPCLicenseInfo: query current tier (FREE / PRO / CONSULTANT)
- Feature gates: HTML report, CreateSnapshot, Restore, Schedule require Pro/Consultant
- MkDocs Material documentation site (https://hungpham2802.github.io/SPClean)
## 1.0.0 — 2026-06-22
- Connect-SPCTenant: Interactive and AppOnly (certificate/secret) auth
- Get-SPCOrphanedUser: detects Deleted, SoftDeleted, Disabled, GuestOrphaned accounts
- Export-SPCReport: CSV, HTML (colour-coded risk badges), JSON output
- Remove-SPCOrphanedUser: removes users with WhatIf/Confirm/CreateSnapshot support
- Restore-SPCOrphanedUser: re-applies permissions from JSON snapshot
- New-SPCScanSchedule: Windows Scheduled Task automation
FileList
- SPClean.nuspec
- .gitignore
- docs\cmdlets\get-spcguestaccess.md
- Tests\Unit\Connect-SPCTenant.Tests.ps1
- site\assets\javascripts\workers\search.2c215733.min.js
- CHANGELOG.md
- docs\cmdlets\get-spclicenseinfo.md
- Tests\Unit\Export-SPCReport.Tests.ps1
- site\assets\javascripts\workers\search.2c215733.min.js.map
- LICENSE
- docs\cmdlets\get-spcmismatchuser.md
- Tests\Unit\Get-SPCGuestAccess.Tests.ps1
- site\assets\javascripts\lunr\min\lunr.ar.min.js
- mkdocs.yml
- docs\cmdlets\get-spcorphaneduser.md
- Tests\Unit\Get-SPCMismatchUser.Tests.ps1
- site\assets\javascripts\lunr\min\lunr.da.min.js
- README.md
- docs\cmdlets\get-spcoverpermissioneduser.md
- Tests\Unit\Get-SPCOrphanedUser.Tests.ps1
- site\assets\javascripts\lunr\min\lunr.de.min.js
- docs\cmdlets\get-spcprivilegeduser.md
- Tests\Unit\Get-SPCOverPermissionedUser.Tests.ps1
- site\assets\javascripts\lunr\min\lunr.du.min.js
- SPClean.psd1
- docs\cmdlets\index.md
- Tests\Unit\Get-SPCPrivilegedUser.Tests.ps1
- site\assets\javascripts\lunr\min\lunr.el.min.js
- SPClean.psm1
- docs\cmdlets\new-spcscanschedule.md
- Tests\Unit\Get-SPCRiskLevel.Tests.ps1
- site\assets\javascripts\lunr\min\lunr.es.min.js
- docs\comparison.md
- docs\cmdlets\register-spclicense.md
- Tests\Unit\Invoke-SPCGraphBatch.Tests.ps1
- site\assets\javascripts\lunr\min\lunr.fi.min.js
- docs\index.md
- docs\cmdlets\remove-spcorphaneduser.md
- Tests\Unit\LicenseManager.Tests.ps1
- site\assets\javascripts\lunr\min\lunr.fr.min.js
- docs\licensing.md
- docs\cmdlets\repair-spcmismatchuser.md
- Tests\Unit\New-SPCDashboardHtmlInternal.Tests.ps1
- site\assets\javascripts\lunr\min\lunr.he.min.js
- docs\Reseed-TestSite.ps1
- docs\cmdlets\restore-spcorphaneduser.md
- Tests\Unit\Remove-SPCOrphanedUser.Tests.ps1
- site\assets\javascripts\lunr\min\lunr.hi.min.js
- docs\Sign-Module.ps1
- docs\getting-started\authentication.md
- Tests\Unit\Repair-SPCMismatchUser.Tests.ps1
- site\assets\javascripts\lunr\min\lunr.hu.min.js
- Private\Get-SPCRiskLevel.ps1
- docs\getting-started\installation.md
- site\assets\images\favicon.png
- site\assets\javascripts\lunr\min\lunr.hy.min.js
- Private\Invoke-SPCGraphBatch.ps1
- docs\getting-started\quickstart.md
- site\assets\javascripts\bundle.79ae519e.min.js
- site\assets\javascripts\lunr\min\lunr.it.min.js
- Private\LicenseManager.ps1
- Public\Auth\Connect-SPCTenant.ps1
- site\assets\javascripts\bundle.79ae519e.min.js.map
- site\assets\javascripts\lunr\min\lunr.ja.min.js
- Private\New-SPCDashboardHtmlInternal.ps1
- Public\Auth\Disconnect-SPCTenant.ps1
- site\assets\stylesheets\main.484c7ddc.min.css
- site\assets\javascripts\lunr\min\lunr.jp.min.js
- Private\Save-SPCPermissionSnapshot.ps1
- Public\License\Get-SPCLicenseInfo.ps1
- site\assets\stylesheets\main.484c7ddc.min.css.map
- site\assets\javascripts\lunr\min\lunr.kn.min.js
- Private\Test-SPCConnection.ps1
- Public\License\Register-SPCLicense.ps1
- site\assets\stylesheets\palette.ab4e12ef.min.css
- site\assets\javascripts\lunr\min\lunr.ko.min.js
- site\404.html
- Public\Remediate\Remove-SPCOrphanedUser.ps1
- site\assets\stylesheets\palette.ab4e12ef.min.css.map
- site\assets\javascripts\lunr\min\lunr.multi.min.js
- site\index.html
- Public\Remediate\Repair-SPCMismatchUser.ps1
- site\cmdlets\connect-spctenant\index.html
- site\assets\javascripts\lunr\min\lunr.nl.min.js
- site\sitemap.xml
- Public\Remediate\Restore-SPCOrphanedUser.ps1
- site\cmdlets\disconnect-spctenant\index.html
- site\assets\javascripts\lunr\min\lunr.no.min.js
- site\sitemap.xml.gz
- Public\Report\Export-SPCReport.ps1
- site\cmdlets\export-spcreport\index.html
- site\assets\javascripts\lunr\min\lunr.pt.min.js
- tools\Setup-SPCleanApp.ps1
- Public\Scan\Get-SPCGuestAccess.ps1
- site\cmdlets\get-spclicenseinfo\index.html
- site\assets\javascripts\lunr\min\lunr.ro.min.js
- .github\ISSUE_TEMPLATE\beta_feedback.md
- Public\Scan\Get-SPCMismatchUser.ps1
- site\cmdlets\get-spcorphaneduser\index.html
- site\assets\javascripts\lunr\min\lunr.ru.min.js
- .github\ISSUE_TEMPLATE\bug_report.md
- Public\Scan\Get-SPCOrphanedUser.ps1
- site\cmdlets\new-spcscanschedule\index.html
- site\assets\javascripts\lunr\min\lunr.sa.min.js
- .github\ISSUE_TEMPLATE\feature_request.md
- Public\Scan\Get-SPCOverPermissionedUser.ps1
- site\cmdlets\register-spclicense\index.html
- site\assets\javascripts\lunr\min\lunr.stemmer.support.min.js
- .github\workflows\ci.yml
- Public\Scan\Get-SPCPrivilegedUser.ps1
- site\cmdlets\remove-spcorphaneduser\index.html
- site\assets\javascripts\lunr\min\lunr.sv.min.js
- .github\workflows\mkdocs.yml
- Public\Schedule\New-SPCScanSchedule.ps1
- site\cmdlets\restore-spcorphaneduser\index.html
- site\assets\javascripts\lunr\min\lunr.ta.min.js
- .github\workflows\publish.yml
- site\cmdlets\index.html
- site\getting-started\authentication\index.html
- site\assets\javascripts\lunr\min\lunr.te.min.js
- docs\assets\demo.gif
- site\licensing\index.html
- site\getting-started\installation\index.html
- site\assets\javascripts\lunr\min\lunr.th.min.js
- docs\cmdlets\connect-spctenant.md
- site\search\search_index.json
- site\getting-started\quickstart\index.html
- site\assets\javascripts\lunr\min\lunr.tr.min.js
- docs\cmdlets\disconnect-spctenant.md
- Tests\Integration\SPClean.Integration.Tests.ps1
- site\assets\javascripts\lunr\tinyseg.js
- site\assets\javascripts\lunr\min\lunr.vi.min.js
- docs\cmdlets\export-spcreport.md
- Tests\Integration\SPClean.Phase1.Integration.Tests.ps1
- site\assets\javascripts\lunr\wordcut.js
- site\assets\javascripts\lunr\min\lunr.zh.min.js