2023年1月30日 星期一

[研究][GCB][ASP.NET]此實作不屬於 Windows Platform FIPS 已驗證密碼編譯演算法的一部分。

[研究][GCB][ASP.NET]此實作不屬於 Windows Platform FIPS 已驗證密碼編譯演算法的一部分。

2023-01-30

環境:Visual Studio 2022 + ASP.NET + WebForm + Web Application + C#

********************************************************************************

********************************************************************************

聯邦資訊處理標準 - 維基百科,自由的百科全書

https://zh.wikipedia.org/zh-hant/%E8%81%AF%E9%82%A6%E8%B3%87%E8%A8%8A%E8%99%95%E7%90%86%E6%A8%99%E6%BA%96

聯邦資訊處理標準(英語:Federal Information Processing Standards,縮寫FIPS)是美國聯邦政府制定給所有軍事機構除外的政府機構及政府的承包商所使用的公開標準。許多FIPS標準都是從廣泛的社會標準修改而來的(像ANSI,IEEE,ISO等等)。

有些FIPS標準是美國政府自行制定的,例如編碼資料的標準(像國家代碼),但是更多的標準其實是用來作為加密使用,例如資料加密標準(FIPS 46)和先進加密標準。

FIPS標準的一些例子:

  • FIPS國家代碼(10-4)
  • FIPS地區代碼(55-3)
  • FIPS郡代碼(6-4)
  • FIPS州代碼(5-2)

********************************************************************************

SHA512.Create 方法 (System.Security.Cryptography) | Microsoft Learn
https://learn.microsoft.com/zh-tw/dotnet/api/system.security.cryptography.sha512.create?view=net-7.0
在已啟用美國聯邦資訊處理標準 (FIPS) 模式的情況下使用演算法,但它與 FIPS 不相容。

系統密碼編譯 使用符合 FIPS 規範的演算法進行加密、雜湊和簽署 (Windows 10) | Microsoft Learn
https://learn.microsoft.com/zh-tw/windows/security/threat-protection/security-policy-settings/system-cryptography-use-fips-compliant-algorithms-for-encryption-hashing-and-signing

適用于 FIPS 的 Visual Studio 支援 | Microsoft Learn
https://learn.microsoft.com/zh-tw/visualstudio/ide/fips-support-visual-studio?view=vs-2022

********************************************************************************

Default.aspx.cs 出錯

using System.Security.Cryptography;
...
hash = new SHA512Managed(); // 出錯

後來把系統移出 GCB 的AD網域,就正常運作。

但是另外一個系統的  Default.aspx.cs 正常在GCB的AD網域環境運作

string sHA256 = SHA256CheckSum(saveFullFileName);
...
public string SHA256CheckSum(string filePath)
{
    using (SHA256 SHA256 = SHA256Managed.Create())
    {
        using (FileStream fileStream = File.OpenRead(filePath))
            return BitConverter.ToString(SHA256.ComputeHash(fileStream)).Replace("-", "").ToLowerInvariant();
    }
}

Default.aspx.cs 改寫為下面後正常

using System.Security.Cryptography;
...
hash = SHA512Managed.Create(); // 出錯

補:印象中以前在GCB AD網域是正常的,當時是Windows Server 2019; 後來另外新安裝一台Windows Server 2022,系統移植過去,也是正常的; 再來把Windows Server 2022加入GCB AD網域,開始異常。

(完)

相關

2023年1月28日 星期六

[研究]數位溫溼度計時鐘 HTC-1使用教學

[研究]數位溫溼度計時鐘 HTC-1使用教學

[研究]Digital Hygrometer Thermometer - HTC 1溫溼度計

2023-01-28

HUMIDITY  - H  濕度計
TEMPERATURE - T 溫度計
CLOCK - C 時鐘

https://big5.made-in-china.com/gs/htc-1wsdj-1.html

浙江省 寧波市 餘姚市 長江溫度儀表廠
姚儀牌HTC-1臺掛式溫溼度計
https://big5.made-in-china.com/gongying/yycjmic-xefnIwHvgCRr.html

寧波易舜居電子有限公司
電子溫濕度計 - HTC-1 黑色台掛式溫濕度計
http://www.nb-elife.com/product/cata-1/

深圳市奇亮達電子有限公司 HTC-1
https://detail.1688.com/offer/688345973184.html


********************************************************************************

溫濕度計用戶手冊

產品規格

  • 溫度測量範圍:-10%~70℃(14下~158下)
  • 溫度測量精度:士1℃(1.8下)
  • 溫度分辨率:士0,1℃(0·2下)
  • 濕度測量範圍:10。 /L99%RH
  • 濕度測量精度:±5%RH
  • 濕度分辨率:1%
  • 使用電池:AAA1.5V (四號電池AAA ×1)

基本功能

  • 溫度/濕度顯示
  • ℃/下溫度切換顯示
  • 最高/最低溫濕度記憶功能
  • 12/24小時制時鐘
  • 整點報時功能
  • 每日鬧鐘功能
  • 日曆顯示功能

********************************************************************************

操作方法

  1. 依機背指示方向推開電池門,裝上電池,然後裝回電池門,該機即可用。
  2. 按鍵功能:
    【MODE】切換時鐘與鬧鐘顯示模式/設定當前時鐘、鬧鐘、12或24小時制,日期;【ADJ】調整被設項目的數值;
    【MEMORY】顯示記憶中的最高&最低溫濕度值/清除 記憶的最高&最低溫濕度值;
    【C/F】切換溫度單位以℃(攝氏度)或F(華氏度)顯示。
  3. 在初始狀態下按住【MODE】2秒,當前時間的分秒數開始閃動,按【ADJ】可以調節分秒 數,連續按【MODE】可以分別設定“時鐘”、“12/24”、“月(M)”、“日(D)"。
  4. 在當前時鐘模式下(時鐘與分鐘之間的兩點每秒閃動一次),按【MODE】一次,切換顯示為鬧鐘模式(時鐘與分鐘之間的兩點不閃動),此時按【ADJ】可以切換“鬧鈴”(Alarm)功能/“整點報時”()功能的開關,再按住【MODE】2秒,可以設定鬧鈴時間,同時啟動“整點報時”功能,( )符號出現。
  5. 在鬧鈴模式下,若無任何操作則一分鐘後自動返回當前時鐘,此時按一次【ADJ)切換  至日曆顯示,3秒後自動返回當前時鐘,按【RY】鈕,顯示溫/濕度最後一次清除  (CLEAR)以來的最大/最小值。
  6. 按【MOEMORY】可以顯示記憶的溫/濕度最大值(MAX)和最小值(MIN),按住【MEMORY】  超過2秒可以清除最大/最小值。
  7. 支架內按鍵F//℃轉換。


注意事項

I.若該機出現任何不良,重新裝上電池;

2.電池用完後請放回政府指定地點。

********************************************************************************

(完)

2023年1月27日 星期五

[研究]測試阻擋 Citrix Netscaler APPFW 測試阻擋

[研究]測試阻擋 Citrix Netscaler APPFW 測試阻擋

2023-01-27

偶然看到的畫面,紀錄一下,似乎是 Application Firewall 的訊息。

********************************************************************************

https://www.tkec.com.tw/?fbclid=IwAR2xXgpNbj-K6a_sZnKXpe4TyZ-4dcfwdu9Fff7WpuIZW_l76iqVpu0cCu4

********************************************************************************

Click 圖片可看100%圖

********************************************************************************

測試阻擋 Citrix Netscaler APPFW 測試阻擋

你被阻擋囉,你想要

  • 回到首頁重新進入,或者
  • 將此問題回報給我們的客服信箱,電話:0912345678。

回報問題時,請提供下列資訊:

Transaction ID:3272417286-PPE2
Session ID:Duk7M3J8IMAeOORlkDJp6ACvRUA0002
Violation Category:APPFW_STARTURL
Violation Log:111.241.142.211 3272417286-PPE2 Duk7M3J8IMAeOORlkDJp6ACvRUA0002 www.tkec.com.tw Disallow Illegal URL: https://www.tkec.com.tw/?fbclid=IwAR2xXgpNbj-K6a_sZnKXpe4TyZ-4dcfwdu9Fff7WpuIZW_l76iqVpu0cCu4 <blocked>
Cookie Name:-

********************************************************************************

思杰系統公司(Citrix Systems, Inc.)是一家軟體和雲端運算的科技公司。它的跨國業績包括提供伺服器、軟體及桌面虛擬化、網路連結、以及軟體即服務(SaaS)等產品。 
https://zh.wikipedia.org/zh-tw/%E6%80%9D%E6%9D%B0%E7%B3%BB%E7%BB%9F

NetScaler是Cloud Software Group擁有的一系列網絡產品。這些產品包括應用程序交付控制器NetScaler,應用程序防火牆NetScaler AppFirewall,NetScaler統一網關,NetScaler管理和分析系統以及提供軟件定義的廣域網絡管理的NetScaler SD-WAN。
https://en.wikipedia.org/wiki/NetScaler

[研究]PotPlayer 221215 (1.7.21862) 免安裝版對於無解碼器 TrueHD 之解決

[研究]PotPlayer 221215 (1.7.21862) 免安裝版對於無解碼器 TrueHD 之解決

2023-01-27

PotPlayer 在播放某些影片時,可能出現

播放目前音訊所需的解碼器是「TrueHD」。

請按右側「搜尋解碼器」安裝所需解碼器。


然後會自動下載 OpenCodecSetup64.exe

http://t1.daumcdn.net/potplayer/PotPlayer/Codec/v1/OpenCodecSetup64.exe

安裝後即可撥放,不會有影片而無聲音。

********************************************************************************

但對於免安裝版 (Portable) 會失敗,OpenCodecSetup64.exe 安裝過程,要改變預設的安裝目錄,根據 x64 或 x86 改選到免安裝版的 PotPlayer64.exe 或 PotPlayer.exe 目錄才行。

D:\SOFTWARE\PotPlayer 221215 (1.7.21862) x86 x64 繁體中文版 (2022-12-15)\PotPlayerPortable\App\PotPlayer64

D:\SOFTWARE\PotPlayer 221215 (1.7.21862) x86 x64 繁體中文版 (2022-12-15)\PotPlayerPortable\App\PotPlayer



(完)

相關

[研究]PotPlayer 221215 (1.7.21862) 免安裝版對於無解碼器 TrueHD 之解決

[研究] PotPlayer 播放影片無聲音之解決

[研究] PotPlayer 1.7.1955 (2019-09-19)不支援 S/W HEVC(H265)解碼之解決
[研究] PotPlayer v1.7 連續擷取畫面

[研究] PotPlayer 1.7 影片撥放「視訊解碼器」「使用硬體加速」

[研究] PotPlayer 1.7 影片撥放時候「立即擷取目前畫面」

[研究] PotPlayer 1.7 影像擷取存檔時「以播放時間命名檔案」

2023年1月22日 星期日

[研究]用 XnView 2.51.0 免費看圖軟體批次轉換 .WebP 成 .JPG 圖片

[研究]用 XnView 2.51.0 免費看圖軟體批次轉換 .WebP 成 .JPG 圖片

2023-01-22

XnView 軟體官方網站
https://www.xnview.com/en/xnview/

https://www.xnview.com/wiki/index.php/XnView_User_Guide
XnView is free of charge or freeware for private users. Commercial users must have a valid licence. Further information and prices can be found at the Register page.
XnView 對私人用戶免費或免費。 商業用戶必須持有有效許可證。 更多信息和價格可以在註冊頁面找到。

XnView 2.51.0 於 2022-05-31釋出,但從 1.98 (2011-05-09) 就支援 WebP 圖片。

XnView Minimal, Standard, or Extended 比較
https://newsgroup.xnview.com/viewtopic.php?t=33141
繁體中文介面 Minimal 不支援,Standard 開始支援。



(完)



2023年1月19日 星期四

[研究]Git commit失敗之解決 - git did not exit cleanly (exit code 1)(二)

[研究]Git commit 出現 git did not exit cleanly (exit code 1) 問題之解決(二)

2023-01-19

續這篇

[研究]Git commit 出現 git did not exit cleanly (exit code 1) 問題之解決
http://shaurong.blogspot.com/2022/03/git-commit-git-did-not-exit-cleanly.html

這次依照舊方法,怎麼測試都不行,別人、別專案也出相同狀況。


(下圖)就算勾選 force 或 force with lease,實際測試也不行。

********************************************************************************

解決

把 Windows 「服務」中的 gitea 重新啟動後,自己和它人都正常了。

********************************************************************************

(完)

[研究]SQL Server 2019 主機加入 GCB AD網域後,Web Server 連不到DB之解決

[研究]SQL Server 2019 主機加入 GCB AD網域後,Web Server 連不到DB之解決

2023-01-18


********************************************************************************
加入 GCB AD網域後,發現 Web Server 連不到資料庫


(下圖)發現Windows Defender防火牆多了「網域」欄位,SQL Server Windows NT多了一筆,
原來那筆(第一筆)的「網域」沒有打勾;
新增那一筆的「網域」有打勾,但「SQL Server Windows NT」前面沒有打勾,所以沒有生效,所以 Web Server 連不上 SQL Server
********************************************************************************
解決

按下「變更設定」按鈕,把第一筆「SQL Server Windows NT」的「網域」有打勾,按下「確定」按鈕,再次測試,可以連上了。




(完)

2023年1月18日 星期三

[研究]MailKit, MimeKit, MailKitLite, MimeKitLite 差異比較

[研究]MailKit, MimeKit, MailKitLite, MimeKitLite 差異比較

2023-01-18

MailKit 和 MimeKit 是兩個.NET平台上用於處理電子郵件的開源庫。

MailKit是一個功能強大的郵件客戶端庫,它提供了一個高級API,可以方便地與各種電子郵件協議(如SMTP、POP3、IMAP)進行交互。 MailKit還提供了對S/MIME和PGP加密的支持,可以用於對電子郵件進行加密和解密。

MimeKit則是一個專注於郵件消息解析和生成的庫,它可以方便地解析和生成各種郵件消息格式,如MIME和S/MIME消息。 MimeKit也支持對PGP加密的解析和生成。

MailKitLite和MimeKitLite是MailKit和MimeKit的輕量級版本,它們針對某些特定場景進行了優化和簡化,以減少庫的大小和複雜度。

總體而言,MailKit和MimeKit提供了一個完整而強大的郵件處理解決方案,可以滿足各種不同的需求,包括處理電子郵件協議、加密和解密電子郵件、解析和生成郵件消息等等。而MailKitLite和MimeKitLite則提供了一個較為輕量級的解決方案,適用於那些對庫的大小和複雜度有限制的場景。

4者官方網站都是
http://www.mimekit.net/

MailKit 3.4.3 和 MailKitLite 3.4.3
支援.NET 6.0 .NET Standard 2.0 .NET Framework 4.6.2
MailKit is an Open Source cross-platform .NET mail-client library that is based on MimeKit and optimized for mobile devices.
https://www.nuget.org/packages/MailKit
https://www.nuget.org/packages/MailKitLite/

MimeKit 3.4.3 和 MimeKitLite 3.4.3
支援.NET 6.0 .NET Standard 2.0 .NET Framework 4.6.2
MimeKit is an Open Source library for creating and parsing MIME, S/MIME and PGP messages on desktop and mobile platforms.
https://www.nuget.org/packages/MimeKit
https://www.nuget.org/packages/MimeKitLite

差異

https://github.com/jstedfast/MimeKit
MimeKit.sln Removed Mono.Data.Sqlite
MimeKitLite.sln Dropped the Net45-specific projects/solutions

https://github.com/jstedfast/MimeKit/blob/master/README.md
MimeKit.sln - includes projects for .NET 4.5/4.6/4.7/4.8, .NETStandard 1.3/1.6/2.0 as well as the unit tests.
MimeKitLite.sln - includes projects for the stripped-down versions of MimeKit that drop support for crypto.
MimeKit.sln - 包括 .NET 4.5/4.6/4.7/4.8、.NETStandard 1.3/1.6/2.0 的項目以及單元測試。
MimeKitLite.sln - 包括 MimeKit 的精簡版本的項目,它放棄了對加密的支持。

********************************************************************************

Visual Studio 2022 NuGet 安裝 MailKit 3.4.3 要求

Portable.BouncyCastle.1.9.0

System.Buffers.4.5.1

System.Numerics.Vectors.4.5.0

System.Runtime.CompilerServices.Unsafe.6.0.0

System.Memory.4.5.5

MimeKit.3.4.3

********************************************************************************

Visual Studio 2022 NuGet 安裝 MailKitLite 3.4.3 要求

System.Buffers.4.5.1

System.Numerics.Vectors.4.5.0

System.Runtime.CompilerServices.Unsafe.6.0.0

System.Memory.4.5.5

MimeKitLite.3.4.3

********************************************************************************

使用 MailKitLite 3.43 和 MimeKitLite 3.43 情況

using MailKit.Net.Smtp;	// 錯誤:找不到類型或命名空間名稱 'MailKit'
using MailKit.Scurity;	// 錯誤:找不到類型或命名空間名稱 'MailKit'

using MailKitLite.Net.Smtp;	// 錯誤:找不到類型或命名空間名稱 'MailKitLite'	
using MailKit.Security;		// 錯誤:找不到類型或命名空間名稱 'MailKitLite'

using MimeKit;
using MimeKit.Cryptography;
using MimeKit.Utils;

using MimeKitLite;		// 錯誤:找不到類型或命名空間名稱 'MimeKitLite'
using MimeKitLite.Cryptography;	// 錯誤:找不到類型或命名空間名稱 'MimeKitLite'
using MimeKitLite.Utils;	// 錯誤:找不到類型或命名空間名稱 'MimeKitLite'

編譯會出錯

CS0234 命名空間 'MimeKit.Cryptography' 中沒有類型或命名空間名稱 'TemporarySecureMimeContext' 

CS0103 名稱 'MultipartSigned' 不存在於目前的內容

using (var ctx = new MimeKit.Cryptography.TemporarySecureMimeContext())
                {
                    // Note: this assumes that the Sender address has an S/MIME signing certificate
                    // and private key with an X.509 Subject Email identifier that matches the
                    // sender's email address.
                    var ctxsender = message.From.Mailboxes.FirstOrDefault();

                    CmsSigner signer = new CmsSigner(signCert);
                    message.Body = MultipartSigned.Create(ctx, signer, message.Body);

                    // MimeKit.Cryptography.CertificateNotFoundException
                    // A valid signing certificate could not be found.
                    //message.Body = MultipartSigned.Create(ctx, ctxsender, DigestAlgorithm.Sha1, message.Body);
                }


下面會出現錯誤

命名空間 'MimeKit.Cryptography' 中沒有類型或命名空間名稱 'SecureMailboxAddress'

MimeKit.Cryptography.SecureMailboxAddress mailbox = new MimeKit.Cryptography.SecureMailboxAddress(
                    System.Text.Encoding.GetEncoding("UTF-8"),
                    "信箱",
                    new List<string>(),
                    "帳號@abcdef.com.tw",
                    ""
                );

下面會出現錯誤

using (var client = new MailKitLite.Net.Smtp.SmtpClient
            {
                ServerCertificateValidationCallback = (s, c, h, ee) => true
            })

下面會出現錯誤

using (var client = new MailKit.Net.Smtp.SmtpClient
            {
                ServerCertificateValidationCallback = (s, c, h, ee) => true
            })

下面會出現錯誤

CS0117 'SmtpClient' 未包含 'ServerCertificateValidationCallback' 的定義
using (var client = new SmtpClient
            {
                ServerCertificateValidationCallback = (s, c, h, ee) => true
            })


(完)


相關

[研究][C#][ASP.NET] 自動加簽或不加簽寄信(使用 MailKit 和 MimeKit)(六)附件改良https://shaurong.blogspot.com/2023/01/caspnet-mailkit-mimekit.html

[研究][C#][ASP.NET] 自動加簽或不加簽寄信(使用 MailKit 和 MimeKit)(五)多收件者與多附件

[研究][C#][ASP.NET] 加簽寄信(使用 MailKit 和 MimeKit)(四)多收件者與多附件
https://shaurong.blogspot.com/2022/06/caspnet-mailkit-mimekit_13.html

[研究][C#][ASP.NET] 加簽寄信(使用 MailKit 和 MimeKit)(三)多收件者與單一附件
https://shaurong.blogspot.com/2022/06/caspnet-mailkit-mimekit_12.html

[研究][ASP.NET]加簽寄信-Windows Server 2019 IIS 10.0 抓 Key Store 中Email憑證所需的權限設定

[研究][C#][ASP.NET] 加簽寄信(使用 MailKit 和 MimeKit)(二)單一收件者、副本、密件
https://shaurong.blogspot.com/2022/06/caspnet-mailkit-mimekit.html

[研究][C#][ASP.NET] 加簽寄信 (使用 MailKit 和 MimeKit)
https://shaurong.blogspot.com/2019/10/caspnet-mailkit-mimekit_13.html

[研究][C#][ASP.NET] 寄信 (使用 MailKit 和 MimeKit)
https://shaurong.blogspot.com/2019/10/caspnet-mailkit-mimekit_11.html

[研究][C#][ASP.NET] 加簽寄信 (使用 System.Net.Mail.MailMessage)
https://shaurong.blogspot.com/2019/10/caspnet-systemnetmailmailmessage.html
更新補充一些資訊,更新到 2021-11-29

[研究][ASP.NET]單一或多個 Email 格式驗證 (使用C#)

[研究]單一或多個 Email 格式驗證 (使用 HTML5)

[研究][ASP.NET]加簽寄信-值不能為 null。參數名稱: findValue

mimekit - 在MimeKit上,簽名和加密
http://hant.ask.helplib.com/mimekit/post_4274560

MailKit Documentation - Creating messages
http://www.mimekit.net/docs/html/Creating-Messages.htm
有簡單寄信範例 (但沒有加簽)

MailKit Documentation - Digitally Signing Messages using S/MIME
http://www.mimekit.net/docs/html/Working-With-SMime.htm#Sign

.NET Framework 中過時的類型
https://docs.microsoft.com/zh-tw/dotnet/framework/whats-new/obsolete-types
System.Web.Mail.SmtpMail 過時,建議的替代做法是 System.Net.Mail.SmtpClient。

System.Net.Mail.SmtpClient
https://docs.microsoft.com/zh-tw/dotnet/api/system.net.mail.smtpclient?view=netframework-4.8
System.Net.Mail.SmtpClient 淘汰,建議改用 https://github.com/jstedfast/MailKit 和 https://github.com/jstedfast/MimeKit

GitHub - jstedfast/MailKit: A cross-platform .NET library for IMAP, POP3, and SMTP.
https://github.com/jstedfast/MailKit

GitHub - jstedfast/MimeKit: A .NET MIME creation and parser library with support for S/MIME, PGP, DKIM, TNEF and Unix mbox spools.
https://github.com/jstedfast/MimeKit

[研究][C#][ASP.NET] 加簽寄信 (使用 System.Net.Mail.MailMessage)
https://shaurong.blogspot.com/2019/10/caspnet-systemnetmailmailmessage.html

[研究][C#]加密加簽寄信(使用Cpi.Net.SecureMail)(一)
http://shaurong.blogspot.com/2017/02/ccpinetsecuremail.html

[研究][C#]加密加簽寄信(使用Cpi.Net.SecureMail)(二)
http://shaurong.blogspot.com/2017/02/ccpinetsecuremail_13.html

[研究][C#][ASP.NET] IIS SMTP 寄信失敗,拒絕存取路徑
https://shaurong.blogspot.com/2019/10/caspnet-iis-smtp.html

[研究] [ASP.NET] [C#] [WebForm] 寄信問題
http://shaurong.blogspot.com/2017/06/aspnet-c-webform.html

An S/MIME Library for Sending Signed and Encrypted E-mail
Pete Everett, 15 Jul 2010
https://www.codeproject.com/Articles/41727/An-S-MIME-Library-for-Sending-Signed-and-Encrypted

ASP.NET寄發加密加簽信件
https://www.nccst.nat.gov.tw/ArticlesDetail?lang=zh&seq=1160

Cpi.Net.SecureMail
https://www.codeproject.com/script/Content/ViewAssociatedFile.aspx?rzp=%2FKB%2Fsecurity%2FCPI_NET_SecureMail%2F%2FCpi.Net.SecureMail_src.zip&zep=Cpi.Net.SecureMail_src%2FCpi.Net.SecureMail%2FSecureMailMessage.cs&obid=41727&obtid=2&ovid=5

如何透過 .NET 送出一個包含 S/MIME 簽章的郵件
2009/06/06 21:20
https://blog.miniasp.com/post/2009/06/06/How-to-send-s-mime-email-using-net

2023年1月17日 星期二

[研究]連線某網站,FireFox 顯示「警告: 本網站可能有安全性風險」解決方法

[研究]連線某網站,FireFox 顯示「警告: 本網站可能有安全性風險」解決方法

2023-01-17

當連線到網站伺服器憑證過期或異常的網站,會出現下面訊息,解決方法點「進階」按鈕,點「接受風險並繼續」。




如果沒有相關按鈕,可能公司 MIS 把它封鎖了。

(完)

[研究]連網站時,Chrome 顯示「你的連線不是私人連線」解決方法

[研究]連網站時,Chrome 顯示「你的連線不是私人連線」解決方法

2023-01-17

當連線到網站伺服器憑證過期或異常的網站,會出現下面訊息,解決方法點「進階」按鈕,點「繼續前往 XXX 網站」。



如果沒有「進階」按鈕或「繼續前往 XXX 網站」,可能公司 MIS 把它封鎖了。

(完)

[研究]連網站時,Kaspersky顯示「造訪不受信任的網站被禁止」解決方法

[研究]連網站時,Kaspersky顯示「造訪不受信任的網站被禁止」解決方法

2023-01-17

測試軟體:卡巴斯基全方位安全軟體30 Days Trial (單機版最頂級版本)

當連線到網站伺服器憑證過期或異常的網站,會出現下面訊息,解決方法點「顯示詳情」,點「希望繼續」。



如果沒有「希望繼續」,可能公司 MIS 把「希望繼續」連結封鎖了。

(完)

2023年1月16日 星期一

[研究][C#][ASP.NET] 自動加簽或不加簽寄信(使用 MailKit 和 MimeKit)(六)附件改良

[研究][C#][ASP.NET] 自動加簽或不加簽寄信(使用 MailKit 和 MimeKit)(六)附件改良

2023-01-16

********************************************************************************
相關數篇

[研究][C#][ASP.NET] 自動加簽或不加簽寄信(使用 MailKit 和 MimeKit)(五)多收件者與多附件

[研究][C#][ASP.NET] 加簽寄信(使用 MailKit 和 MimeKit)(四)多收件者與多附件
https://shaurong.blogspot.com/2022/06/caspnet-mailkit-mimekit_13.html

[研究][C#][ASP.NET] 加簽寄信(使用 MailKit 和 MimeKit)(三)多收件者與單一附件
https://shaurong.blogspot.com/2022/06/caspnet-mailkit-mimekit_12.html

[研究][ASP.NET]加簽寄信-Windows Server 2019 IIS 10.0 抓 Key Store 中Email憑證所需的權限設定

[研究][C#][ASP.NET] 加簽寄信(使用 MailKit 和 MimeKit)(二)單一收件者、副本、密件
https://shaurong.blogspot.com/2022/06/caspnet-mailkit-mimekit.html

[研究][C#][ASP.NET] 加簽寄信 (使用 MailKit 和 MimeKit)
https://shaurong.blogspot.com/2019/10/caspnet-mailkit-mimekit_13.html

[研究][C#][ASP.NET] 寄信 (使用 MailKit 和 MimeKit)
https://shaurong.blogspot.com/2019/10/caspnet-mailkit-mimekit_11.html

[研究][C#][ASP.NET] 加簽寄信 (使用 System.Net.Mail.MailMessage)
https://shaurong.blogspot.com/2019/10/caspnet-systemnetmailmailmessage.html
更新補充一些資訊,更新到 2021-11-29

[研究][ASP.NET]單一或多個 Email 格式驗證 (使用C#)

[研究]單一或多個 Email 格式驗證 (使用 HTML5)

********************************************************************************

環境:Visual Studio 2022 + ASP.NET + WebForm + Web Application + C#

先設定權限

[研究][ASP.NET]加簽寄信-Windows Server 2019 IIS 10.0 抓 Key Store 中Email憑證所需的權限設定https://shaurong.blogspot.com/2022/06/aspnet-windows-server-2019-iis-100-key.html

NuGet 要安裝 MailKit  ( System.Data.SQLite 則不用),會自動安裝

Portable.BouncyCastle.1.9.0
System.Buffers.4.5.1
System.Numerics.Vectors.4.5.0
System.Runtime.CompilerServices.Unsafe.4.5.3
System.Memory.4.5.4
System.Text.Encoding.CodePages.4.5.1
MimeKit.3.2.0
System.Threading.Tasks.Extensions.4.5.4
MailKit.3.2.0

Web.Config 部分

<?xml version="1.0" encoding="utf-8"?>
<configuration>
	<appSettings>
		<add key="EmailCertificateSN" value="郵件憑證序號" />
	</appSettings>
</configuration>

CommonMailKit.cs

using MailKit.Net.Smtp;
using MailKit.Security;
using MimeKit;
using MimeKit.Cryptography;
using MimeKit.Utils;
using System;
using System.Collections.Generic;
using System.Configuration;
using System.IO;
using System.Linq;
using System.Net;
using System.Net.Mail;
using System.Security.Cryptography.X509Certificates;
using System.Web;
using System.Web.UI.WebControls;

//namespace WebApplication1.App_Start
namespace WebApplication1
{
    public class CommonMailKit
    {
        public static string SendMail(
            string emailSubject,
            string emailContent,
            string toAddressList,
            string ccAddressList,
            string bccAddressList,
            string attacFileName,
            MemoryStream attacFileNameMemoryStream)
        {

            // http://www.mimekit.net/docs/html/Creating-Messages.htm
            var message = new MimeMessage();
            //message.From.Add(new MailboxAddress("User123", "user123@abcdef.com.tw"));
            MimeKit.Cryptography.SecureMailboxAddress mailbox = new MimeKit.Cryptography.SecureMailboxAddress(
                    System.Text.Encoding.GetEncoding("UTF-8"),
                    "信箱",
                    new List<string>(),
                    "帳號@abcdef.com.tw",
                    ""
                );
            message.From.Add(mailbox);

            char[] stringSeparators = new char[] { ',', ';' };

            if (toAddressList != null)
            {
                toAddressList.Replace(" ", "");//移除半形空白
                InternetAddressList toList = new InternetAddressList();
                foreach (var item in toAddressList.Split(stringSeparators, StringSplitOptions.RemoveEmptyEntries))
                {
                    // Invalid local-part at offset 0
                    // https://github.com/jstedfast/MailKit/issues/494
                    // toList.Add(new MailboxAddress(item, item));

                    var address = MailboxAddress.Parse(item);
                    //address.Name = name;
                    toList.Add(address);
                }
                message.To.AddRange(toList);
            }
            else
            {
                return "寄信失敗,收件者Email沒有設定。";
            }

            // Cc 可以沒有
            if (!string.IsNullOrEmpty(ccAddressList))
            {
                ccAddressList.Replace(" ", "");//移除半形空白
                InternetAddressList ccList = new InternetAddressList();
                foreach (var item in ccAddressList.Split(stringSeparators, StringSplitOptions.RemoveEmptyEntries))
                {
                    var address = MailboxAddress.Parse(item);
                    //address.Name = name;
                    ccList.Add(address);
                }
                message.Cc.AddRange(ccList);
            }

            // Bcc 可以沒有
            if (!string.IsNullOrEmpty(bccAddressList))
            {
                bccAddressList.Replace(" ", "");//移除半形空白
                InternetAddressList bccList = new InternetAddressList();
                foreach (var item in bccAddressList.Split(stringSeparators, StringSplitOptions.RemoveEmptyEntries))
                {
                    var address = MailboxAddress.Parse(item);
                    //address.Name = name;
                    bccList.Add(address);
                }
                message.Bcc.AddRange(bccList);
            }

            // 預設回信收件者
            //message.ReplyTo.Add(new MailboxAddress("User456", "user456@abcdef.com.tw"));
            //message.Subject = "Digitally Signing Email Test";
            message.Subject = emailSubject;

            //            message.Body = new MimeKit.TextPart("plain")
            //            {
            //                Text = @"Hey Alice,

            //What are you up to this weekend? Monica is throwing one of her parties on
            //Saturday and I was hoping you could make it.

            //Will you be my +1?

            //-- Joey
            //"
            //            };

            // http://www.mimekit.net/docs/html/Creating-Messages.htm
            var builder = new BodyBuilder
            {

                // Set the plain-text version of the message text
                //            builder.TextBody = @"Hey Alice,

                //What are you up to this weekend? Monica is throwing one of her parties on
                //Saturday and I was hoping you could make it.

                //Will you be my +1?

                //-- Joey
                //";

                // In order to reference selfie.jpg from the html text, we'll need to add it
                // to builder.LinkedResources and then use its Content-Id value in the img src.
                //var image = builder.LinkedResources.Add(@"C:\Users\Joey\Documents\Selfies\selfie.jpg");
                //image.ContentId = MimeUtils.GenerateMessageId();

                // Set the html version of the message text
                //            builder.HtmlBody = string.Format(@"<p>Hey Alice,<br>
                //<p>What are you up to this weekend? Monica is throwing one of her parties on
                //Saturday and I was hoping you could make it.<br>
                //<p>Will you be my +1?<br>
                //<p>-- Joey<br>
                //<center><img src=""cid:{0}""></center>", image.ContentId);

                TextBody = emailContent
            };

            // We may also want to attach a calendar event for Monica's party...
            // 下面測試可用
            //builder.Attachments.Add(@"C:\Users\Administrator\Desktop\a.png");

            //HttpFileCollection httpFileCollection = HttpContext.Current.Request.Files;
            //for (int i = 0; i < httpFileCollection.Count; i++)
            //{
            //    HttpPostedFile httpPostedFile = httpFileCollection[i];
            //    try
            //    {
            //        if (httpPostedFile.ContentLength > 0)
            //        {
            //            string filePath = httpPostedFile.FileName;
            //            string filename = Path.GetFileName(filePath);

            //            Stream fs = httpPostedFile.InputStream;
            //            BinaryReader br = new BinaryReader(fs);
            //            Byte[] bytes = br.ReadBytes((Int32)fs.Length);

            //            MemoryStream destination = new MemoryStream(bytes);
            //            builder.Attachments.Add(filename, destination);
            //        }
            //    }
            //    catch (Exception ex)
            //    {
            //        if (ex == null)
            //        {
            //            return "不明錯誤。";
            //        }
            //        else
            //            return ex.Message;
            //    }
            //}

            if (attacFileName != "")
            {
                builder.Attachments.Add(attacFileName, attacFileNameMemoryStream);
            }
            // Now we just need to set the message body and we're done
            message.Body = builder.ToMessageBody();

            //message.Body = new TextPart("plain")
            //{
            //    Text = emailContent
            //};


            // http://www.mimekit.net/docs/html/Working-With-SMime.htm
            // Note: by registering our custom context it becomes the default S/MIME context
            // instantiated by MimeKit when methods such as Encrypt(), Decrypt(), Sign(), and
            // Verify() are used without an explicit context.

            //CryptographyContext.Register(typeof(MySecureMimeContext));

            X509Store store = new X509Store("My", StoreLocation.LocalMachine);

            store.Open(OpenFlags.ReadOnly | OpenFlags.OpenExistingOnly);

            //如果新舊憑證都尚未過期,會抓到舊的憑證
            //X509Certificate2 signCert = store.Certificates.Find(X509FindType.FindBySubjectName, "憑證名稱", false)[0];

            bool hasEmailCert = true;
            //從Web.Config中抓Email憑證序號值
            string emailCertificateSN = ConfigurationManager.AppSettings["EmailCertificateSN"];
            if (emailCertificateSN == null || emailCertificateSN == "")
            {
                //return "讀取不到Email憑證序號。";
                hasEmailCert = false;
            }

            if (hasEmailCert == true)
            {
                //用 Email憑證序號抓比較不會抓錯
                X509Certificate2 signCert = store.Certificates.Find(X509FindType.FindBySerialNumber, emailCertificateSN, false)[0];
                if (signCert == null)
                {
                    hasEmailCert = false;
                }
                //用指紋抓
                // X509Certificate2 signCert = store.Certificates.Find(X509FindType.FindByThumbprint, "12339f33449f0cc767feb69e6dc2774ce10c1f60", false)[0];

                // VS 2019 中正常,deploy 後執行,出現錯誤「機碼組不存在」
                // 要用 MMC 設定 Email 憑證可讓 IIS_IUSRS 存取
                CmsRecipient recipient = new CmsRecipient(signCert);

                CmsRecipientCollection colle = new CmsRecipientCollection
                {
                    recipient
                };

                using (var ctx = new MimeKit.Cryptography.TemporarySecureMimeContext())
                {
                    // Note: this assumes that the Sender address has an S/MIME signing certificate
                    // and private key with an X.509 Subject Email identifier that matches the
                    // sender's email address.
                    var ctxsender = message.From.Mailboxes.FirstOrDefault();

                    CmsSigner signer = new CmsSigner(signCert);
                    message.Body = MultipartSigned.Create(ctx, signer, message.Body);

                    // MimeKit.Cryptography.CertificateNotFoundException
                    // A valid signing certificate could not be found.
                    //message.Body = MultipartSigned.Create(ctx, ctxsender, DigestAlgorithm.Sha1, message.Body);
                }
            }
            else
            {
                // No Email Cert
                // Nothing
            }
            // http://www.mimekit.net/docs/html/M_MailKit_Net_Smtp_SmtpClient__ctor.htm
            using (var client = new MailKit.Net.Smtp.SmtpClient
            {
                ServerCertificateValidationCallback = (s, c, h, ee) => true
            })
            {
                // IIS SMTP 要設定 None,Auto 會失敗
                //client.Connect("localhost", 25, SecureSocketOptions.None);

                //http://www.mimekit.net/docs/html/T_MailKit_Security_SecureSocketOptions.htm
                //client.Connect("smtp.abcdef.com.tw", 25, false);// 非 SSL連線
                //client.Connect("smtp.abcdef.com.tw", 25, SecureSocketOptions.Auto);// Auto SSL連線
                //client.Connect("smtp.abcdef.com.tw", 465, SecureSocketOptions.Auto);
                //client.Connect("smtp.abcdef.com.tw", 587, SecureSocketOptions.Auto);

                // 某些 Mail Server (SMTP) 寄信會要求帳號、密碼
                // 某些 Mail Server (SMTP) 的帳號是完整含 @ 的Email,有些是 @ 之前的
                //client.Authenticate("帳號", "密碼");
                //client.Authenticate("zzzz@gmail.com", "密碼");

                // Pmail Server 驗證必須 bypass,必須有下面 Code
                // 否則會出現錯誤:根據驗證程序,遠端憑證是無效的。
                // 目前把 ServerCertificateValidationCallback 加在上方
                //MailKit.Net.Smtp.SmtpClient client = new MailKit.Net.Smtp.SmtpClient
                //{
                //    ServerCertificateValidationCallback = (s, c, h, ee) => true
                //};


                //string localIP = Common.GetLocalIPv4();
                string localIP = GetLocalIPv4();
                // 最短 localIP 為 1.2.3.4,長度7,Substring不可超過7
                if (localIP.Substring(0, 5) == "10.3.")
                {
                    message.Subject = message.Subject + " (" + localIP + ")";    // 非正式機加上 IP

                    // OA LAN 上 Exchange Server
                    // Email Cert 申請的是 帳號@abcdef.com.tw
                    // Exchange Server Email : re帳號@abcdef.com.tw 一般帳號,寄信使用
                    // Exchange Server Email : 帳號@abcdef.com.tw 群組帳號,無法寄信
                    // 真實寄信用 re帳號@abcdef.com.tw,但名義上的寄信者是 帳號@abcdef.com.tw
                    // 為了和 Email Cert 的 帳號@abcdef.com.tw 相符合
                    //client.Connect("smtp.icst.org.tw", 25, false); // icst.org.tw 對外應該已宣稱無使用了

                    // IIS SMTP 要設定 None,Auto 會失敗
                    //client.Connect("smtp.abcdef.com.tw", 25, SecureSocketOptions.Auto);
                    //client.Connect("smtp.abcdef.com.tw", 25, SecureSocketOptions.None);

                    //client.Connect("smtp.abcdef.com.tw", 25, false);
                    //client.Authenticate("re帳號", "密碼");

                    client.Connect("10.3.99.25", 25, false);
                    client.Authenticate("se", "123456");

                }
                if (localIP.Substring(0, 7) == "192.168.")
                {
                    // 「對外服務網段」只能用 Pmail ( 192.168.3.25) 寄信
                    // Pmail 帳號 和 OA LAN 帳號不同
                    // Pmail Server Email : 帳號@abcdef.com.tw 一般帳號
                    // Email Cert 申請的是 帳號@abcdef.com.tw

                    // IIS SMTP 要設定 None,Auto 會失敗
                    //client.Connect("192.168.3.25", 25, SecureSocketOptions.Auto);
                    //client.Connect("smtp.abcdef.com.tw", 25, SecureSocketOptions.None);
                    client.Connect("192.168.3.25", 25, false);
                    client.Authenticate("帳號", "密碼");
                }

                try
                {
                    //foreach (var message in messages)
                    //{
                    // Fortify SCA : Insecure SSL: Server Identity Verification Disabled
                    client.Send(message);
                    //}

                    client.Disconnect(true);
                    return "";  //成功
                }
                catch (Exception ex)
                {
                    if (ex != null)
                    {
                        return ex.Message.ToString();
                    }
                    else
                    {
                        return "不明錯誤。";
                    }
                }
            }
        }

        #region == public static string GetLocalIPv4() ==
        public static string GetLocalIPv4()
        {
            string localIPv4 = "";
            // 取得本機名稱
            string strHostName = Dns.GetHostName();
            // 取得本機的IpHostEntry類別實體,用這個會提示已過時
            //IPHostEntry iphostentry = Dns.GetHostByName(strHostName);

            // 取得本機的IpHostEntry類別實體,MSDN建議新的用法
            IPHostEntry iphostentry = Dns.GetHostEntry(strHostName);

            // 取得所有 IP 位址
            foreach (IPAddress ipaddress in iphostentry.AddressList)
            {
                // 只取得IP V4的Address
                if (ipaddress.AddressFamily == System.Net.Sockets.AddressFamily.InterNetwork)
                {
                    if (ipaddress.ToString().Substring(0, 3) != "192")
                        localIPv4 = ipaddress.ToString();
                }
            }
            return localIPv4;
        }
        #endregion
    }
}


Default.aspx

<%@ Page Language="C#" AutoEventWireup="true" 
    CodeBehind="Default.aspx.cs" Inherits="WebApplication1.Default" %>

<!DOCTYPE html>

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
    <title></title>
</head>
<body>
    <form id="form1" runat="server">
        Signed Email Test<br />
        <asp:FileUpload ID="FileUpload1" runat="server" AllowMultiple="true" /><br />
        <asp:Button ID="Button_SendMail" runat="server" 
            Text="Send" OnClick="Button_SendMail_Click" /><br />
        <asp:Label ID="Label1" runat="server"></asp:Label>
    </form>
</body>
</html>

Default.aspx.cs

using System;

namespace WebApplication1
{
    public partial class Default : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {

        }
        protected void Button_SendMail_Click(object sender, EventArgs e)
        {
            Label1.Text = "";
            string sendMailResult = CommonMailKit.SendNoCertAndCertMailAttachListbyMailKit
                ("主旨-附件測試", "內容",
                "user123@abcdef.com.tw","","", FileUpload1);
            if (sendMailResult == "")
            {
                Label1.ForeColor = System.Drawing.Color.Green;
                Label1.Text = DateTime.Now.ToString()+ "成功。";
            }
            else
            {
                Label1.ForeColor = System.Drawing.Color.Red;
                Label1.Text = DateTime.Now.ToString() + sendMailResult;
            }
            //----------
            string sendMailResult2 = CommonMailKit.SendNoCertAndCertMailAttachListbyMailKit
                ("主旨-附件測試", "內容",
                ""user123@abcdef.com.tw", "", "", null);
if (sendMailResult2 == "") { Label1.ForeColor = System.Drawing.Color.Green; Label1.Text = DateTime.Now.ToString() + "成功。"; } else { Label1.ForeColor = System.Drawing.Color.Red; Label1.Text = DateTime.Now.ToString() + sendMailResult2; } } } }


(完)

相關

[研究][ASP.NET]加簽寄信-值不能為 null。參數名稱: findValue

mimekit - 在MimeKit上,簽名和加密
http://hant.ask.helplib.com/mimekit/post_4274560

MailKit Documentation - Creating messages
http://www.mimekit.net/docs/html/Creating-Messages.htm
有簡單寄信範例 (但沒有加簽)

MailKit Documentation - Digitally Signing Messages using S/MIME
http://www.mimekit.net/docs/html/Working-With-SMime.htm#Sign

.NET Framework 中過時的類型
https://docs.microsoft.com/zh-tw/dotnet/framework/whats-new/obsolete-types
System.Web.Mail.SmtpMail 過時,建議的替代做法是 System.Net.Mail.SmtpClient。

System.Net.Mail.SmtpClient
https://docs.microsoft.com/zh-tw/dotnet/api/system.net.mail.smtpclient?view=netframework-4.8
System.Net.Mail.SmtpClient 淘汰,建議改用 https://github.com/jstedfast/MailKit 和 https://github.com/jstedfast/MimeKit

GitHub - jstedfast/MailKit: A cross-platform .NET library for IMAP, POP3, and SMTP.
https://github.com/jstedfast/MailKit

GitHub - jstedfast/MimeKit: A .NET MIME creation and parser library with support for S/MIME, PGP, DKIM, TNEF and Unix mbox spools.
https://github.com/jstedfast/MimeKit

[研究][C#][ASP.NET] 加簽寄信 (使用 System.Net.Mail.MailMessage)
https://shaurong.blogspot.com/2019/10/caspnet-systemnetmailmailmessage.html

[研究][C#]加密加簽寄信(使用Cpi.Net.SecureMail)(一)
http://shaurong.blogspot.com/2017/02/ccpinetsecuremail.html

[研究][C#]加密加簽寄信(使用Cpi.Net.SecureMail)(二)
http://shaurong.blogspot.com/2017/02/ccpinetsecuremail_13.html

[研究][C#][ASP.NET] IIS SMTP 寄信失敗,拒絕存取路徑
https://shaurong.blogspot.com/2019/10/caspnet-iis-smtp.html

[研究] [ASP.NET] [C#] [WebForm] 寄信問題
http://shaurong.blogspot.com/2017/06/aspnet-c-webform.html

An S/MIME Library for Sending Signed and Encrypted E-mail
Pete Everett, 15 Jul 2010
https://www.codeproject.com/Articles/41727/An-S-MIME-Library-for-Sending-Signed-and-Encrypted

ASP.NET寄發加密加簽信件
https://www.nccst.nat.gov.tw/ArticlesDetail?lang=zh&seq=1160

Cpi.Net.SecureMail
https://www.codeproject.com/script/Content/ViewAssociatedFile.aspx?rzp=%2FKB%2Fsecurity%2FCPI_NET_SecureMail%2F%2FCpi.Net.SecureMail_src.zip&zep=Cpi.Net.SecureMail_src%2FCpi.Net.SecureMail%2FSecureMailMessage.cs&obid=41727&obtid=2&ovid=5

如何透過 .NET 送出一個包含 S/MIME 簽章的郵件
2009/06/06 21:20
https://blog.miniasp.com/post/2009/06/06/How-to-send-s-mime-email-using-net

2023年1月14日 星期六

[研究]Notebook 筆電(NB) LINE 聽得到對方講話,對方聽不到我講話

[研究]Notebook 筆電(NB) LINE 聽得到對方講話,對方聽不到我講話

2023-01-04

環境:Notebook  (PC 應該也相同)

點選「開始」按鈕,選「設定」,輸入「音效」




最後測試發現,把輸入的「麥克風 (USB PnP Audio Device)」改成「麥克風排列 (適用於數位麥克風的 Intel(R) 智慧型音效技術」後,就正常了。

敝人用 FOXXRAY 炫藍響狐USB電競耳機麥克風、耳麥(FXR-SAU-19),官方網站目前只有驅動程式網頁還看得到此型號,產品那邊沒了。

[研究]Android 9 手機LINE沒響

[研究]Android 9 手機LINE沒響

2023-01-04

環境:ASUS_X017DA (ASUS ZenFone 5Q ZC600KL)  Android 9

電力在一般模式,不會自動斷網。

找人一起測試檢查發現,似乎因為手機在休眠狀態 (預設2分鐘休眠),所以別人撥打 LINE 電話給我,手機沒響。


(下圖)準備關閉休眠









發現F5 Access禁止我關閉休眠,把 F5 Access 關閉,結果是「不允許此操作」;再次檢視F5 Access狀態,「停用這個裝置管理員應用程式」已經變成「啟用這個裝置管理員應用程式」,所以F5 Access確實已經關閉;後來又再去檢視「休眠」畫面,有「永遠不要」可選。


但雖然設定「永遠不要」,結果手機仍是一會兒就螢幕變淡,又一會畫面就關了。

不管如何,基本上就是不要用「省電模式」,避免網路斷了 ( LINE 走網路);手機不要休眠。

( 以上是敝人狀況,供參考;手機 LINE 沒響也有可能其他因素,例如 LINE 麥克風關閉了,或其他)

(完)




2023年1月10日 星期二

[研究]SQL Server 2022 Standard Edition 繁體中文標準版最小安裝

[研究]SQL Server 2022 Standard Edition 繁體中文標準版最小安裝

2023-01-10






















(完)