2024年9月18日 星期三

Pnp.PowerShell 新式登入方法 如何使用委任權限登入

Pnp.PowerShell 新式登入方法 如何使用委任權限登入

乾解開了,參考這兩篇文章的提示想通了

  1. PnP PowerShell を利用するための Microsoft Entra ID アプリケーションを登録する方法 (zenn.dev)
  2. 使用 PnP PowerShell 連接到 SharePoint Online - SharePoint 日記 (sharepointdiary.com)

簡單來說 2024-09-09 當天的改動是移除掉一個預設應用程式,該應用程式的ID是 31359c7f-bd7e-475c-86db-fdb8c937548e

報錯的信息是

AADSTS700016: Application with identifier ‘31359c7f-bd7e-475c-86db-fdb8c937548e’ was not found in the directory ‘<テナント名>’.
(‘31359c7f-bd7e-475c-86db-fdb8c937548e’は、PnP Managment Shell アプリケーションの共通の ID)

這應用程式是你不用自己新增也會自己有的,並且 PnP.PowerShell 預設會去叫這組應用程式來執行委任權限


委任權限的執行方法是需要過一組使用者帳號的

Connect-PnPOnline -Url $siteUrl -Credentials (Get-Credential)


如何呼叫別組應用程式,可以從環境變數中設定

$env:ENTRAID_APP_ID = $cliendId


也就是真正需要的只有

  1. 重建自己的應用程式
  2. 設置適當的委任權限
  3. 增加環境變數 ENTRAID_APP_ID = ClientID

如此一來對於沒有MFA認證的帳號,就一樣可以回復到原本的純帳密登入了。


開始之前記得先更新一下 PnP.PowerShell 夜間最新版,最近頻率很常估計bug很多。

# 移除所有版本
Uninstall-Module PnP.PowerShell -AllVersions -Force

# 安裝最新夜間版本
Install-Module -Name PnP.PowerShell -AllowPrerelease -Force

# 版本確認
Get-Module -ListAvailable PnP.PowerShell




應用程式權限

對於權限先給一個通用權限,這個權限就足夠上傳檔案了。



測試委任權限先設置 AllSites.Manage 就足夠了,記得右邊要綠色打勾才會起作用。

即使上面寫不用管理權限也必須用管理員承認一次才能起作用,詳細原因我也不清楚。


你可以隨意丟一個文件上去試試看,能過就行了其他再自己摸索需要哪些權限

Add-PnPFile -Path "README.md" -Folder "Shared Documents"




完整的無應答登入代碼

注意使用純帳密登入必須移除MFA多重驗證 (或是有調過Policy安全政策)

# 設置暫時環境變數
$env:ENTRAID_APP_ID = 'd4dea926-48d4-48b4-ae80-d56747f54cf4'

# 設置登入信息
$siteUrl  = "https://[TelentName].sharepoint.com/sites/[SiteName]"
$username = "[UserName]@[TelentName].onmicrosoft.com"
$password = "YourPassWord"

# 登入 SharePoint
Connect-PnPOnline -Url $siteUrl -Credentials (New-Object System.Management.Automation.PSCredential($username, (ConvertTo-SecureString $password -AsPlainText -Force)))

這樣就能進去了




2024年9月17日 星期二

使用 PowerShell 生成自簽署證書

使用 PowerShell 生成自簽署證書

基於 SharePoint 的無應答登入模式改版後必須使用證書,這邊提供一個最簡證書生成方法,直接使用 PowerShell 5.1 內建的函式即可。

不過有以下兩個小缺點

  1. 無法匯出空白密碼的證書 pfx 檔案。(有這個需求用 OpenSSL 生成吧)
  2. 無法直接生成檔案,必須先存入 Windwos Certificate Store 匯出後再刪除


# 1. 定義変数
$CNName = "PnP_Roks"
$OutPath = "D:\mycertificates"
$Pword = "YourPasswordHere"
$ExpiryYears = 10

# 2. 生成自簽署證書,暫時存儲在當前用戶證書存儲區
if(-not (Test-Path $OutPath)) { mkdir $OutPath }
$cert = New-SelfSignedCertificate -Subject "CN=$CNName" -DnsName $CNName `
  -CertStoreLocation Cert:\CurrentUser\My `
  -NotAfter (Get-Date).AddYears($ExpiryYears).date
$cert

# 3. 將證書導出為 PFX 檔案
$cert |Export-PfxCertificate -FilePath "$OutPath\$CNName.pfx" `
  -Password (ConvertTo-SecureString -String $Pword -Force -AsPlainText)

# 4. 將證書導出為 CER 檔案
$cert |Export-Certificate -FilePath "$OutPath\$CNName.cer"

# 5. 從證書存儲區移除剛生成的證書
$cert | Remove-Item

這樣就生成完畢了。


需要上傳到 "應用程式" 中的只有 cer 證書而已,包含私鑰的 pfx 檔案不可以外洩。

比較理想的辦法是直接在目標伺服器生成證書,然後只匯出 cer 公鑰上傳到伺服器,一定程度避免私鑰產生副本。

環境允許的話甚至可以設置成不可匯出徹底銷毀,沒了再造一個就行。


上傳完畢接下來登入可以參考這篇 身份驗證 |PnP PowerShell





讀取證書檔案

其中如果要讀取 Store 中的 pfx 檔案可以這樣用

# 當前使用者
Get-Item -Path "Cert:\CurrentUser\My\$($cert.Thumbprint)"

# 本機
Get-Item -Path "Cert:\LocalMachine\My\$($cert.Thumbprint)"

對應的管理介面是

  • 當前使用者: certmgr.msc
  • 本機: certlm.msc





2024年9月13日 星期五

2024-09-09 SharePoint 禁用帳密登入改動 如何使用Application應用程式登入

2024-09-09 SharePoint 禁用帳密登入改動 如何使用Application應用程式登入

突然的改動導致原本使用帳密登入 SharePoint 的腳本變得無法執行了。

具體的錯誤信息是以下報錯 AADSTS50076 的信息

Connect-PnPOnline : AADSTS50076: Due to a configuration change made by your administrator, or because you moved to a ne

w location, you must use multi-factor authentication to access '00000003-0000-0ff1-ce00-000000000000'. Trace ID: a28ff3

72-9f22-4018-9c6a-1341a7b16900 Correlation ID: 85a19fdf-03b2-4804-8987-49055663a3e5 Timestamp: 2024-09-13 03:44:03Z



官方的說明參考這篇
PnP Management Shell EntraID app is deleted : what should I do ? · Issue #4250

這邊有提到得的解是這篇
Register an Entra ID Application to use with PnP PowerShell | PnP PowerShell

不過這篇有幾個小插曲,那個英文分段分的不是很明確很容易誤以為整篇都在講同一個方法,其實總共有三個方法。

第二個坑是 $result = Register-PnPEntraIDApp -ApplicationName “PnP Rocks” -Tenant [yourtenant].onmicrosoft.com -OutPath c:\mycrtificates -DeviceLogin

這行代碼在 2.12 版本有 bug 是不能跑得,詳見這篇解法就是單純升級版本就修好了。


下面讓我們開始吧。




環境準備

要滿足兩個條件

  • PowerShell 7
  • Pnp.PowerShell 2.12.3

這是因為 Pnp.PowerShell 2 是面向PowerShell

下面請用管理員權限打開 PowerShell 5.1 執行

PowerShell 7 安裝指令
在 Windows 上安裝 PowerShell - PowerShell | Microsoft Learn

winget install --id Microsoft.Powershell --source winget

然後輸入 Pwsh 切換到 PowerShell 7 版本

pwsh

啟動之後檢查一下版本

$PSVersionTable

然後安裝 Pnp.PowerShell

Install-Module PnP.PowerShell -AllowPrerelease -Force -SkipPublisherCheck
Get-Module -Name PnP.PowerShell -ListAvailable

到這邊必要的環境就都安裝完成了




註冊應用程式

在開始前記得確保你打開的終端機是 PowerShell 7


最省力的辦法是用 PnP.PowerShell 社群幫你做的懶人包。
Register an Entra ID Application to use with PnP PowerShell | PnP PowerShell

這邊示範登入使用 CertificateBase64Encoded 所以沒有把證書存下來。
(事實上 CertificateBase64Encoded 就是證書檔案二進制,能還原的)

$result = Register-PnPEntraIDApp -ApplicationName PnP_Rocks -Tenant [你的租戶名].onmicrosoft.com -Interactive

預設的租戶名 xxx.onmicrosoft.com
方法1:從你的網站 https://[你的租戶名].sharepoint.com 網址上找到。
方法2:組織通常會新增自己的域名比如說 xxx@gmail.com 中的 gmail.com 也可以用。沒新增的話預設是 xxx@xxx.onmicrosoft.com 兩個長一個樣。

 

執行之後會出現內部的.NET的UI登入介面,請注意必須使用具網域管理員權限的帳號登入,總共會要求登入兩次

  • 第一次是創建應用程式。(這次其實不用權限)
  • 第二次是讓網域管理員承認應用程式權限

完成之後可以通過查看 $result 獲取證書的 Base64Encoded

$result

記得將他保存下來

$result > C:\PnP_Rocks_Certificate.txt

然後我們利用這個資訊登入

Connect-PnPOnline 'https://[你的租戶名].sharepoint.com/sites/[你的網站名]' -ClientId $result."AzureAppId/ClientId" -Tenant [你的租戶名].onmicrosoft.com -CertificateBase64Encoded $result.Base64Encoded

到這邊就登入成功了

切記這個權限超級超級大,Base64Encoded內容一定要保護好。


創建完成之後可以在這個網址找到自動建立的應用程式


在這裡可以編輯權限


 (這邊截圖不是照上面來的參考用而已,上面設定完權限不應是委託而是應用程式)




註冊應用程式2 (儲存證書)

重複的就不講了留最重要的代碼就好,這是會把證書儲存下來的方法。

mkdir d:\mycertificates
$result = Register-PnPEntraIDApp -ApplicationName PnP_Rocks -Tenant [你的租戶名].onmicrosoft.com -OutPath d:\mycertificates -Interactive

證書輸出之後把 pfx 安裝到”個人”,然後用下面的方式登入



Connect-PnPOnline 'https://[你的網站].sharepoint.com/sites/Maple' -ClientId $result."AzureAppId/ClientId" -Tenant [你的租戶名].onmicrosoft.com -Thumbprint $result."Certificate Thumbprint"

總之把他設定成不可匯出就不用被幹走了,剩下的證書封存的方式在自己琢磨一下。





參考網站

  1. 身份驗證 |PnP PowerShell
  2. [BUG] Register-PnPEntraIDApp Hanging · Issue #4260 · pnp/powershell (github.com)
  3. PnP Management Shell EntraID app is deleted : what should I do ? · Issue #4250 · pnp/powershell (github.com)