2026年3月17日 星期二

Pnp.PowerShell 如何從IDCRL改用OAuth 2.0憑證登入

Pnp.PowerShell 如何從IDCRL改用OAuth 2.0憑證登入

記得先更新pnp到最新版本: CHG: Pnp.PowerShell 如何安裝 與 基本用法
以及參考上一篇文章創建應用程式: CHG: 2024-09-09 SharePoint 禁用帳密登入改動 如何使用Application應用程式登入

2026-05-01 即將停用委託登入了,再來強迫必須用證書登入了,在舊文章裡有說如何直接註冊應用程式+創建證書,這邊單獨講在現有的應用程式裡添加證書


這是生成證書的指令 (再次提醒 pnp 要更新到最新版本)

$params = @{
    CommonName          = "PnP_Rocks"
    ValidYears          = 10
    OutPfx              = "./secrets/PnP_Rocks.pfx"
    OutCert             = "./secrets/PnP_Rocks.cer"
    CertificatePassword = ConvertTo-SecureString -String "<YourPassword>" -AsPlainText -Force
}; New-PnPAzureCertificate @params

CertificatePassword 是可選項可以不設就空白密碼,要設記得改成自己的密碼

生成之後把 PnP_Rocks.cer 上傳到應用程式上就可以用了



連接方式有幾種這個是從檔案直接連(以檔案方式儲存比較不安全)

Connect-PnPOnline -Url "https://<tenant>.sharepoint.com/sites/<SiteName>" `
  -ClientId "<YourClientId>" `
  -Tenant "<tenant>.onmicrosoft.com" `
  -CertificatePath "./secrets/PnP_Rocks.pfx" `
  -CertificatePassword (ConvertTo-SecureString "<YourCertPassword>" -AsPlainText -Force)

這個是加到信任區之後用指紋連接 (這才是真正安全的方式)

Connect-PnPOnline -Url "https://<tenant>.sharepoint.com/sites/<SiteName>" `
  -ClientId "<YourClientId>" `
  -Tenant "<tenant>.onmicrosoft.com" `
  -Thumbprint "<YourCertThumbprint>"

這樣就可以應付 5/1 的改版了




關於權限限縮的問題用 Sites.Selected 可以限制僅能單一網站,下面是範例。

先到應用程式中新增該權限


然後再用超級管理員設置App允許哪些網站 (目前只能用 pnp.powershell 設置的樣子)

# 用管理員帳號 DeviceLogin 登入
Connect-PnPOnline -Url "https://<tenant>.sharepoint.com/sites/<SiteName>" -Interactive -ClientId "<YourClientId>"

# 授權 App 只能存取指定網站
Grant-PnPAzureADAppSitePermission -AppId "<YourClientId>" -DisplayName "<AppName>" -Site "https://<tenant>.sharepoint.com/sites/<SiteName>" -Permissions Write

這樣就可以指定該APP僅允許操作哪些網站


然後如果要把憑證加入憑證商店用下面的指令

$params = @{
    FilePath          = "./secrets/PnP_Rocks.pfx"
    CertStoreLocation = "Cert:\CurrentUser\My"
    Password          = ConvertTo-SecureString "<YourCertPassword>" -AsPlainText -Force
}; Import-PfxCertificate @params

匯入後會自動顯示指紋,用那個指紋就能登入了

要直接看指紋的話是這個指令

(New-Object System.Security.Cryptography.X509Certificates.X509Certificate2("./secrets/PnP_Rocks.pfx", (ConvertTo-SecureString "<YourCertPassword>" -AsPlainText -Force))).Thumbprint