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







2026年1月20日 星期二

WinScp 如何以 sudo 權限登入複製 root 權限的檔案

WinSCP 如何以 sudo 權限登入複製 root 權限的檔案

首先要先確保可以無密碼使用 sudo 由於無法保存密碼,這個沒有任何替代方案是最後的妥協了,然後再到 WinSCP 中設置 SFTP 伺服器用 sudo su -c 執行 sftp-server 即可。



Step1: 設置免密碼 sudo 指令

輸入以下命令打開編輯器

sudo visudo

在檔案最後加入一行

<你的使用者4名稱> ALL=(ALL) NOPASSWD: ALL

然後存檔即可。重新登入後 sudo 就不需要密碼了



Step2: 設置 WinSCP 用 sudo 登入

搜尋 sftp-server 位置

find /usr -name "sftp-server" -type f

在 wsl 中位置是 /usr/lib/openssh/sftp-server 。


在 WinSCP 站臺進階設定 > SFTP 的頁面中,找到 SFTP 伺服器這一欄



貼上以下命令 (後方路徑自行修改成剛剛查到的位置)

sudo su -c /usr/lib/openssh/sftp-server

然後確定後登入就是有 root 權限的 WinSCP 了



2025年12月15日 星期一

SSH 連線時自訂 PS1 提示符 (Ubuntu為例)

SSH 連線時自訂 PS1 提示符 (Ubuntu為例)

以 Ubuntu 預設彩色提示符為例



方式一:臨時一次性使用(連線後手動執行)

連線進去後,直接在終端機貼上執行:

export PS1='${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\u@\h\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\]\$ '

說明:

  • 只對當前 session 有效,登出後就消失
  • 不需要任何設定檔修改
  • 適合臨時想換個提示符樣式試試看



方式二:修改遠端伺服器設定

在遠端伺服器的 ~/.bashrc 加入:

PS1='${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\u@\h\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\]\$ '

優點:

  • 不影響 scp/rsync 等檔案傳輸功能
  • 所有連線方式都自動套用
  • 不用記複雜的命令
  • 最簡單、最推薦的做法



方式三:連線時指定命令(命令列參數)

每次連線時加上參數:


Window PowerShell

ssh myserver -t "export PS1='`${debian_chroot:+(`$debian_chroot)}\[\033[01;32m\]\u@\h\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\]\`$ '; exec bash"


Cmd / Window Terminal 設定檔命令

ssh myserver -t "bash --rcfile <(printf 'PS1=\"\\[\\e[32m\\]\\u@\\h\\[\\e[0m\\]:\\[\\e[34m\\]\\w\\[\\e[0m\\]\\$ \"')"



說明:

  • -t — 等同於 RequestTTY yes,強制分配 TTY
  • 單引號包住整個命令,避免本地 shell 先展開變數
  • 適合偶爾需要或寫成別名使用



方式四:寫在 SSH Config 中(本地端設定)

在本地的 ~/.ssh/config 中設定:

Host myserver
    HostName example.com
    User ubuntu
    RequestTTY yes
    RemoteCommand bash -c 'export PS1="${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\u@\h\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\]\$ "; exec bash'

說明:

  • RequestTTY yes — 強制分配終端,否則 RemoteCommand 無法正常互動
  • RemoteCommand — 連線後自動執行的命令,用 exec bash 確保留在互動式 shell
  • 連線方式:直接 ssh myserver

注意事項:

  • 使用 RemoteCommand 後,scprsync 等檔案傳輸會失效(因為它會執行指定命令而非預設 shell)
  • 如果需要傳檔案,要另外建一個不帶 RemoteCommand 的 Host 設定




補充:PS1 提示符格式說明

對照格式

\[\033[01;32m\]  → 亮綠色開始
\u              → 使用者名稱
@               → @ 符號
\h              → 主機名稱
\[\033[00m\]    → 重設顏色
:               → : 符號
\[\033[01;34m\] → 亮藍色開始
\w              → 當前完整路徑
\[\033[00m\]    → 重設顏色
\$              → 一般用戶顯示 $,root 顯示 #



2025年12月4日 星期四

自動初始化 Git 倉庫一個空 README.md 當作起點的腳本

自動初始化 Git 倉庫一個空 README.md 當作起點的腳本

這不是必要的,只是我通常習慣第一點用空 README.md 來當作起始,寫個腳本之後要複製比較容易

# 自動初始化Git倉庫腳本
function Initialize-GitRepository {
    [CmdletBinding()]
    [Alias("igr")]
    param(
        [Parameter(Position = 0)]
        [string]$Path = ".",

        [Parameter()]
        [string]$ReadmeFileName = "README.md",

        [Parameter()]
        [string]$CommitMessage = "Init"
    )

    # 啟用嚴格模式
    Set-StrictMode -Version Latest
    $ErrorActionPreference = 'Stop'

    # 切換到指定目錄
    $originalLocation = Get-Location
    Set-Location $Path

    # Git 包裝函式 - 自動檢查錯誤並拋出例外
    function git {
        & (Get-Command git.exe -CommandType Application) @args
        if ($LASTEXITCODE -ne 0) {
            Write-Error "Git command failed: git $($args -join ' ') (exit code: $LASTEXITCODE)"
        }
    }

    try {
        # ==================== 預檢查階段 ====================
        # 檢查 README 檔案是否已存在
        if (Test-Path $ReadmeFileName) {
            Write-Error "Error: $ReadmeFileName file already exists!"
        }
        # 檢查 Git 倉庫是否已存在
        if (Test-Path ".git") {
            Write-Error "Error: Git repository already exists!"
        }
        # 檢查 Git 命令是否可用
        try {
            git --version | Out-Null
        } catch {
            Write-Error "Error: Git is not installed or not in PATH!"
        }

        # ==================== 執行階段 ====================
        # 創建 README 檔案
        New-Item -Name $ReadmeFileName -ItemType File | Out-Null
        # 初始化Git倉庫
        git init
        # 添加檔案並提交
        git add $ReadmeFileName
        # 提交
        git commit -m $CommitMessage

    } catch {
        throw
    } finally {
        Set-Location $originalLocation
    }
}





PowerShell 產生隨機密碼

經常用到每次都要查有點煩了,乾脆弄個函式寫到系統中,呼叫的時候比較方便

在 PowerShell 中輸入 $PROFILE 會顯示出每次 PowerShell 載入時讀取的腳本,可以把以下函式寫到裡面去,這樣打開 PowerShell 只要輸入 nrp 就可以產出密碼了

(第一次創建的時候需要設定權限不然會錯,那個複製錯誤信息Google或問AI就可以解了)

以下是產密碼的函式

# Generate a random password
function New-RandomPassword {
    [Alias('nrp')]
    param (
        [Parameter(Position = 0)]
        [ValidateRange(1, 512)]
        [int]$Length = 15,
        [switch]$Symbols,
        [switch]$Ambiguous,
        [string]$IncludeCharacters,
        [string]$ExcludeCharacters
    ) $chars = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789'
    if (-not $Ambiguous) { $chars = $chars -replace '[lIO01]', '' }
    if ($Symbols) { $chars += '!@#$%^&*()-_=+' }
    if ($IncludeCharacters) { $chars += $IncludeCharacters }
    if ($ExcludeCharacters) { $chars = -join $chars.ToCharArray().Where{ $ExcludeCharacters.IndexOf($_) -lt 0 } }
    if ($chars.Length -eq 0) { Write-Error "Character set is empty after exclusions"; return }
    $rng = [Security.Cryptography.RandomNumberGenerator]::Create()
    try {
        $rng.GetBytes(($bytes = [byte[]]::new($Length * 8)))
        -join (0..($Length - 1)).ForEach({ $chars[[BitConverter]::ToUInt64($bytes, $_ * 8) % $chars.Length] })
    } finally { $rng.Dispose() }
} # New-RandomPassword

預設使用 New-RandomPassword 或是 ‘nrp’ 會產出 15 碼的隨機密碼 (預設不包含易造成混亂的 lIO01 字元)

如果需要複雜包含符號,可以使用 -Symbols 與 -Ambiguous 參數
要定義字元可以使用 -IncludeCharacters -ExcludeCharacters 參數
顯式指定與 Symbols / Ambiguous 有衝突時顯式優先級更高




2025年11月18日 星期二

git 允許當前檢出中的分支可以被推送

git 允許當前檢出中的分支可以被推送

git如果不是作為裸庫一般會把檔案檢出,可以看到並加入追蹤。在這種狀態下預設為了被免其他誤推送導致未儲存的檔案移除或是相衝是禁止的。

某些情況下臨時要測試,而且很清楚git原理與知道自己在幹麻這東西是有一定方便性的,以下是打開的指令

git config receive.denyCurrentBranch ignore 

在檢出目錄是乾淨的狀態下,就可以被推送了


具體的行為是檢出中的分支會隨著被推送到最新版本,當前檔案狀態會 stage 的形式保護住不會被更動,僅分支被更新。


2025年10月28日 星期二

Windows Server RDP 解除單一連接線制 (同時間可多人用同一個帳號)

Windows Server RDP 解除單一連接線制 (同時間可多人用同一個帳號)

這功能免費額度最大上限是同時2個連入,但大多數場合2個也很足夠用了


懶人包登錄檔設置指令是

REG ADD "HKLM\SYSTEM\CurrentControlSet\Control\Terminal Server" /v fSingleSessionPerUser /t REG_DWORD /d 0 /f


從群組原則的話設定在這個路徑:
電腦設定 → 系統管理範本 → Windows 元件 → 遠端桌面服務 → 遠端桌面工作階段主機 → 連線