2024年12月16日 星期一

SQLServer 搬移資料庫到D曹

SQLServer 搬移資料庫到D曹

要搬移的資料庫檔案在C裡面,比較快的方法是打下面的指令可以查出所有表儲存位置

USE master;
GO

SELECT 
    db_name(database_id) AS DatabaseName, 
    type_desc AS FileType, 
    physical_name AS FilePath
FROM sys.master_files
ORDER BY db_name(database_id), type_desc;

查出來之後先儲存下來等一下要一個一個手動掛回來會比較方便

再來需要停止 SQLSERVER 服務,停掉之後就可以直接開始搬檔案了

搬完之後由於服務啟動至少需要下面這三個東西,這個手動改一下
(或是不想改下圖這三個就不要搬,讓它保持在C曹搬你自己創建的就好)



這三個關鍵檔案改好就可以啟動了

啟動後會是一個全空的DB,用下面指令一個一個掛回來

下面的範例是把資料庫名稱 CHG 掛回來的指令
(把所有CHG改成你的資料庫名稱即可)

USE master;
GO
ALTER DATABASE CHG 
MODIFY FILE (NAME = 'CHG', FILENAME = 'D:\MSSQL\DATA\CHG.mdf');
GO
ALTER DATABASE CHG 
MODIFY FILE (NAME = 'CHG_log', FILENAME = 'D:\MSSQL\DATA\CHG_log.ldf');
GO
ALTER DATABASE CHG SET ONLINE;
GO


數量很多的話自己寫個腳本執行吧

下面是寫成動態 TSQL 的範例


-- 設置基礎路徑
DECLARE @BasePath NVARCHAR(255) = 'D:\MSSQL\DATA\';

-- 資料庫清單
DECLARE @DatabaseList TABLE (DatabaseName NVARCHAR(128));
INSERT INTO @DatabaseList VALUES 
('CHG1'),
('CHG2'),
('CHG3');

-- 定義變數
DECLARE @DatabaseName NVARCHAR(128);
DECLARE @MdfPath NVARCHAR(255);
DECLARE @LdfPath NVARCHAR(255);
DECLARE @Sql NVARCHAR(MAX);

-- 確保基礎路徑結尾無斜線
IF RIGHT(@BasePath, 1) = '\'
    SET @BasePath = LEFT(@BasePath, LEN(@BasePath) - 1);

-- 開始遍歷資料庫清單
DECLARE db_cursor CURSOR FOR
SELECT DatabaseName FROM @DatabaseList;

OPEN db_cursor;

FETCH NEXT FROM db_cursor INTO @DatabaseName;

WHILE @@FETCH_STATUS = 0
BEGIN
    -- 生成 MDF 和 LDF 的路徑
    SET @MdfPath = @BasePath + '\' + @DatabaseName + '.mdf';
    SET @LdfPath = @BasePath + '\' + @DatabaseName + '_log.ldf';

    -- 修改 MDF 檔案位置
    SET @Sql = 
        'ALTER DATABASE ' + QUOTENAME(@DatabaseName) + 
        ' MODIFY FILE (NAME = ''' + @DatabaseName + ''', FILENAME = ''' + @MdfPath + ''')';
    EXEC sp_executesql @Sql;

    -- 修改 LDF 檔案位置
    SET @Sql = 
        'ALTER DATABASE ' + QUOTENAME(@DatabaseName) + 
        ' MODIFY FILE (NAME = ''' + @DatabaseName + '_log'', FILENAME = ''' + @LdfPath + ''')';
    EXEC sp_executesql @Sql;

    -- 將資料庫設為 ONLINE
    SET @Sql = 
        'ALTER DATABASE ' + QUOTENAME(@DatabaseName) + ' SET ONLINE';
    EXEC sp_executesql @Sql;

    -- 繼續處理下一個資料庫
    FETCH NEXT FROM db_cursor INTO @DatabaseName;
END;

-- 關閉並釋放資源
CLOSE db_cursor;
DEALLOCATE db_cursor;



2024年12月10日 星期二

gitk 圖形介面中的代碼比較亂碼

gitk 圖形介面中的代碼比較亂碼

裡面亂碼最後查到可以從 gitconfig 中設置,可以直接設置在全域也可以直接設置在專案資料夾,這邊如果你不確定怎麼做的話跟著底下教學儲存在專案設置就行。

為什麼會造成這個原因是,git 雖然是用 utf8 儲存,但是讀取的時候是根據電腦語言編碼解析的,也就是在中文 Windows 上預設會被使用 big-5 解碼。


解決方案

關鍵的設置指令是

[gui]
    encoding = utf-8

直接貼到專案資料夾中 .git\config 就可以起作用了


或是執行下面的指令 (消除 —local 會儲存到使用者全域設定)

git config --local gui.encoding utf-8


然後透過下面的指令查看

# Linux
git conig --local --list | grep gui.encoding

# pwsh
git config --local --list | Select-String "gui.encoding"

再重新打開 gitk 就可以正確的識別了



2024年12月3日 星期二

git 如何通過 ssh 將倉庫 push pull 到 Windwos 系統上

git 如何通過 ssh 將倉庫 push pull 到 Windwos 系統上

首先 ssh 先自行打通無密碼連接或是有密碼也無所謂每次都要打而已

然後對於設置remote的路徑是這樣的

# 相對路徑
git@192.168.1.1:myproject.git

# 絕對路徑
git@192.168.1.1:/C:/myproject.git

這是一個裸庫,雖然沒限定只是遠端的庫建議別用非裸庫,不然有時候工作目錄的檔案動到就無法操作了。

使用者我是創了一個 git 的使用者,所以才是git開頭。

最後面的路徑是相路徑,相對於該使用者的使用者文件底下。

然後就是問題所在了,git長年來並沒有處理在windwos下無法使用的問題,解法我是查到這篇

https://superuser.com/questions/1841373/how-do-i-clone-from-local-git-repositories-with-ssh

簡單說你就在使用者文件底下建立兩個文件

git-upload-pack.cmd

@"C:\Program Files\Git\bin\sh" -c "'/c/Program Files/Git/bin/git' upload-pack %*"

git-receive-pack.cmd

@"C:\Program Files\Git\bin\sh" -c "'/c/Program Files/Git/bin/git' receive-pack %*"

這樣就能修好了,如果你的git不是標準安裝,路徑在自己改一下
如果不想放在使用者文件底下,記得自己設置一下環境變數

2024年11月29日 星期五

Vscode 手動指定 PowerShell 位置

Vscode 手動指定 PowerShell 位置

適用場景是如果要完全使用可攜板的 VsCode ,需要手動從設定中指定。大概就是企業環境中禁止管理權限無法安裝的一個折衷做法。

下面的範例是下載 Protable 的 VsCode 然後直接把 pwsh 放置在同資料夾的 data 中

    "powershell.powerShellAdditionalExePaths": {
        "PowerShell (x64)": "VSCodeProtable\\data\\PowerShell\\7\\pwsh.exe"
    },
    "[powershell]": {
        "editor.defaultFormatter": "ms-vscode.powershell"
    },
    "powershell.powerShellDefaultVersion": "PowerShell (x64)",
    "powershell.promptToUpdatePowerShell": false,

這樣就可以從內部讀取到並使用 pwsh 了

2024年11月15日 星期五

linux 編譯 OpenSSL 安裝到 opt 文件中

linux 編譯 OpenSSL 安裝到 opt 文件中

安裝到 opt 中是為了避免對系統造成影響

# 下載並編譯 OpenSSL 庫
cd /tmp
wget https://www.openssl.org/source/openssl-1.1.1w.tar.gz
tar xzf openssl-1.1.1w.tar.gz
cd openssl-1.1.1w
./config --prefix=/opt/openssl-1.1.1 shared
make -j$(nproc)
sudo make install

# 臨時載入必要的環境變數
export LD_LIBRARY_PATH="/opt/openssl-1.1.1/lib"
export CPPFLAGS="-I/opt/openssl-1.1.1/include"
export LDFLAGS="-Wl,-rpath,/opt/openssl-1.1.1/lib -L/opt/openssl-1.1.1/lib"
export PATH="/opt/openssl-1.1.1/bin:$PATH"
openssl version


選這個版本是因為這是 python311 要求的最低版本,新版本的要編譯可能會卡到更多的依賴,需求夠用就好。


最新版本 3.4.0 版

# 需要的依賴
sudo yum install perl-IPC-Cmd -y

# 下載並編譯 OpenSSL 庫
cd /tmp
wget https://www.openssl.org/source/openssl-3.4.0.tar.gz
tar xzf openssl-3.4.0.tar.gz
cd openssl-3.4.0
./config --prefix=/opt/openssl-3.4.0 shared
make -j$(nproc)
sudo make install

# 臨時載入必要的環境變數
export LD_LIBRARY_PATH="/opt/openssl-3.4.0/lib64"
export CPPFLAGS="-I/opt/openssl-3.4.0/include"
export LDFLAGS="-Wl,-rpath,/opt/openssl-3.4.0/lib64 -L/opt/openssl-3.4.0/lib64"
export PATH="/opt/openssl-3.4.0/bin:$PATH"
openssl version



2024年11月6日 星期三

PowerShell 如何捕捉 cmdlet 中 Write-Host 的信息到變數上

PowerShell 如何捕捉 cmdlet 中 Write-Host 的信息到變數上

在 PS 中通道其實是有屬於 PS 內自訂的通道, Write-Host 是 6 號通道

所以其實只要把 6 號轉換到 1 號就可以獲取了

function WriteTestMessage {
    Write-Host "這是使用 Write-Host 輸出的測試消息。"
}
$msg = WriteTestMessage 6>&1
Write-Host "msg = $msg"


其他通道的用處

1: Success (成功輸出)

2: Error (錯誤)

3: Warning (警告)

4: Verbose (詳細資訊)

5: Debug (除錯)

6: Information (資訊)


如果要個別獲取貌似只能重新定向到個別檔案上,無法透過 6>$msg 定向到變數獲取

例如 WriteTestMessage 6>"a.txt" 2>"b.txt" 這樣的寫法會直接輸出到檔案上。



這裡比較坑人的是 PS 有自己的流,這裡我先把他稱作為 PS流,與之相似的是與外部程式互動的,我們直接在終端看到的那個我把它稱為 Console流

PS中會同時出現兩種流的,當你呼叫一個外部程式那個外部程式產生的 stderr 是屬於 Console流 而不是 PS流

這不是在繞你啊,舉例來說下面的代碼

$stderr = App.exe 2>&1

嘗試獲取外部的 stderr 但實際上代碼中的 2>&1 所控制的是PS流,所以你啥也拿不到因為外部程式輸出的是Console流

如何獲取 Console流 中的 stderr 解法請參照這篇 CHG: PowerShell 如何捕捉 StdErr 通道的錯誤信息流 的 Invoke-CommandInfo 函式





PowerShell 如何捕捉 StdErr 通道的錯誤信息流

PowerShell 如何捕捉 StdErr 通道的錯誤信息流

這個要依靠 [Console]::SetError() 重設當前的流就可以捕捉到了


廢話不多說直接上代碼

function Get-StdErrOutput {
    param (
        [ScriptBlock]$ScriptBlock
    )

    # 創建 StringWriter 捕捉錯誤輸出
    $enc = [Console]::Error.Encoding
    $sw = New-Object System.IO.StringWriter
    [Console]::SetError($sw)

    try {
        & $ScriptBlock
    } finally {
        # 重置錯誤輸出流
        $originalErrorStream = [IO.StreamWriter]::new([Console]::OpenStandardError(), $enc)
        $originalErrorStream.AutoFlush = $true
        [Console]::SetError($originalErrorStream)
    }

    # 取得錯誤訊息並釋放資源
    $errorOutput = $sw.ToString() -replace "(`r?`n)$", ""
    $sw.Dispose()

    return $errorOutput
}


這是已經寫成函式的代碼下面是用例子

# 捕獲標準錯誤輸出
$std = Get-StdErrOutput {
    [Console]::Error.WriteLine("這是使用 Console.Error 輸出的測試消息。")
}

# 顯示捕獲到的錯誤訊息
Write-Host "Captured Error output = $std"

# 確認是否有復原原本的錯誤輸出
[Console]::Error.WriteLine("確認是否有復原原本的錯誤輸出") | Out-Null


此一來就可以把 stderr 的錯誤信息流輸出擷取到變數裡面了



如果要獲取外部程式的這裡也有個函式可以參考

SSHKeyLoader/SSHKeyLoader.ps1 at main · hunandy14/SSHKeyLoader



2024年11月2日 星期六

如何安裝 npm(nodejs) 與 vue 在Windows上

如何安裝 npm(nodejs) 與 vue 在Windows上


大概筆記一下有兩種裝法

  1. 使用安裝檔案 Node.js — 下載 Node.js®
  2. 使用免安裝檔案(需要自行添加環境變數) Node.js — 下載 Node.js®


第一個安裝檔案就是一路按到底就好,過程會有一個要求 chocolatey 編譯安裝,這個預設是沒打勾不要去按就好。

這東西是你要用 node-sass bcrypt sqlite3 的時候才會需要,事後也可以安裝,他在 npm 所在目錄有一個 install_tools.bat 執行就好。

所以初始安裝跳過就好,以後你要用的時候自己會去把它裝回來的。


免安裝檔案就把解壓縮目錄添加環境變數即可,然後如果要用 PowerShell 記得對 npm.ps1 這個檔案右鍵內容,解除封鎖。解封後就可以從 PowerShell 執行 npm 了。


對於模組目錄兩者預設在不同位置,也就是當你使用 -g 比如說 npm install -g @vue/cli 安裝時的目錄位置

  • 安裝檔案: %AppData%\npm\node_modules
  • 免安裝檔:解壓縮目錄底下的 node_modules






2024年10月31日 星期四

Windows OpenSSH 除錯如何啟動 Log 查找錯誤原因

OpenSSH Windows 上如何啟動 Log 查找錯誤原因


1. 客戶端:: 直接查看詳細信息

最快的方式直接加上 -vv 通常大概就能看出點什麼了

ssh -vv user@hostname


這個還可以在加一層 -vvv 不過通常是用不到

選項說明適用場景
-v顯示基礎的連接訊息,包括主機鍵驗證和認證過程用於一般排查連線問題,例如密鑰驗證失敗或主機連線錯誤
-vv顯示進一步的資訊,包括通道開啟、數據交換用於深入調查連線過程,特別是連線後的數據傳輸階段
-vvv顯示最高級別的詳細資訊,包括內部調試訊息用於調試 SSH 客戶端或伺服器本身,極少需要使用



2. 伺服端:: 輸出Log檔案

操作需要管理員權限,記得用管理員權限打開 PowerShell

要修改的設定檔在這個位置

notepad C:\ProgramData\ssh\sshd_config


打開之後新增底下兩行

SyslogFacility LOCAL0
LogLevel Debug3


然後儲存後關閉重新啟動 sshd

Restart-Service -Name sshd


然後再試著觸發錯誤後查看下面的檔案

notepad C:\ProgramData\ssh\logs\sshd.log
notepad C:\ProgramData\ssh\logs\sshd-session.log

看報什麼錯誤順著去修好就行




2024年10月9日 星期三

新版本 Teams 在 Win11 bug 藍牙耳機聽不到對方講話或是麥克風沒聲音

先說一下藍牙耳機的構造其實有兩個通道,兩種模式。

  1. 高音質模式 (同時使用兩個通道) (佔用1.5個通道)
  2. 通話模式 (麥克風與耳機個別使用個別通道) (佔用完整2個通道)
在高音質模式模式下耳機不會出現佔用一個通道維持音質同時可以接收另一個耳機的連接。也就是在1模式下你還可以連接另一個裝置。

1.5是我隨意取個大概好分變得概念,想表達的概念是他還可以被第二個裝置控制,兩個通道都佔滿了就無法連接了,具體的情境如下。


佔用的例子 (電腦與手機都已經連線配對過)
  1. 手機使用耳機通話中,此時電腦無法連接第二個裝置。
  2. 電腦使用高音質模式聽音樂中,此時手機可以連接第二個裝置。
  3. 兩個裝置同時連接中,電腦正在聽音樂,手機提示聲響。會被手機奪權
    1. 電腦音樂暫時聽不到,耳機強制切換到手機
    2. 待聲音結束手機安靜幾秒後自動切回電腦音樂。
  4. 兩個裝置同時連接中,電腦正在聽音樂,手機進入通話模式。會被手機奪權
    1. 音效設定中藍牙耳機消失,藍牙設定中裝置保持連線
    2. 電腦音樂變成外放
    3. 藍牙耳機強制切換到手機
    4. 待通話結束手機安靜幾秒後自動切回電腦音樂。
  5. 兩個裝置同時連接中,手機正在通話中,此時電腦提示聲響。不會被奪權而是聽不到電腦的音樂。

通常耳機會把 裝置1 有更高的優先權,如何要換順序的話需要有第三臺設備參與才能換

先把當前的兩台都中斷,第三台接入這一台會變成裝置1,此實在接入原先那兩台的其中一台就會被改成裝置2,再把第三台退掉換回去即可調整成自己想要的優先順序了。

不然現有的兩台順序已定,要調只能把要成為裝置1的那台忘記配對,重配就會變裝置1了。


回到Teams 的正題,應該是今天 8 月左右的改版,也不確定是不是 Win11 系統改版導致的。會出現聽不到有兩種情況



1. 對方聽不到我講話

這個主要原因是藍牙聲道佔用導致的,只會出現在可以同時連接兩個裝置的耳機上。

首先只要有其他裝置正在連接中,並且處於非待機模式中,也就是有在播音樂,此時在新版本 Teams 觀察到的情況是耳機麥克風會失效,估計是沒切到通話模式。


解法很簡單把另一個裝置斷線取消掉佔用就好,或是者讓你要通話的那台成為裝置1。

不過讓通話電腦成為裝置1有另一個bug是,上面舉例的第4點,電腦音樂會變成外放。剛接上電話電腦就變成外放,說真的頗哭夭的。



2. 我聽不到對方講話

這個是 Win11 的 teams 一起組合後的bug
  1. Win11 開始取消手動選擇換模式的方式變成自動由系統判定了。
  2. Teams 在通話實會呼叫 WinAPI 告知系統現在是通話模式。

兩個邏輯單獨看都很正常,但組合在一起只要 Teams 沒有同時把音源與麥克設置成耳機,結果就會變成
  1. teams 通話後會通知 Win11 現在通話中,而 Win11 會把藍牙設置成通話模式。
  2. teams 只有聲音被設置成藍牙耳機,判定應該接收立體聲音,但是目前通話模式佔用中高音質通道沒有聲音。
兩個就錯開了你啥也聽不到。覺得至少跟隨系統設讓藍牙有低音質聲音奏合著用吧...


具體還有一個有趣的表現是通話結束後,由 teams 設置的強制通話模式被關掉,聲音恢復你可以從立體中模式中聽到掛斷的聲音,夠白癡吧www直接誤導推理啊。

這個無解了,目前的 teams 無法使用 [藍牙耳機+外接麥克風通話]。選一個吧...或是等他改版修好了。



2024年9月23日 星期一

Evernote 使用率過高

近期有發現 Evernote 總是不斷的持續保持在 10~20% 左右的 CPU 佔用,似乎都不會下降,大致查了一下發現這篇

錯誤:Evernote 在後台時CPU使用率異常高。: r/Evernote (reddit.com)


總之裡面給出了幾個解法,最快的大概就是直接切換倒市集版本,由於市集版本與獨立安裝阪本位置是一樣的,你可以幾乎無損的轉移過去。

直接解除安裝然後,重裝安裝市集版本,不用重新登入所有資料都還在。

猜測應該是市集版本呼叫的應用程式不是叫做 evernote.exe 吧,討論有提到改名就好了...

如此白癡的錯誤怎麼可以脫這麼久還不修


2024年9月22日 星期日

如何下載最新版本 VMware Workstation 17

如何下載最新版本 VMware Workstation 17

根據這篇討論 下載在哪裡??|VMware 工作站 (broadcom.com)

有人挖出官方的連結 https://softwareupdate.vmware.com/cds/vmw-desktop/ws/17.6.2/24409262/windows/core/


裡面中 VMware-workstation-17.6.0-24238078.exe.tar 最新版的載點

載下來會變成一個 tar 檔案,直接用 Winrar 或是 7z 可以打開


或是使用 PowerShell 執行下面的指令,會在原地解開

tar -xvf .\VMware-workstation-17.6.0-24238078.exe.tar





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


* PnP.PowerShell要大於 2.12 版本才能作用,在此之前版本無法更改 ENTRAID_APP_ID 是無法登入的。




應用程式權限

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



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

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


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

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




完整的無應答登入代碼

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

# 設置登入信息
$cliendId = "Your-Client-ID"
$siteUrl  = "https://[TelentName].sharepoint.com/sites/[SiteName]"
$username = "[UserName]@[TelentName].onmicrosoft.com"
$password = "UserPassWord"
$credentials = New-Object System.Management.Automation.PSCredential($username, (ConvertTo-SecureString $password -AsPlainText -Force))

# 登入 SharePoint
$env:ENTRAID_APP_ID = $cliendId
Connect-PnPOnline -Url $siteUrl -Credentials $credentials

# 獲取網站文件目錄
Get-PnPFolder -Url "/Shared Documents"


* 記得確保 powershell 版本要大於7版, pnp.powershell 要大於 2.12 版本




2024年9月17日 星期二

使用 PowerShell 生成自簽署證書

使用 PowerShell 生成自簽署證書

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

不過有以下兩個小缺點

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


# 1. 定義変数
$CNName = "PnP_Roks"
$OutPath = "D:\mycertificates"
$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. 將證書公鑰導出為 CER 檔案 (需上傳到應用程式中)
$cert |Export-Certificate -FilePath "$OutPath\$CNName.cer"


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

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

這樣就生成完畢了,如果沒有移除證書的話可以在 certmgr.msc 中的 個人/憑證 區域找到該生成的證書。


需要上傳到 "應用程式" 中的只有 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