Anping English

從 Thinfinity 移轉

你的程式照樣送同一個請求(/ws/oturl/get),也拿到同樣的回應。只有伺服器網址要改;其他都在 Anping 伺服器上設定。

不變的部分

不變說明
路徑/ws/oturl/get,值放在網址裡(GET)。
選項每個選項的名稱、型別和預設值(差異)。
回應/oturl.html?key=..&pass=..,由你的程式接在伺服器網址後面。
模式指定 model;model 加上你自己的選項(overrideDefaults=true);或不用 model。

要改的部分

項目改用 Anping
伺服器網址Anping 的網址,例如 https://anping.example.com。
API 金鑰Oturl:ApiKeys 其中一把:新的金鑰,或者只想改網址時,用你現在送的那個值。
model你的程式指定的每個 Access Profile,都變成 Anping 裡的一組電腦設定。它的 Id 就是那個 model 值,設定放在 Targets:N:Oturl:<參數>。
請求裡的 computer你的程式只能指定 Oturl:AllowedComputers 列出的電腦。
放進你的網頁把你網站的網址加進 Oturl:FrameAncestors。
公開名稱檢查把你的公開名稱加進 AllowedHosts。
電腦的憑證會先檢查你的登入(NLA),每台電腦也必須用受信任或已釘選的憑證證明自己的身分。Windows 自己產生的憑證需要釘選(下方)。
正式環境檢查用開發用的金鑰、少於 32 字元的金鑰、測試頁面,或缺少負載平衡器的設定時,Anping 不會啟動(設定)。

設定一個 model

假設你的程式送 model=sales-desktop,那個設定檔用固定大小開啟一個單一程式視窗(RemoteApp)。在 Anping 伺服器上這樣寫:

Targets__0__Id=sales-desktop
Targets__0__Name=Sales
Targets__0__Host=sales-rdp.corp.example
Targets__0__Port=3389
Targets__0__Domain=CORP
Targets__0__Username=sales-app
Targets__0__Password=<from your secret store>
Targets__0__Oturl__startprg=2
Targets__0__Oturl__command=||SalesApp
Targets__0__Oturl__resolution=fixed
Targets__0__Oturl__width=1280
Targets__0__Oturl__height=800
Targets__0__Oturl__clipboard=false

不設 Username 和 Password,連結頁面就會請每位使用者輸入;也可以由你的程式送出。設定值有錯時,Anping 啟動時會寫在記錄裡。

不是參數的設定,以及 Thinfinity 的名稱

Access Profile 對應到 model

你的 Access Profile 裡的在 Anping 放在哪裡(名稱跟連結的選項一樣)
設定檔金鑰(model)Targets:N:Id,同一個值,大小寫也要相同。
名稱Targets:N:Name,顯示在工具列。
電腦、連接埠Targets:N:Host、Targets:N:Port。
儲存的使用者名稱和密碼Targets:N:Username、Password、Domain;不設的話,連結頁面會詢問。
安全性、提早檢查登入(NLA)、憑證Targets:N:Security(預設 nla)、Targets:N:CertFingerprints;Targets:N:Oturl:disablenla。
顯示Targets:N:Oturl:resolution、width、height、bpp、imagequality。
體驗Targets:N:Oturl:desktopbackground、visualstyles、menuwindowanimation、fontsmoothing、showwindowcontent、desktopcomposition。
程式Targets:N:Oturl:startprg、command、cmdargs、directory。
更多會啟動程式的 model 會保留它的程式,即使 overrideDefaults=true 也一樣;要 Thinfinity 的行為,請設定 Targets:N:AllowProgramOverride。
鍵盤Targets:N:Oturl:unicodekeyboard、keyboardlayout;這次連線用的配置:Targets:N:KeyboardLayout。
主控台、壓縮Targets:N:Oturl:console、wscompression。
虛擬機器(Hyper-V)、伺服器群(RD 連線代理)Targets:N:Oturl:desttype、destinfo。
共用資料夾、剪貼簿、聲音、印表機Targets:N:Oturl:diskenabled、diskname、diskautodownload、clipboard、soundenabled、soundquality、printer*。
更多要只開一個方向或禁止某個功能:AllowUpload、AllowDownload、AllowCopy、AllowPaste、AllowAudio、AllowPrinting。列印預設關閉(Guacd:Printing,見下方)。
影像壓縮(H.264)、錄影、集區、負載平衡、權限沒有對應:移轉時直接丟掉,不會出現錯誤。誰能拿到連結由你的程式決定。
更多連線錄影、多台電腦的集區或負載平衡,以及權限(哪些使用者或群組可以用這個設定檔)。連線就是在沒有它們的情況下執行。

Targets:N:Oturl 底下不是連結選項的名稱,Anping 會忽略,並在啟動時發出警告。

參數對應

每個選項在請求和 model 的 Oturl 設定裡都用同樣的名稱。每個選項做什麼、支援到什麼程度:參數表。Anping 另外支援 format=json 和 POST。

已知差異

主題Anping 哪裡不一樣
色彩深度預設 32 位元色彩(Thinfinity:16)。要 16 就設 Targets__N__Oturl__bpp=16。
技術細節沒給 bpp 時是 32 位元色彩,搭配 RDP 圖形管線。在 model 設 16,或送 bpp=16 並加上 overrideDefaults=true:只給 model 時,請求裡的連線參數會被忽略。
model必須跟 model 的 Id 完全一樣,大小寫也要相同。選項名稱不分大小寫。
imagequality2 和 3 的效果跟 1 一樣。
directory只用在單一程式視窗(RemoteApp,startprg=2)。
unicodekeyboard遠端用 model 的鍵盤配置時,打出來的字才會正確。
diskname、diskautodownload共用資料夾預設叫 Anping。存好的檔案關閉後會自己下載到瀏覽器;還沒在 Windows 上確認過。
技術細節Anping 伺服器跑在 Linux 上時是共用資料夾任何地方的檔案,否則只有共用資料夾的 Download 資料夾。超過 Files:MaxUploadBytes 的檔案留在共用資料夾裡。
printerenabled列印預設關閉:連結照樣能開,只是沒有印表機,試跑會說明原因。要開啟(Guacd:Printing)需要有 Ghostscript 的桌面引擎,而 Ghostscript 是 AGPL-3 授權,或要向 Artifex 買商業授權。
printersetasdefault=false、printerdriver桌面引擎(Apache Guacamole 1.6.0 的 guacd)做不到。
聲音任何能從網頁播放聲音(Web Audio)的瀏覽器都可以,從第一次點擊或按鍵後開始。
重新整理、斷線同一個瀏覽器:斷線後 10 分鐘內,網路斷掉時自動重試 60 秒。其他瀏覽器:已使用的訊息。
連線數每個連結一條連線;同一個瀏覽器的新連線會立刻接手。
錯誤純文字回應:一個錯誤代碼(HTTP 狀態碼)和簡短原因(錯誤)。
時區、電腦名稱、觸控連結沒有這些選項;請在每個 model 設定(TimeZone、ClientName、Touch)。
技術細節預設每次連線都用瀏覽器的時區(需要一項 Windows 原則,Windows 電腦)、用戶端名稱 Anping- 加上連結 id 的 8 個字元,觸控當成滑鼠。
連線時間限制沒有輸入 60 分鐘、開始後 720 分鐘;End 讓連結永久失效(效期)。
更多Sessions:IdleTimeoutMinutes 和 Sessions:MaxDurationMinutes;設成 0 就關閉該項限制。
重新啟動忘記所有連結並結束所有連線;使用者需要新的連結。
更多不論用過與否。頁面會說服務重新啟動了,需要新的連結。
model 的上限model 的上限(Allow 設定)和它的程式,就算 overrideDefaults=true 也改不了。
技術細節Allow 設定是請求不能超過的上限;會啟動程式的 model 會保留它的程式,除非設了 AllowProgramOverride(Thinfinity 讓請求可以改)。
密碼錯誤每個連結和每個網路都有次數限制(登入次數限制)。
憑證會先檢查你的登入(NLA),電腦也需要受信任或已釘選的憑證(下方)。
多台 Anping 伺服器連結只能在產生它的 Anping 伺服器上開啟(部署)。
還沒測過虛擬機器(Hyper-V)、伺服器群(RD 連線代理、RD 工作階段主機)、實際伺服器上的單一程式視窗(RemoteApp),以及 Server 2025 以外的 Windows。
技術細節Hyper-V 是 desttype=VMID,RD 連線代理是 desttype=RDS。還有:美式英文以外的鍵盤配置;Windows 上的時區、用戶端名稱和原生觸控;正式發行的 Safari 和 Firefox(自動測試用的是它們的引擎),以及在 Firefox 和 Safari 裡重新整理內嵌的頁面。

電腦的憑證

憑證是 Windows 電腦證明自己身分的方式。沒有這個檢查,中間的人就能假冒那台電腦,拿走使用者輸入的密碼。所以 Windows 自己產生的憑證會被拒絕,直到你對每台電腦做下面其中一件事:

做法怎麼做
1 釘選在 Anping 伺服器執行的地方讀出它的指紋(SHA-256):dotnet Gateway.dll rdp-fingerprint host[:port]。到那台電腦上核對,再設定 Targets__N__CertFingerprints__0=sha256:..。
技術細節開發環境用 scripts/rdp-fingerprint.sh host[:port]。連結指定的電腦:Oturl__ComputerSettings__N__Computer=<host> 和 Oturl__ComputerSettings__N__CertFingerprints__0=sha256:..。Windows 的自簽憑證到期時會自己換新(工具會印出日期):在那之前加上新的指紋,舊的留到沒有電腦再出示它為止。
2 或給它一張憑證名稱跟 Host(或 computer)一致,由桌面引擎信任的憑證授權單位(CA)簽發。
技術細節企業(Active Directory)的憑證授權單位要加進那個映像檔,這會隨 Anping 自己的引擎映像檔推出;在那之前請用釘選。

用真實的請求試跑

切換之前,把你的程式送給 Thinfinity 的請求重播一次。/ws/oturl/check 會告訴你 /ws/oturl/get 會怎麼處理,但不產生連結(試跑)。

ANPING_API_KEY=... node scripts/oturl-replay.mjs --gateway https://anping.example.com requests.txt
步驟重播工具做什麼
讀取一行一個請求:含 /ws/oturl/get?... 的網址或路徑、含這種網址的記錄行、? 後面那一段,或 POST <form body>。
更多空行和 # 註解會略過。
保護機密拿掉檔案裡的 API 金鑰,遮住密碼和使用者名稱,把你的金鑰(ANPING_API_KEY)放在請求內容裡送出(POST),而且從不印出它讀到的內容。
印出每個請求一列,最後是整個檔案的統計。
更多每一列:接受或拒絕、模式、model、第一個問題。再統計整個檔案的所有問題、沒有作用的參數,以及和 Thinfinity 不一樣的地方。--json 會印出每個回應。
接著修好被拒絕的部分(在你的程式或 model 裡),看過其他提醒,再切換網址。

並行和回退

上線順序:在 Thinfinity 旁邊架好 Anping,用真實請求試跑,先給試用群組,保留 GET 改主機名稱,Thinfinity 不再當退路之後改用 POST。 Thinfinity 繼續運作:退回只要把主機名稱改回去 架好 Anping 在 Thinfinity 旁邊 1 試跑 用你真實的請求 2 試用群組 一個 model、少數使用者 3 改主機名稱 保留 GET 4 切換之後 改用 POST 5 主機名稱和 API 金鑰放在設定裡,所以每次切換都只是改設定。 上線順序:在 Thinfinity 旁邊架好 Anping,用真實請求試跑,先給試用群組,保留 GET 改主機名稱,Thinfinity 不再當退路之後改用 POST。 Thinfinity 繼續運作:退回只要把主機名稱改回去 架好 Anping 在 Thinfinity 旁邊 1 試跑 用你真實的請求 2 試用群組 一個 model、少數使用者 3 改主機名稱 保留 GET 4 切換之後 改用 POST 5 主機名稱和 API 金鑰放在設定裡, 所以每次切換都只是改設定。
第 1 到 4 步,Thinfinity 都還是退路。

要退回,就把網址改回 Thinfinity。已經發出的連結只能在產生它的伺服器上打開,並在 expires 分鐘後失效;進行中的 Anping 連線會持續到使用者斷線。

逐步說明
  1. 在旁邊架設 Anping 時,讓 Thinfinity 照常運作、不做任何變更。
  2. 把主機名稱和 API 金鑰放進你程式的設定。
  3. 用試跑重播幾天份的請求,修好它回報的問題。
  4. 只要 Thinfinity 還是退路,就繼續用 GET(值放在網址裡):兩邊接受同樣的請求。
  5. 先移一個試用群組(一個 model,或少數使用者),用下面的測試跟他們一起驗證。
  6. 切換完成後改用 POST(只有 Anping 支援):API 金鑰不會出現在網址和記錄裡。

檢查清單

部署 7
Anping 伺服器設定 5
你的程式 4
測試 6