2020-05-28

2020-05-22

取得 AD 中 Windows Server 作業系統的 Computer Account 與 IP 位置

取得 AD 中 Windows Server 作業系統的 Computer Account 與 IP 位置

(Get-ADComputer -Filter {OperatingSystem -Like "Windows Server*"} -Property Name,OperatingSystem,OperatingSystemServicePack) | ForEach-Object {
try{
$DNS = Resolve-DnsName -Name $_.Name -ErrorAction Stop
} Catch{
}
write-host ('"' + $_.Name + '","' + $_.OperatingSystem + '","' + $_.OperatingSystemServicePack + '","' + $DNS.IPAddress + '"')
};

清除 UNC Path 的 Credential Cache

有時候我們用 \\ComputerName 的方式去連 Share Folder 並敲入帳號密碼
雖然並沒有勾選記住我的認證,這組驗證還是會被 Cache 起來方便後續連線

但常常遇到必須更改連線認證的情況,又沒有辦法從圖形介面去刪除 Cache
此時只需要以下指令:

net use * /delete


2020-05-21

自動關閉咬住 User Profile Disk (UPD) 的 Pooled VM 並還原檢查點

有時候會遇到 RDCB Database 與實際連線 (Pooled VM 配發) 不同的情況
比如 User 連上 PooledVM-001,User Profile Disk 也 mount 上了 PooledVM-001
但 RDCB DB 的 rds.session Table 卻因故沒有這筆 Record (目前不確定為什麼會這樣)
則 User 在下一次連線的時候 RDCB 可能會分配給他另一台 Pooled VM 比如 PooledVM-002
而因為 User 的 PRofile Disk 已經 mount 在 PooledVM-001 (Open File)
所以這次 User 進入 PooledVM-002 的時候就無法再掛上他的 Profile Disk

這個時候 User 已經登入的 PooledVM-002 會跟他說【無法登入你的帳號】
事實上只是 Profile Disk 無法 mount 而已
但 User 只會跟你說不能用、連不上這種令你無法理解問題是什麼的說詞
真心認為微軟應該要寫說: 請告訴你的系統管理員找不到你的 Profile
而不是只叫 User 去找系統管理員而已



為了自動解決這個問題,又要寫個自動檢查的程式來處理了
以下 PowerShell Script 要在存放 User Profile Disk 的 Server 上跑

  • 程式先檢查目前被 Open 的 Profile Disk .vhdx 檔案,根據檔名取出 User SID
  • 再與目前連線中的 RDSession 比對
  • 有連線、User Profile Disk File 也有被 Open 的就略過
  • 沒連線,但 User Profile Disk File 卻被 Open 的就進行處理
  • 找出目標 VM Host、找出 User Profile Disk 是被 mount 在哪一台 VM 上
  • 針對那台 VM 進行關機、還原的指令 (需要用到 Invoke-Command 遠端命令)

  • Updated: 2020.05.26
    • 找到 Locked User Profile Disk 後等待一分鐘再查一次兩次都查到相同記錄才進行 Unlock
      避免第一次查的時候遇到 User 正在連線中的問題

2020-05-19

使用 PowerShell 自動佈署基於 Let's Encrypt 公開憑證的 Microsoft RDS (VDI/RemoteApp) 環境


使用 Win-ACME 來更新憑證

以下 Script 基於僅有兩台 RDWeb/Gateway 色合一的 FrontEnd Server
僅做到將憑證更新完畢匯入系統,派送新的 RDCB 憑證指紋 (Thumbprints) 參考這篇文章

環境預設禁止 RDWeb/Gateway 主機主動對 Internet 連線
也禁止 Internet 對 RDWeb/Gateway 的 TCP Port 80 連線
因此開始 Renew 之前會先打開防火牆,此外也會先更新 TrustedRootCA

由於此例將 RDWeb、RDGateway、RDCB 全部都用公開憑證
所以必須要將 RDCB HA URL 的 Internet IP 也指到 RDWeb / RDGateway 這台上讓外網連線
實際上 RDCB 不需要對外,所以外網 DNS 對應哪個 IP 沒差
  • 2020.06.10 Updated
    • Script 最後將憑證指紋寫入 Thumbprint.txt 檔存放在 RDWeb 的 wwwroot
      這樣就可以另外寫一隻 Script 以 http get 的方式抓取 寫入 GPO
    • 另外,為了彌補 GPO 更新的時間差
      在憑證即將到期的 15 日內,且為周六或周日
      才執行 RDS 系統更新憑證的指令

# -----------------
# Configuration

$WACSPath = "C:\Cert\"

$WACSEXEFileName = "wacs.exe"
$PFXPath = ($WACSPath + "Cert\")
$RDWebGWURL = "Contoso.com"
$RDCBHAURL = "RDCB.Contoso.com"
$DefaultActivedRDCBMaster = "RDCB-01.Contoso.com"
$TrustedRootCAPath = ($WACSPath + "TrustedRootCA\")
$TrustedRootCAFile = "roots.sst"
$BlockIPs = @("1.0.0.0-9.255.255.255", "11.0.0.0-172.15.255.255", "172.33.0.0-192.167.255.255", "192.169.0.0-255.255.255.255")

2020-05-15

Manual Update Trusted Root CA 手動更新信任的根憑證

有些時候我們有些封閉的機器不讓他連網也不給他跑 Windows Update
但他又會跟一些非封閉的機器溝通,可能導致憑證不信任的問題

此時可以用可連網的機器下指令取得 Trusted Root CA 資料並存成一個檔案
再丟給封閉機器去匯入

指令很簡單:

非封閉可連網機器下指令
certutil.exe –generateSSTFromWU "C:\Cert\TrustedRootCA\roots.sst"

將上述指令取得的 C:\Cert\TrustedRootCA\roots.sst 檔案複製到封閉不可連網機器中
再以 Powershell 執行:
(Get-ChildItem -Path C:\Cert\TrustedRootCA\roots.sst) | Import-Certificate -CertStoreLocation Cert:\LocalMachine\Root

2020-05-14

用 Powershell 取得含 Private Key 有密碼憑證的指紋資訊 (或其他資訊)

幾種方式:

第一種 (Password 明碼)


Set-StrictMode -Version Latest

[string] $strPW  = 'password'
[string] $strPFX = 'C:\Cert\www.contoso.com.pfx'
$cert = New-Object System.Security.Cryptography.X509Certificates.X509Certificate2
$cert.Import($strPFX,$strPW,[System.Security.Cryptography.X509Certificates.X509KeyStorageFlags]"DefaultKeySet")

$cert.Thumbprint

只為了 Let's Encrypy 更新憑證而開放的 TCP Port 80 全自動開關 PowerShell

Let's Encrypt 表示才不會公佈我們會用哪些 IP 來對使用者進行驗證咧! 不然我們會被攻擊!
所以我們必須要自己開關 TCP Port 80,無法針對不特定驗證來源 IP 設定白名單
以下設定僅阻擋來自 Public IP 的請求,Pirvate IP 是允許連線的


2020-05-13

Exchange 採用 Let's Encrypt 驗證時遇到 Multi CAS Role NLB 問題的處理

Exchange 扮演 CAS 腳色的機器一般都裝有兩台以上做 NLB 或 Round Robin
此時若在某一台 CAS 進行 Let's Encrypt Renew 的時候會遇到問題:

  • 建立了 .well-know 資料夾與驗證檔案
  • Let's Encrypt 來查詢卻問到別台 CAS
  • 別台 CAS 上面當然沒有 .well-know 資料夾與驗證檔案
  • 於是驗證失敗

為了解決這個問題,用了一些投機取巧、土炮的辦法
也許有更為正確的辦法,但目前沒想到或沒學到,所以就這樣做了,反正也行得通
原理很簡單,就是在開始 renew 之前先開始一個周期性的 robocopy /mir 同步每一台 CAS

採用的 Let's Encrypt ACMEv2 client 
https://www.win-acme.com/

以下是 Batch File 與 PowerShell Script

Updated: 2021.01.26
因應 Let's Encrypt 變更憑證發行單位名稱,增加變更 TLSCertificateName 的部份
Updated: 2021.07.09
如果有 Multi-Domain 且跟 Exchange Online 做 Hybrid,需要確認只有單一 TLSCertificateName
故將 TLSCertificateName 更新的部份加個參數做個判斷式,自己設定 True or False

2020-05-12

修正 Network Location Public / Private / Domain 的問題

經常發生 Domain Computer / Server 開機完畢後 Network Location 是 Public 造成 Firewall Profile 影響到連線的問題
因此寫了一個簡單的 Powershell Script 放在 GPO 讓電腦開機就去檢查一遍並進行修正
原理很簡單,先用 Get-NetConnectionProfile 查出目前的網路 Profile 是不是 Domain
如果不是 Domain 就 Restart Network Awareness Locaion 這個 Service

2020-05-08

Remote Desktop Web Service - Force to use RDGateway on [Connect to a Remote PC]

剛裝好的 Remote Desktop Service 雖然在 Deployment Properties 中 的 Gateway 項目
將 [Bypass RD Gatewat server for local addresses] 取消勾選
但如果在 Remote Desktop Web 頁面中選 [Connect to a Remote PC] 功能時
並不會使用 Remote Desktop Gateway,而是直接連線
要強制所有連線都採用 Remote Desktop Gateway 的話
需要在 IIS 中設定 .rdp 的預設值:

2020-05-06

Windows Server Manager - Remote Server response packet size exceeds the maximum envelope size

昨天將一台 Windows Server 2012 R2 原地升級 (in-place upgrade) 到 Windows Server 2019 後,在管理用 VM 的 Server Manager 中該主機的連線狀態出現了以下錯誤

Data retrieval failures occurred

Refresh failed:

Notification:
Configuration refresh failed with the following error: The WS-Management service cannot process the request. The computed response packet size exceeds the maximum envelope size that is allowed (512000).



解決方法很簡單: