2024年11月6日 星期三

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 版本