[VBA] 替巨集簽署數位憑證方便存取


最近在論壇看到一堆問 Excel 巨集無法被信任問題。

對使用者自己來說,巨集可能很好用,所以希望隨心所欲的使用,對作業系統的安全性來說,巨集就可能潛藏外部危害,中毒就怪微軟。所以微軟一直在調整巨集安全性,降低中毒潛在風險,提高作業系統安全,但對使用者來說,就是越來越難用。

很多範例是走信任路徑,我個人是反對走信任路徑,比如說公司伺服器的路徑被同仁信任了,如果這個路徑被塞入惡意巨集時,因為路徑被信任,就會無法防護。

我個人是偏向開發人員應該替巨集簽署數位簽名。

這個議題在過去本網誌也多所提及,不過隨著 Office 版本更新,舊版本可能對使用者要做觀念轉換,本篇用 Office 2019 的 Excel 為範例說明。

數位憑證來源很多,可以用買的,可以用自然人憑證 (請搜尋本網誌先前說明),當然也可以用免費的,本篇是以 Office 免費的憑證為範例,所以這是 Office 預設功能,不是為了解決問題,創造更多問題。

Office 2019 x64 的免費憑證產生器在下列路徑,如果不確定 Office 版本及位元版本,建議用檔案總管搜尋「selfcert.exe」

selfcert.exe 的路徑

接下來依步驟產生,第一步就是建立憑證名稱,最好取個有識別性的名稱,範例就隨便取了。

建立憑證名稱

一個步驟就可以建立憑證。

憑證建立完成

開啟一個未被信任的巨集檔案,這是在公司內部教育訓練的一個範例檔,使用 FSO 做檔案清單,包含子目錄搜尋,方便同仁建立檔案對照表用。

未被信任的巨集檔案

從 IDE 介面選單 > 工具 > 數位簽名

選單位置

預設是沒簽名的,簽名過的檔案會顯示已簽名的內容。

選擇數位憑證進行簽署

選擇剛剛產生的數位憑證,如果憑證超過一個,點選其他選擇可展開來選其他憑證。

選擇數位憑證進行簽署

簽署完的檔案記得存檔。

顯示已簽署的數位憑證

通常開發過程已經信任了開發中的巨集檔案,所以若要測試憑證是否正確被信任,需要先清除信任,這個功能會清除所有被信任的檔案,所以建議另外準備測試電腦測試,不要在平常工作電腦測試,否則所有曾經被信任過的檔案都需要重新信任。

移除所有信任的巨集檔案

透過 [控制台] > [網際網路選項] > [內容] > [憑證] 可以管理憑證。

如果找不到控制台,先開啟檔案總管,直接在網址列輸入 [控制台] 即可。

憑證管理

Windows 11 的憑證管理畫面如下。

Windows 11 叫出網際網路選項後就能進入憑證管理。

這邊可以看到先前建立的憑證出現在這。

自建免費憑證會出現在個人區

舊版的 Office 可以在開啟帶有數位憑證的巨集將該憑證直接進行信任,新版本的 Office 移除該功能,所以必須把數位憑證匯出後,散佈給使用者匯入,使用者匯入後,凡是經由該憑證簽署的巨集檔案,就直接可以使用,不用再經過確認。

開始匯出憑證

依畫面逐步操作。

Office 的免費憑證沒有私密金鑰

依預設值匯出。

依預設值選擇匯出格式

選擇匯出路徑。

選擇路徑

完成憑證匯出。

完成憑證匯出

匯出成功。

匯出成功

憑證匯出後,就可以散佈給使用者匯入,但開發電腦已有憑證,必須先刪除才能測試使用者端的情境,所以在這邊先刪除,開發者千萬注意,開發電腦請不要刪除憑證,這個憑證匯出後再匯入,不能再被來用來程式碼簽署,所以千萬不要刪除,除非只是打算測試,刪除後必須重新產生新的憑證進行簽名,即使名稱一樣,因為實際隨機金鑰不同,仍然會被視為新憑證,需要重新散佈。

刪除憑證從上面憑證管理畫面進入進行刪除。

開發電腦千萬不能刪除憑證

刪除憑證後,數量比上面的圖片少一項。

已刪除剛建立的免費數位憑證

接下來測試使用者的匯入,一般被散佈的對象直接從這個步驟執行。

從上面憑證管理畫面,選擇受信任的發行者後選擇匯入。

選擇受信任的發行者

憑證匯入逐步執行。

匯入憑證

使用者將收到的憑證檔案存檔後,依路徑選擇進行匯入。

從路徑匯入

確認匯入的位置是 [受信任的發行者]

匯入受信任的發行者

即將完成憑證匯入。

即將完成憑證匯入

憑證匯入成功。

憑證匯入成功

可看到憑證正確匯入,其他的憑證是相關軟體的原廠憑證。

憑證匯入成功

直接開啟剛剛簽署好數位憑證的巨集檔案,可以看到直接進入,無須再信任。

已被信任的巨集檔案

檢查 Excel 信任中心,可看到數位憑證已被信任。這邊需要特別注意,因為是信任憑證,所以是對電腦所有依據憑證授權的都生效力,比如說 Word、PowerPoint 的巨集若是簽署相同的數位憑證,也會直接被信任。

已被加入受信任的發行者

重新被匯入的數位憑證不能被用來簽署程式碼,因此不用擔心散佈憑證會被其他人再利用。

先前產生的免費數位憑證刪除後再匯入就不能再被用來簽署

分別測試不同的位置,看看是否可以被信任。這是透過網路芳鄰 (SMB) 上的路徑 (UNC) 進行測試,可直接被開啟執行。

透過 Nas 存取巨集檔案

透過 OneDrive 同步路徑進行測試,可直接被開啟執行。

OneDrive 同步路徑

透過 OneDrive 網頁進行測試,可直接被開啟執行。

OneDrive 網頁

我 Google 雲端沒裝同步軟體,所以可以當作是一般網頁下載進行測試。

Google 雲端硬碟

一般網頁下載檔案仍受限 Windows 內建功能會被阻擋,可以點選啟用編輯。

預設阻擋來自網路的檔案

選擇解除封鎖後,亦可直接執行巨集檔案。

從檔案總管選擇解除封鎖

我個人比較偏好從數位憑證簽署來讓巨集檔案安全被散佈,若有簽署數位憑證的檔案,必須由開發人員才能存檔,可以確保檔案散佈後不會被修改。

Categories: Office, 技術分享 | 標籤: | 2 則迴響

[IE11] ActiveX 在獨立網頁可正常執行


先前提到

[IE11] 透過設定信任網站簡單讓 IE11 恢復 VBScript 支援

最近有人跟我反應 OWC 網頁無法正常檢視。

OWC 網頁我不確定是何時開始做的,不過依據我在 2002 年已經開始用在正式專案上推定,OWC 網頁至少是 2002 年做的,我開始使用的版本是 Office XP 附隨的 OWC10 。

OWC 網頁的網頁繪圖放在 培基語言 裡面:

如下圖,OWC 版本下方應出現 OWC ActiveX COM 的控制項,但是沒有。

網頁圖表範例的 OWC 無法正確顯示

為了除錯方便,我習慣將目標網頁單獨開窗,直接執行 OWC 的 [網頁圖表範例] :

單獨開窗執行網頁圖表範例

可以看到上圖,可正確執行該網頁,並呼叫版權畫面觀看版本資訊。

初步推論,應該是框架 (frame) 安全性擋掉,不過我沒空去追安全性更新是哪版開始擋。HTML5 建議不要再使用 frame ,改用 iframe ,所以有可能 frame 安全性又被進一步限縮。

如果單獨執行網頁,只需要加入信任網站就可執行:

加入信任網站

加入信任網站後,不用另外加入相容性檢視設定:

相容性檢視設定維持空白

測試無誤後,我順便測兩個網友希望我更新到 HTML5 的網頁,我還沒空更新的:

水文統計線上分析

這個網頁是從水文統計網頁改版,使用 Server 端使用 ASP + VBScript ,Client 端使用 DHTML + VBScript ,所以除了 IE 以外,都不能執行。其中因為 Client 端使用 VBScript ,所以回歸年與設計量無法被其他瀏覽器支援。

正確設定信任的網站後,仍然可以執行,如下圖。這網頁我有承諾有空會改。

水文統計線上分析

線上排版工具

這個工具是當時 BBS 網路文學盛行時,因為 BBS 版面約在一行 80 char,作者習慣使用 76 char 左右 (參數可調整) 時寫的,只有做成 Client 端 DHTML + VBScript ,亦即表示可下載到自己電腦執行。

目前都以網頁瀏覽 BBS 了,所以這個排版工具好像沒啥用,我不知道為什麼還有網友會想用。

線上排版工具

Categories: 工作點滴, 技術分享 | 標籤: | 1 則迴響

[RouterOS] Core Switch 的 VLAN 設定


參考前篇的說明:

[RouterOS] 多網孔的 Bond 設定

這些設備大部分用在無空調的環境,網路架構大概是這樣:

網路架構圖

前篇做 Bond 的就在右上角。

左側有多個分區,呈星狀分布,分布在半徑 3 公里內,採光纖連接,總共約有 1600 個網路設備。

每一區的網路設備中,其中有外商特定設備,設定時須用原廠軟體,採先廣播封包偵測硬體取得的 DHCP 列在軟體界面上後,逐台設定。

因為使用到廣播封包,所以每一區給一個 Class C 作為廣播封包的界線,而各區的監測系統則集中在機房的 CSS326 下。各光纖連接則直接連到 CRS326 上,所以 CRS326 就相當於 Core Switch。

考慮未來維運方便下,各分區的 Switch 採免設定方式,可用任何工業級交換器連接,設定重點僅需考慮 CRS326 這台上。

整個主網域為 10.x.yyy.* ,因為還有後續用途,所以直接用 10 起頭的來作主網域,所有 ID 為方便辨識,一律為 xyyy 編號,所以 10.1.3.* 的 Class C ,我就編成 1003 。

為了方便設定,除第一筆資料用 winbox 介面輸入外,第二筆以後資料,都配合 console 模式,在 Excel 公式組成命令後,直接貼上去來加入,內建設定若不衝突我就保留。

Pool

Pool 是關聯性最少的,先寫。前面說到設備預設為 DHCP ,所以必須開 DHCP Pool 給 Router 分配 IP 池,設備數量是多餘 Pool 的,不過出廠前會先設好,所以 Pool 只需保留給維運人員現場換新機或是插入網路使用,所以沒留很多 IP ,RouterOS 也可以指定一段範圍,不用遮罩計算,不過我覺得這樣比較簡單好記,所以直接用 /29 來限制 IP 範圍。

Pool 設定

Bridge

Bridge 橋接器的基本開設也沒有關聯到其他設定部分,算底層先開設。

Bridge List

VLAN

VLAN ID 同前面所述 ID ,採 xyyy 編碼,反正範圍是 1 ~ 4095 ,夠我用了。

VLAN List

Port

接下來指定每一個網孔對應的 Bridge/VLAN ,因為我採相同的編號方式,閱讀起來會比較容易。

前一篇說過,我把 23/24 孔做成負載平衡 (Bonding0000),可以跑 20G ,所有交換區都在 0000 ,這台有 2 孔 40G 孔,也保留在交換區,另外光纖孔 01 ~ 15 分別對應到 1001 ~ 1015 ,剩下 1000 為機房區域的工作區。

Port List

IP Address

設定每個子網段區間跟對應的 Bridge ,為了方便起見,基本上以 Class C 來切割。

IP Address List

DHCP Server

設定每個 Bridge 對應的 Pool

DHCP Server List

指定每個 DHCP 網段的 Gateway / DNS Server ,大部分指向 Router 服務,減少對外流量。

DHCP Network

Interface

最後指定廣域網路 (WAN) 跟區域網路 (LAN) 的 Interface 。

Interface List

目前相同架構應用在另一個分區有 18 區,約 600 個網路設備的環境下,運作良好,現在挑戰 1600 個網路設備。

Categories: 工作點滴, 技術分享 | 標籤: | 發表留言

[RouterOS] 多網孔的 Bond 設定


一個現場有多台網路設備的案例中,在

Core Switch 使用 MikroTik 的 CRS326-24S+2Q+RM:100M RJ45 x1 / 10G SFP+ x24 / 40G QSFP x2

Edge Switch 使用 MikroTik 的 CSS326-24G-2S+RM :1G RJ45 x24 / 10G SFP+ x2

考慮網路的穩定性,Core Switch 到 Edge Switch 使用兩條光纖跳接線連接,同時使用可讓網速最大到 20G 。

Core Switch 用的是 RouterOS ,Edge Switch 用的是 SwOS ,RouterOS 設定上滿單純的,打開 winbox 設定軟體比較方便,當然有內建 Web winbox ,我喜歡用視窗版的。

新增 Bonding 網孔

在 Interface 點選 Bonding 頁籤,選擇新增,取一個名字。

我習慣後面帶上 VLAN ID 好辨識,ID 0 表示沒 VLAN ,然後到 Bonding 頁籤設定網孔,Slaves 選網孔名,可以多個,我把 Core Switch 23/24 孔接到 Edge Switch 的 SFP+ 1/2 孔。

RouerOS 對於多網孔的 7 種模式都支援,有興趣可以 google bond blance rr 。

設定好就會出現在 Interface 中。

設定好的 Bond

實際上我七種模式都有測試,分別看全速運作的速度跟通訊到一半,把光纖跳接線拔掉,我自己偏好用 blance rr ,因為下游也是同一家設備,可以直接支援,如果下游是不同家設備,可能用 blance alb 比較妥當。

MikroTik 是非常經濟實惠的品牌,可工業用,工作環境溫度超過 60 度,公司是直接聯絡露天賣家的公司安弟進貨,有興趣可以參考。

露天賣場:CRS326-24S+2Q+RM:NT 18,500 / CSS326-24G-2S+RM:NT 5,500 。

Categories: 工作點滴, 技術分享 | 標籤: | 2 則迴響

遠離我的文件與桌面


在使用 Windows ,愛用 D 槽儲存檔案是個好習慣。

這邊不是說男人的 D 槽,而是說你的資料。

先重常見的案例來看,有些人會發現 Windows Update ,或其他更新或大型軟體安裝後,桌面檔案不見了。

原則上軟體安裝或更新不會刪除你的檔案,也通常不會誤刪,但可能發生幾種狀況:

  1. 安裝時間過長,造成硬碟過熱產生不正常存取。
  2. 使用者帳號受損。

Win10 大版本 (半年) 更新特別明顯,有些人安裝完進入 Windows 時,跟新的一樣,桌面跟新使用者一樣。如果你是 IT/Developer ,請立刻檢查目前使用者,通常是暫時使用者。

先冷關機冷他一下,大概 10 分鐘即可,再開機,看是不是能正常載入你原先的使用者,如果正常,就是過熱導致存取異常。

如果不正常,仍是暫時使用者,就是使用者帳號受損。

當登入的是暫時的使用者時,請立刻建立新帳號,改用新帳號登入,不要在暫時使用者下浪費太多時間,因為登出或重新開機時,Windows 都會清除暫時使用者的內容,所以千萬不要把檔案存在暫時使用者的桌面或是相關功能目錄下,例如我的文件。

除暫時使用者會被自動刪除外,檔案通常仍在原先使用者下。

如果你看到你是原先使用者,仍找不到檔案,切到命令提示字元,輸入

SET

看看你目前使用者使用的目錄。

Windows 對於使用者帳號受損時,會這樣處理:

0. 原先使用者的帳號為 NowUser ,放在 C:\Users\NowUser 下。

1. 帳號受損

a. 不能修復,會用 Temp 登入,也就是暫時使用者。

b. 能修復,Windows 會自動修復,建立新帳號資料,放在 C:\Users\NowUser.Windows 下。

c. 再次修復會加數字,我忘了加在哪。

所以舊的檔案要自救,可以從原先的使用者目錄檔案中找到。

當然還有更慘,當不是使用者帳號受損,而是 Windows 受損時,有可能會影響到使用者資料目錄,甚至中毒、格式化、重灌,都有可能會影響到,那麼為什麼不將檔案直接放在 D 碟,為什麼要放在風險高的 桌面、我的文件 之類的?

養成習慣,不要把檔案放在桌面,放在 D 槽,你才不會不明所以的以為檔案被系統刪掉了。

Categories: 工作點滴 | 發表留言

[Hyper-V] 奇怪的網路不通問題


我在 05/03 時,電腦使用預設網路狀態,透過 RJ45 連接線與 Winbox 3.35 直接與 MikroTik 的 CRS326 全光 Router 進行連線與設定。

在 05/06 時,打算設定另一個 CRS326 24 x RJ45 1G 的型號,發現完全無法通訊,先前這設備都是同事設定的,所以問了先前同事經驗,同事分享可能是 UDP 封包,建議我關閉其他網卡、防火牆,只剩 RJ45 那張網卡通訊,還是測不通。

改用 RS-232 透過 Console 線可以正常用終端機模式測通,重設機器後,可以透過 FTP 連線,但無法登入,其他服務都無法測通,甚至用

telnet ip1.ip2.ip3.ip4 port

也只有 ftp 能連線,其他服務都無法連線。

隔壁同事說我手髒髒,把網路線牽給他,他用工業電腦可以直接連線,由隔壁同是更新韌體,還原到初始狀態後,05/07 移交回給我。

我接手後仍然無法測通,這時,只剩我電腦問題了。我想了一下,05/03 我還可以設定全光的路由器,所以先接回 05/03 設定的那台。這時發現,05/03 那台也無法設定了。

最後發現,RJ45 那張網卡綁定的 Hyper-V 虛擬網卡停用,就可以用了。

我查了一下電腦更新紀錄,最後 Windows Update 是 04/15 ,我網卡沒開自動更新驅動程式,電腦在 04/29 後,完全沒有任何安裝新軟體。

總之,不明原因不通,只知道是 Hyper-V 虛擬網卡停用即可。

做個紀錄,看啥時能發現原因。

Categories: 工作點滴, 技術分享 | 發表留言

[資安] 上市櫃公司相關連結參考


這篇是保存最近相關上市櫃公司需要因應政策的連結,不需要的可以跳過。

上個月底,稽核轉券商通知說上市櫃公司要導入相關資安規定了。

這部分我有預期,民國93年政府機關要導入資訊安全長 (資安長),民國103年金融機構開始導入資安長,類推應該是民國113年上市櫃公司要導入資安長,只是稍微提早一點,不過實務上只有超過 100 億或是前 50 大目前這次要導入資安長,其他上市櫃公司只有資安專責主管、人員。

這次主要的發起是金融監督管理委員會 (金管會) 在 公開發行公司建立內部控制制度處理準則 中,新增 9-1 條,自 2021/12/28 起生效:

第 9-1 條

  1. 公開發行公司應配置適當人力資源及設備,進行資訊安全制度之規劃、監控及執行資訊安全管理作業。符合一定條件者,本會得命令指派綜理資訊安全政策推動及資源調度事務之人兼任資訊安全長,及設置資訊安全專責單位、主管及人員。
  2. 前項一定條件,由本會定之。

上述一定條件,金管會在 202/12/23 發布新聞稿:「公開發行公司建立內部控制制度處理準則」第九條之一、第四十七條修正草案已完成預告程序,將於近期發布施行,有規定:

分級標準資安單位暨人力編制實施時程
第一級:
符合下列條件之一者:
資本額100億元以上
前一年底屬臺灣50指數成分公司
藉電子方式媒介商品所有權移轉或提供服務(如電子銷售平台、人力銀行等)收入占最近年度營業收入達80%以上,或占最近二年度營業收入達50%以上者
應設資安長及設置資安專責單位(包含資安專責主管及至少2名資安專責人員)111年底設置完成
第二級:
第一級以外之上市(櫃)公司,最近三年度之稅前純益未有連續虧損,且最近年度財務報告每股淨值未低於面額者。
資安專責主管及至少1名資安專責人員112年底設置完成
第三級
第一級以外上市(櫃)公司,最近3年度稅前純益有連續虧損,或最近年度每股淨值低於面額。
至少1名資安專責人員鼓勵設置
公開發行公司建立內部控制制度處理準則9-1條一定條件

在上述條文公告、發布新聞稿後,台灣證券交易所 (證交所) 也在 2021/12/23 有相關新聞稿公布:協助上市公司強化資安防護及管理,證交所發布「上市上櫃公司資通安全管控指引」

稽核很高興的說,上櫃不歸證交所管,可以先不用理他,我又找到證券櫃檯買賣中心 (櫃買中心) 在 2021/12/23 發布的新聞稿:為協助上櫃公司強化資安防護及管理機制,發布資安管控指引

裡面說到兩個重點:

  1. 配合金管會公告修正「公開發行公司建立內部控制制度處理準則」第九條之一及第四十七條,提升發行公司對資訊安全之重視,與臺灣證券交易所共同制定「上市上櫃公司資通安全管控指引」(下稱資安管控指引),協助上市、上櫃公司強化資通安全防護及管理機制。
  2. 建議上櫃公司宜加入資安情資分享組織,如所屬產業資安資訊分享與分析中心(ISAC)或臺灣電腦網路危機處理暨協調中心(TWCERT/CC)

所以證交所發布「上市上櫃公司資通安全管控指引」還是要參照。

證交所文件下載

A045:上市上櫃公司資通安全管控指引,2021/12/21 (.docx)

ISAC 有分產業,搜尋了一下,能源產業應該是 PE-ISAC ,可以參考:行政院資通安全處「強化國家資安基礎建設計畫」,但目前只聞樓梯響,看不到入口網站。

新聞連結:能源局1,292萬續推PE-ISAC平台,提升基礎設施資安

另一個 TWCERT 則比較簡單:

但問題在於資安專責主管、專責人員的資格要求是甚麼?公司要怎麼配合,目前稽核、財務分別問了券商、會計師,都沒找到相關規定,不過還好我們是第二級,可以先等第一級做完來抄… 不是,來學習。

行政院國家資通安全會報技術服務中心依據資安職能,有設立資安人才培訓服務網,裡面有相關教育訓練、評量(考試) 的報名。111年上半年資安職能訓練 (報名不需會員資格)台南地區只有一場,由崑山科技大學負責,只有 30 個名額,先搶名額,03/02 10:00 開放報名,搶了 40 分鐘網頁才完成報名,是第 28 個,但是 eMail 卻收到好幾封報名成功信件,最早是 10:25 ,不知道是不是重複報名了,另外對象是資通安全管理法納管機關資安專職(責)人員之資安專業知識與技能,不知道非公務機關的上櫃公司在繳報名費時會不會被退貨。

微軟最有價值專家 (MVP) Andy 在金融機構,我向他請教,他表示他們是被要求資安證照 (一人2張),每年要上15小時的資安相關課程的時數,資安證照是依據行政院國家資通安全會報裡有列出相關的資通安全證照才被認可。

110年第2季更新之資通安全專業證照清單

參考上述清單,唯一國內資安證照為經濟部工業局辦的中級資訊安全工程師,中級資訊安全工程師需要先考初級資訊安全工程師,2022年只有辦理兩次初級資訊安全工程師考試、一次中級資訊安全工程師考試。

鑑定項目報名截止考試日期
111年第一次初級資訊安全工程師能力鑑定2022/04/182022/05/28
111年中級資訊安全工程師能力鑑定2022/07/012022/08/13
111年第二次初級資訊安全工程師能力鑑定2022/10/102022/11/19
經濟部工業局資訊安全工程師能力鑑定

換句話說,想要今年拿到中級資訊安全工程師證照,就要參加上半年的資級資訊安全工程師能力鑑定後,放榜立刻報名中級資訊安全工程師能力鑑定。

資安專責人員政府機關是依據 資通安全責任等級分級辦法 ,一般上市櫃公司應該是非公務機關的 C 或 D 級,大前提都是「核定」以後才生效,並無規範未核定之前該怎樣處理。

附表級別單位項目細則內容
C非公務機關資通安全教育訓練資通安全專責人員每人每年至少接受十二小時以上之資通安全專業課程訓練或資通安全職能訓練。
資通安全專責人員以外之資訊人員每人每二年至少接受三小時以上之資通安全專業課程訓練或資通安全職能訓練,且每年接受三小時以上之資通安全通識教育訓練。
一般使用者及主管每人每年接受三小時以上之資通安全通識教育訓練。
資通安全專業證照初次受核定或等級變更後之一年內,至少一名資通安全專責人員持有證照一張以上,並持續維持證照之有效性。
D各機關資通安全教育訓練一般使用者及主管每人每年接受三小時以上之資通安全通識教育訓練。
E各機關資通安全教育訓練一般使用者及主管每人每年接受三小時以上之資通安全通識教育訓練。
資通安全責任等級分級辦法 CDE 非公務機關整理

從資通安全責任等級分級辦法附表六來看,資通安全專責人員參加資安職能訓練12小時以上即可,看起來前面去報名資安職能教育訓練應該是可以,另外看起來每年公司自辦的教育訓練,資安宣導要從2小時延長到3小時比較保險,才會符合規定。

其他相關法規:

Categories: 工作點滴, 新聞與政治 | 標籤: | 2 則迴響

[CLR] .Net framework 2.0 WebClient 連接 https


12 年前工業級設備環境還有 Win2k WorkStation ,當時開發的回傳走 http 是用 .Net framework 2.0 ,2.0 是能安裝在 Windows 2000 或 Windows Me 以前 OS 的最後一個版本,那個年代雖然已經有 https 了,但是用的不多,所以當時回傳資料的程式開發時,就直接這樣用,再於回傳裡面標記檢查資訊。

這周有個客戶希望把資料也扔他們那一份,當初是用節區架構建的,所以在參數檔新增他們的節區即可,這部分是同事處理,連續兩天溝通確認扔不過去,我介入處理後,先調出 log 檔的錯誤訊息。

大概常在網路上讀文章,一看錯誤訊息就推論疑似是 https 問題,檢查網址果然是 https 。

馬上 google 搜尋 WebClient https ,找到黑大的文:

C# 連線 HTTPS 網站發生驗證失敗導致基礎連接已關閉

原則上有兩個解決方向:

  1. 改程式碼,加入 ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12
  2. 改機碼,設定 HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft.NETFramework\v4.0.30319\SchUseStrongCrypto=dword:00000001

改程式碼部分,搜尋 MSDN 查屬性,在 .Net framework 4.0 前只能設定 Ssl3 跟 Tls ,但就是這兩個加密協定被停用。參考下面連結 (從左邊下拉式可改 .Net 版本)

SecurityProtocolType 列舉

所以改試機碼變更,在 .Net framework 2.0 不吃 SchUseStrongCrypto 。

於是再祭出 google 大神搜尋 WebClient https “.Net framework 2.0″ site:support.microsoft.com ,得到:

TLS 系統預設版本包含在.NET Framework 2.0 SP2,Windows Vista SP2 和 Server 2008 SP2 的支援

這邊是說 .Net framework 2.0 SP2 已經加入相關加密協定支援,機碼用:

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft.NETFramework\v2.0.50727\SystemDefaultTlsVersions"=dword:00000001

即可。

我是跑 32 bits Application On Windows 10 IoT x64 ,所以要改用機碼 (Windows 64 On Windows 32):

HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft.NETFramework\v2.0.50727\SystemDefaultTlsVersions"=dword:00000001

一測試就可以通聯,問題解決關案,還不用改程式碼。

另外這個 KB3154517 有寫到,在 SP2 列舉常數 SecurityProtocolType 已經加入 Tls11 / Tls12 的支援,所以也是可以改原始碼的。

不過事情解決了,就懶得改原始碼,把機碼匯出來,直接變成選項載入。

最後,.Net framework 相關文件都建議停用 WebClient ,改用 HttpClient ,作為本篇附註參考。

繼續閱讀
Categories: 工作點滴, 技術分享 | 標籤: | 1 則迴響

[VBA] Office 自動化的必要免費開發手冊


微軟的開發文件不斷的統合,目前最新版的基本上只有線上手冊,放在:

https://docs.microsoft.com/zh-tw/visualstudio/vsto/getting-started-office-development-in-visual-studio

早期的文件中,建議務必取得的是 Office 2003 SP3 內含的附屬文件,從安裝完成檔案抽出來,可以更方便的運用。

早期多數人開發過程中很少按下 F1 瀏覽離線版的線上手冊,更不要說備份下來隨時翻找,我自己當時也沒做,但因為有相容測試需求,有留虛擬機,還好可從虛擬機裡面抽出來。

後續微軟文件大多數改線上版,為了配合線上版,反而短少物件架構圖,有點可惜。

我自己是定時會將新的線上手冊複製下來統合在一個目錄:

備份存放線上手冊的目錄結構

再使用 Windows 內建的快速工具列做超連結,以便隨時查閱:

快速工具列超連結到線上手冊

下面列舉幾個需要它的截圖。

我覺得最重要的功能就是有 Office 所有物件的物件架構圖。這在 Office Automation 開發中非常發便,甚至不限於 VBA/VB6/VBScript 開發,對 .Net framework 下支援 COM 的各語言也非常方便,例如 VBNET/C# 等,對於 C# 來說,還是要呼叫 Office COM 內的方法、屬性、使用事件等,但對於新版的線上手冊來說,沒有物件架構圖很不容易找到對應的需求。

Office 2003 Excel 物件架構圖

中文的線上說明,這部分在新的線上手冊效果遞減,早期線上手冊放在 MSDN 下,幾乎是只有英文說明,當然多數的開發者能閱讀英文說明,但畢竟沒有中文說明更親切。

我比較喜歡當時的次要查詢,例如下圖,點擊多重物件可以跳出 Document 下的各子物件或集合物件,新版的線上手冊都統合到屬性去,找起來比較困難。

Office 2003 Word 子物件 Doument

操作快速。離線式的線上手冊,永遠比在線式的線上手冊快,而且可以在無網際網路情況下開發,特別適合於有管制網路的環境。

例如,Access 附 SQL 語法說明手冊,入門 SQL 語法,這個線上手冊很不錯,雖然不是 ANSI SQL 1992 以後相容語法,但是差異不大。而且也可用來比對 Access / Excel 透過 OLEDB / ODBC 不同語法的差異,這個檔是相容於 OLEDB 的。

Office 2003 Jet/Oledb SQL 語法說明

Office 2003 SP3 是有完整中文線上手冊說明的最後一版,新版的線上手冊就多數是英文手冊了,要看中文版可能要到本篇最前面介紹的網址看。

Office 2019 使用 ADOX 建立空白的 mdb 檔案

例如 Visio 2013 中文版只有英文線上手冊,就沒有物件架構圖,我覺得不好用。

Office 2013 Visio Document 物件說明

新版 Office 仍有少數中文線上手冊,例如部分人愛用的條碼控制項。

Office 2019 內的條碼控制項說明

如果不是使用 VSTO ,除了 Office 內件線上手冊外,Script 5.6 的線上手冊也很重要。

例如有名的物件 FileSystemObject(FSO) 就可以在 VBA 內使用。

Script 5.6 FileSystemObject 的子物件

VB6/VBA/VBScript 對於檔案處理並不友善,例如先前在這篇

[VBA] Excel 安全性調整後,跨檔案所需要的變更

內部教育訓練的案例3 截圖中,需要整理檔案清單給業主,或是資訊循環中,需要整理系統文件的檔案清單給內稽、外稽檢查,那麼這時候使用 Excel VBA 做成一個常用巨集檔,就會很方便的產生檔案清單。

例如用教育訓練的案例3 產生這篇文章線上手冊的檔案清單如下圖。

線上手冊的檔案清單

案例3 呼叫 FSO 的 myDir 。

呼叫 FSO 的片段程式碼

除 FSO 外,也可以在 Script 5.6 找到 JavaScript 的說明跟通用運算式的說明。

VB6/VBA/VBScript 裡面的 Find/Replace 是比較陽春的掃描搜尋方式,而 JavaScript 直接就是使用通用運算式搜尋,無疑效能、彈性提高很多,所以要在 VBA 內使用通用運算式,要參照 Script 5.6 手冊。

Script 5.6 JavaScript 與 VBScript 可用的通用運算式

另外還有一些當年很好用,現在幾乎是廢棄的線上說明。

比如說 OWC 當年是一個很好的 COM 元件,可用在 VB6 / VBA / VBScript / VBNET 中,可用在 ASP/ASP.NET Web 的 Server 端輸出圖形,也可以用在 client 端當 ActiveX 用,簡直百搭,SQL Server 2008 R2 以前內建支援 OWC,但也隨著時代淘汰。

Office 2007 OWC 12 線上手冊

當年還有一個 MODI 元件很有用,可以給 VB6/VBA/VBScript/VBNET 等支援 COM 語言使用,例如將一張掃描的圖片做 OCR 轉成文字,但在 Office 2007 被微軟淘汰,用 OneNote 取代,當年 OneNote 的辨識率還不如 MODI。

Office 2003 MODI 的 VBA 開發手冊

微軟有很多很不錯的離線式的線上手冊,多數人沒看過就消失,對於開發者來說,這都是一些很重要的參考文件,如果需要,不妨在虛擬機上安裝舊版的 Office ,把相關文件備份出來參考。

Categories: Office, 技術分享 | 標籤: | 發表留言

[iOS] 更新 App


話說,12/11 收到 Apple 寄來的信:


Dear [我的英文名],

Your app, [我的 App 名], app Apple ID: [App 代碼], does not follow one or more of the App Store Review Guidelines.

For details, or to contact App Store Review, visit Resolution Center in App Store Connect.

Best regards,
App Store Review


因為看不出來要幹嘛,所以沒理他。

01/20 收到 Apple 更新的信:


Dear [我的英文名],

On September 1, 2016, we announced that we’re implementing an ongoing process of evaluating and removing apps from the App Store that no longer function as intended, don’t follow current review guidelines, or are outdated.

You were asked to submit an updated version of your app, [我的 App 名], app Apple ID: [App 代碼], for review within 30 days. We noticed that either you did not submit an updated version of your app or the updated version of your app was not approved. As a result, your app has been removed from the App Store.

Next Steps

Your app has not been deleted from your account. To make your app available on the App Store, submit an updated version that follows the latest App Store Review Guidelines. Your app will become available on the App Store if the update is approved. If you submitted an update after the 30 day grace period, please allow time for review.

Additional Information

Learn more about changes to the App Store and keeping your apps up-to-date.

App Store Improvements
App Review Resources
Debugging Your Apps

Best regards,
App Store Review


我還真不知道,Apple 上架後,一定時間內要更新,不然就強制下架,這個時間看起來差不多是三年。

我主要是做 HTML5 網頁去適應手機、平板,所以當初 App 只有做 WebView 框架,只要把 WebView 導向到我的 HTML5 網頁即可,所以只需要重新編譯上傳。

MacBook Pro 很久沒開機了,所以 01/21 主要是在更新 MacBook Pro ,01/22 才開始關關難過關關過。

關卡 1 :MacBook Pro 開不了機

大概是太久沒接電,應該是沒電了,插上電源一開始一直開不了機,而且我可能插錯 Type-C 的充電孔,我看到有兩孔,先插上面那孔 (接近軸承),一直沒作用,大概過 10 分鐘發現到還有一孔,換了一孔後再試,就可以正常開機了,但是 MacBook Pro 完全沒有電源指示燈,再一開始根本不知道哪的問題。

關卡 2:更新 Mac OS / XCode / Visual Studio for Mac

先前的經驗就是得先更新,更新時一定要注意 XCode :[iOS] 環境升級後,無法正常編譯 App

更新 Mac OS 純粹就是花時間而已,下載久,更新久,重開機久,沒想到更新 XCode 也久。

等到看向 Visual Studio for Mac 時,已經更新完了,但是我不認識它了。原來三年前是 Visual Studio 2017 for Mac ,更新完後是 Visual Studio 2019 for Mac 。

關卡 3:重新產生憑證

更新完了以後,從方案總管那邊的選項找到可以填寫版號,專案總管那邊預設溝選繼承方案總管版號,改完以後直接重新編譯,但錯誤訊息卻說找不到憑證可以簽名 (已經過期) 。從 [鑰匙圈存取] (Key Chain) 看得到過期的憑證。

所以就照先前文章開新的憑證:[iOS] 建立 App Store 簽名用的憑證給 Visual Studio for Mac 使用

整別人最後的下場就是整自己,Visual Studio 介面上可以直接產生憑證,我當初放在最後一個畫面,所以我自己又跟著我原先的步驟產生了新的 [iOS Distribution] ,中間 Apple 網站有些有更新的,但是不影響產生佈建用的憑證。

看到最後,Visual Studio 那個畫面,我自己都想揍我自己,當初幹嘛耍寶… 我用 Visual Studio 產生佈建用的憑證時,只剩下新的 [Apple Distribution] 可選,查了一下,新增的 [Apple Distribution] 包含 [iOS Distribution] ,可以只產生 [Apple Distribution] ,此外原先 [iOS Distribution] 在帳號理可同時有 2 個,現在變成只能有 1 個,而新增的 [Apple Distribution] 可同時有兩個。

關卡 4:編譯器無法使用新憑證簽名

編譯時跳錯誤:

/Library/Frameworks/Mono.framework/External/xbuild/Xamarin/iOS/Xamarin.iOS.Common.targets(3,3): Error: 無法針對 ‘bin/iPhone/Release/[專案名].app’ 進行程式碼簽署: Warning: unable to build chain to self-signed root for signer “Apple Distribution: 公司名
/Users/support/Projects/[專案名]/[專案名]/bin/iPhone/Release/[專案名].app: errSecInternalComponent

首先想說錯誤訊息有中文,先搜尋了中文相關說明,但是沒有有用的內容。

改用英文錯誤訊息搜尋,參照這篇:Unable to build chain to self-signed root

要求依照官方文件這篇處理:Apple Worldwide Developer Relations Intermediate Certificate Expiration

這篇的意思是說,因為 Apple 有更新相關開發的憑證,我的 MacBook Pro 憑證太舊,我新產生的憑證參照的新憑證不存在,所以不被信任,不可用來簽名。的確,從 [鑰匙圈存取] 看到憑證的狀態是不可信,所以只要照官方文件更新 XCode 即可自動更新憑證,但是我 XCode 已經更新到最新的,怎麼會還是舊的?

參考一位 MVP 的說明:iOS Development 的憑證、簽署識別、佈建設定檔在使用 Xamarin 開發 iOS App 時要如何設定(手動篇I)

從 XCode [Preferences] 新增 開發人員帳號後,點選 [Manage Certificates…] 即可,剛好我 [鑰匙圈存取] 在背景,就看到新增了對應憑證,我的佈建用憑證也變為可信任的,就順利完成編譯。

關卡 5:無法封存以供發行

參考自己先前寫的這篇:[iOS] 上傳 App 到 App Store 供散佈

編譯完成後,經過在不同模擬器跑都正常,就準備封裝以供發行,但跑到上傳前,卻一直跳錯:

unable to vaidate archive

這次只搜尋這個錯誤訊息也找不到有用的訊息,我測試一下,封裝是可以正確產生 [專案名].ipa 的,所以我想是不是 Apple App 設定問題?最後重新輸入我的 [App 專用密碼] 就正常了,沒想到 Visual Studio 自動升級後,記憶的密碼居然是錯的…

我想可能封裝不用檢查發行用的 [App 專用密碼] ,所以可以封裝,但是要上傳 Apple 的 App Store ,會檢查 [App 專用密碼] ,所以無法驗證封裝檔案。

關卡 6:App 版本編號還是舊的

先前說到,我在方案總管、專案總管都有看到可設定版號,我以為是這裡就可以搞定,但是我每次封裝完的 App 都是舊版版號,被拒絕執行下一步,最後在程式碼 [info.plist] 裡面找到版號,更新這邊的版號才有作用。

關卡 7:無法上傳到 App Store

封裝完沒問題後,卻跳出無法上傳到 App Store ,這部份是我自己真的忘了,但我應該知道,我先前也沒紀錄到。

要上傳之前,App Store Connect 那邊要先針對新版號開一個空間,Visual Studio 才能把新版上傳到這個位置,開好就正常了。

Visual Studio 2019 for Mac 不用像 Visual Studio 2017 for Mac ,先產生 [專案名].ipa ,而是直接產生完後就上傳,所以會找不到 [專案名].ipa ,但也方便很多。

關卡 8:要上傳新的螢幕擷圖

回到關卡 7 的網頁,新版本要求要四種版本的畫面擷圖,其中包含 iPhone 6.5 吋跟 iPad Pro 12.9 吋 (第三代) ,起先模擬器我跑 iPhone 13 的,沒想到居然尺寸不對,上 Apple 官方網站查詢以後,改用 iPhone 11 Pro Max ,iPad Pro 12.9 吋就比較單純,模擬器是第五代的,一次搞定。

關卡 9:隱私權聲明

關卡 7 的網頁更新擷圖後,要提交審查,還要求勾選隱私權聲明,就是沒有在 App 裡面蒐集使用者資料。想當然爾,WebView 啥都做不了,勾選了聲明後,終於可以提交審查了。

上架

前次的經驗審查滿久的,這次還算順利,01/22 16:24 完成提交審查,01/23 00:01 開始審查,01/23 08:50 完成審查上架,不過比較奇怪的是先被下架,不知道是不是按錯了,同一分鐘兩種操作。

通過審查重新上架

後記

太久沒用 MacBook Pro 了,我已經忘了擷圖要按哪顆鍵,所以這篇都沒有擷圖可參考…

Categories: 工作點滴, 技術分享 | 標籤: | 發表留言

[RouterOS] 虛擬機試用


這篇最早應該不能算是測試心得,只是最後走到 RouterOS 虛擬機。

2020/07 公司因為業務要經銷資安系統,所以公司也買一套資安系統作為展示與測試的環境。但過了一年,業務決定要放棄,這套資安系統就不續約了,閒置的空主機,在 2021/12 公司決定要導入顧大俠的產品時,就打算安裝在這台閒置主機上。

原先的閒置主機的 OS 是 VMWare ESXi 6.7 (7.0 降級授權) ,當初資安系統虛擬磁碟用了完整佈建 (固定容量大小) ,把閒置主機吃掉近 2 TB 硬碟容量,將近 1/2 實體容量,但虛擬機內實際只吃了 31 GB,而 VMWare ESXi 的相關指令不能縮小這顆虛擬硬碟,所以打算用實體機常用的 ToDo Backup 來做。

由於 VMWare ESXi 實體空間不是很夠,所以分階段降低硬碟容量。

1. 把資安系統的虛擬硬碟做填 0 動作,然後透過磁碟管理盡量縮小容量,縮小後,再找磁碟重整軟體,把後方空間盡量清空,再重作磁碟管理縮小容量,虛擬機關機。

2. 把 Todo Backup 虛擬化開機,然後把資安系統虛擬硬碟掛載到 ToDo Backup ,打算備份到新的虛擬硬碟,沒想到 Todo Backup 免費版不支援空硬碟格式化,挖哩勒…

EaseUS Todo Backup Free 下載點:https://tw.easeus.com/backup-software/todo-backup-free.html

3. 下載 USBoxV6 光碟開機版,裝到 VMWare ESXi ,強制設定永遠從光碟開機,掛載空的虛擬硬碟初始化。

USBoxV6 下載點:https://hsuanthony.pixnet.net/blog/post/225209033

4. 終於 Todo Backup 把新的虛擬硬碟做好,想要備份到檔案伺服器上,才發現 VMWare ESXi 這台在 Server 區,Server 網段不允許 DHCP ,所以 Todo Backup 無法自動取得 IP 連線到檔案伺服器上。

到這邊是我的前提,當然有其他方案可以考慮,我想到我之前還有待辦清單要測試 NTP Server 、Class A、切 16/512/131072 個 IP,所以打算用 RouterOS 虛擬機做橋接,讓 RouterOS 拿 Server 區的固定 IP ,派發虛擬 IP 給 Todo Backup 之類的虛擬機,先用 192.168.0.0/16 來設定,所以在 VMWare ESXi 開了虛擬 Switch192 出來。

RouterOS 虛擬機下載:https://mikrotik.com/download (點選 Cloud Hosted Router 有不同 Host 的虛擬機可下載)

我是掛在 VMWare ESXi ,當然下載 VMDK image 檔,虛擬機配置如下:

項目說明
CPU1 核即可,我配置 2 核
DRAM最好大於 64 MB,我配置 128 MB
HDD選既有的磁碟 (64 MB),配置 IDE (0, 0) ,主要磁碟
網卡 1Server 區的網段
網卡 2vNetwork192
RouterOS 虛擬機配置
啟動配置好的 RouterOS

RouterOS 虛擬機是空機,初始化配置有點複雜,建議對一下既有的硬體配置設定,或是看看相關教材。

網路測通後,Todo Backup 終於能備份到檔案伺服器上,備份完後,我把 Todo 儲存備份檔的虛擬磁碟清空,節省容量。

這又是另一個悲慘的故事,我沒注意到當初資安廠商建立虛擬機時,有用差異快照檔案功能,所以我備份的 vmdk 是建立快照時的空的 Windows ,不含任何資安軟體與 log … 但我已經砍掉了,算了,以後要續約的時候,再請廠商重新安裝。

RouterOS 不同網段測試的部分就不一一列示,我測完 Class A 後,直接把 Class A 的測試檔拿來改,測試切成 16 個 IP 。

快速設定 16 個 IP 網段

IP 計算機可參考:https://www.iptp.net/zh_HK/iptp-tools/ip-calculator/

從 10.1.1.177 切 16 個 IP 範圍是 176 ~ 191 ,前後兩個 IP 不能用,剩下 177 ~ 190 共 14 個 IP 可用,拿 177 做 Gateway ,另外再把 184 ~ 187 共 4 個 IP 設為 DHCP 範圍。

讓 Windows 從 RouterOS 的 DHCP 自動取得 IP :

自動取得 16 個 IP 的網段

RouterOS 的 DHCP 預設會從 IP Pool 最後一個開始分配,滿了以後,會從 Next Pool 開始分配,若都沒有 IP 了,就會分配失敗。所以從 187 自動取得。

RouterOS 的 NTP client 是內建的,NTP Server 是官方外掛套件。

RouterOS 外掛套件下載:https://mikrotik.com/download (虛擬機下載 x86 的 Extra packages)

安裝好 NTP Server

安裝好 NTP Server 會出現在 System 選單中,通常要啟用 NTP Server 時,通常也要啟用 NTP Client ,NTP Client 用來對上游校時,NTP Server 則是給下游校時用。

上游的 NTP Server 很多,例如說 Windows 內建的是 time.windows.com ,但因為是 Windows 內建的,所以幾乎全球的 Windows 都跟它校時,常常連不上。

在台灣可以使用政府標準檢驗局的標準時,由1969年成立的國家時間與頻率標準實驗室發布,是委託給中華電信研究院負責。

國家時間與頻率標準實驗室 網址:https://www.stdtime.gov.tw/

目前國家提供的時間伺服器 (NTP Server) 有:

  • tick.stdtime.gov.tw
  • tock.stdtime.gov.tw
  • time.stdtime.gov.tw
  • clock.stdtime.gov.tw
  • watch.stdtime.gov.tw

既然是國家標準時,自然一堆政府機關、半官方法人、團體等都是對國家標準時校時,所以用戶多,常常碰上連不上 (逾時) 的情況。

既然是中華電信執行,而且公司網路基本上都在中華電信上,所以我一般都跟中華電信校時。

clock.hinet.net (168.95.192.12)

其次是效能不錯的 Google 時間伺服器,早期 Google 分成 4 台時間伺服器,現在用 DNS 做自動平衡,一般使用者用 time.google.com 即可。

別名NTP ServerIPv4IPv6
timetime1216.239.35.02001:4860:4806::
timetime2216.239.35.42001:4860:4806:4::
timetime3216.239.35.82001:4860:4806:8::
timetime4216.239.35.122001:4860:4806:c::
Google 的時間伺服器

所以 RouterOS 對上游校時的主伺服器設定為中華電信,次伺服器設定為 Google 。

Windows 再對 RouterOS 校時即可。

對 RouterOS 校時。

在有 AD 架構下的網域,Windows Client 會自動對 AD Server 校時,另外 Windows Server 可以透過 regedit 修改啟用 NTP Server ,倒不一定要用到這個方案。

我這個方案是要用在現場,現場沒有 Windows Server,而 RouterOS 的硬體都是便宜大碗的工業級設備,支援多 WAN ,多通道的 Site To Site VPN,唯一的缺點就是設定複雜,現場網路設備多需要校時,統一對 RouterOS 校時最好,把校時流量關在 LAN 裡面,只有 RouterOS 走 WAN 去校時。

Categories: 工作點滴, 技術分享 | 標籤: | 發表留言

[RouterOS] 啟用 PPTP Server


RouterOS 因為價美物廉,一直被我拿來用在現場。大部分的網路硬體環境溫度都超過 65 度,基本上是免空調,網孔在 2012 年就是 Gb 級,功能強悍。

現場有需要建立 Site To Site 的 VPN 通道,讓兩邊網段可以直接互聯,速度不需要很高,所以早期我都是用 ADSL ,client 端用 2M/64k ,Server 端用 8M/640k (1 固+7 浮動 IP),當然後來光纖普及了,就會用光纖。

因為設備真的很穩定,所以很少需要維護,甚至到忘了使用者介面的位置在哪。這篇的目的就是提醒我自己。

協力廠商反映現場 client 端不能連線,工程人員去現場,久到連密碼都不可考,所以拆回來,恢復成原廠狀態,再把出機參數還原,還原後才發現 server 端撥不進去。

用 telnet 在公司測試,port 沒開,連到現場檢查,的確 pptp service 沒作用,所以得把 pptp server 啟動。

但太久沒操作,久到連介面都不知道在哪。

只好到原廠官網查,官網都只有命令列模式,所以從命令列模式去下指令,恢復 pptp Server 啟用:

官網的說明:https://help.mikrotik.com/docs/display/ROS/PPTP

pptp Server 啟用

可以看到,先啟用 Terminal 後輸入以下指令:

interface pptp-server
server set enabled=yes

啟用後,client 就撥通 VPN ,自動建立通道完成。

我印象中,pptp Server 是有介面可以啟用,但是就是想不起來在哪。之後開台 VM 放 RouterOS 的映像檔來測:

pptp Server 啟用

原來是選單 選 [PPP] ,點選工具列的 [PPTP Server] ,就有介面可以啟用。為啥我之前就是找不到呢?

寫一篇文提醒自己,下次找不到,回網誌翻就可以了。

Categories: 工作點滴, 技術分享 | 標籤: | 發表留言

[VBA] Excel 安全性調整後,跨檔案所需要的變更


我大概是 Excel 4.0 開始用巨集的,到了 Excel 5.0 (Office 4.2 / 4.3) 轉成 VBA 以後,我就比較經常用,那時 Word 6.0a 的巨集還不是 VBA ,而是 WordBasic ,到 Office 95 才統一為 VBA 。

1996/07 碩畢當兵前要交接研究資料給學弟時,寫了一篇做內部教育訓練。

MS Office 自動化巨集 http://www.hisdt.com/TLCheng/Basic/Office/officevb.htm

這篇是在 1999/02/03 網頁化上網分享,念碩士的時候還是 Excel 5.0 + Word 6.0a ,做研究計畫、論文會大量用到 Excel 整理數據,例如我的碩士論文是做人工智慧,用 VB3 寫類神經網路 (BPN) 跟自己修改的模型 (有點類似現在的 RNN) ,在下班後,丟到一堆助理的電腦上去跑,借同學的電腦夜間跑,白天一早來暫停目前類神經網路學習進度儲存後,備份計算結果各台電腦還給大家用,白天我則利用 Excel VBA 整理數據出表格、圖形自動貼到 Word 印出後,跟指導教授討論。

工作後寫 Excel VBA 的機會變少,有大量資料要分析的時候,我才會拎出來用。

Office 2007 以後,基於安全考量,有 VBA 的檔案要存成 .xlsm ,我也開始養成慣例,把 VBA 單獨寫成一個檔案,資料檔跟輸出檔分在不同的檔案,方便安全管理,大概是前三年左右吧,不知道 Excel 哪個安全性更新起,存成 .xlsm VBA 裡面的函數就不能跨黨案使用,必須存成 .xlam 做成增益集。

我以前個人基於安全考量,希望 Excel 開起來是乾乾淨淨的,所以一直沒做成增益集來用,但 Excel 內有些函數功能真的不足,還不如呼叫 VBA 內建函數,所以我就把我常用的 VB 內建函數跟自己常用的函數建成一個 VbaTools.xlam 來引用。

一個新的 .xlsm 開發完成後,可以另存新檔為 .xlam ,這時 Excel 會自動導向存放增益集的路徑,我習慣放在我個人區,移動到其他台電腦用複製貼上即可,但是預設不會啟用,要自己勾選起來。

個人區域設路徑為 %AppData%\Microsoft\AddIns

開啟 Excel 後,左上角 選單 > 檔案 > 選項 > 增益集

自訂增益集

找到自己的增益集後,下方 [管理] 選擇 [Excel 增益集] ,選擇 [執行]。

如果沒有正常出現自己的增益集,可從右側 [瀏覽] 按鈕下去尋找。

勾選自己的工具

勾選後按下確定即可。

接下來就可以在任意檔案中呼叫增益集內的函數。

呼叫增益集內的函數

比如說 Excel 內的 REPLACE 函數,一次呼叫只能替換第一格發現的字串,但是 VBA 內建函數可以一次替換所有可發現的字串,一下子就方便不少。

所以我在前年寫了個兩小時教育訓練排在去年執行,主要是讓同事知道 Excel 還能做甚麼,針對大量重複的行政作業或流程,有需要找資訊部開發。

Excel VBA 內部教育訓練簡報檔

前兩個月執行老闆叫我進行的分析,因為資料量滿大的,所以我在其他 .xlsm 的巨集打算呼叫 VbaTools.xlam 時,發現居然不能直接呼叫。

開啟舊的兩個 .xlsm 也不能互相呼叫了。

我過去的慣例是會把共用的函數 .xlsm 另外開一個檔,專用的函數 .xlsm 自己存一個檔,自先前改用 VbaTools.xlam 後,就把共用的函數轉移進去,而且我記得先前還能用。

兩年前在寫這篇時:

[Excel]白做工了,規劃求解與 VBA https://tlcheng.wordpress.com/2019/05/12/excel%e7%99%bd%e5%81%9a%e5%b7%a5%e4%ba%86%ef%bc%8c%e8%a6%8f%e5%8a%83%e6%b1%82%e8%a7%a3%e8%88%87-vba/

用 測試.xlsm 還能呼叫 規劃求解 的 VBA 函數,連程式碼截圖都在,我也不知道為啥就不行了。

經搜尋新的方案是要加入參照才能呼叫其他 .xlsm / .xlam 的函數:

參照 VbaTools.xlam

參照完舊可以在瀏覽物件瀏覽程式庫時,看到 VbaTools.xlam 函數。

程式庫瀏覽

這個月還沒想到要寫甚麼,怕忘記 Excel 的 VBA 變化,寫下來提醒自己。

Categories: Office, 工作點滴, 技術分享 | 標籤: | 1 則迴響

[T-SQL] 配合 EXISTS 刪除資料庫重複資料


資料庫裡面有超過兩億筆的資料,每次跑 DELETE 一筆資料,就要跑好久,所以想說把問題資料一次刪除。

流程步驟大概是這樣:

  1. 匯出重複資料到暫存資料庫
  2. 刪除重複資料
  3. 從暫存資料庫匯入不重複資料 (SELECT DISTINCT)

所以這篇要談的是上面步驟 2。

測試語法前,先產生一個測試資料表:

測試資料表

SN 是我的資料項目代號,如果不容易理解,可以換個想法,當作大學全校學生的考試成績,SN 是科目代號,DataTime 是考試時間,DataValue 是考試分數,Quality 是學生代號,大學生每個人選修科目都不同,所以不能直接做橫向列表來紀錄成績。

所以這個資料表沒有 PK ,只有 SN / DataValue / Quality 有可重複的索引值。

而在這個超過兩億筆的資料裡面,目前檢查有 29k 筆資料重複,如果逐筆刪除,會消耗大量時間,所以測試我不熟的 EXISTS 來刪除。

由於我的資料項目代號並不重複,我就省掉 Quality 的欄位,所以撈出重複資料的語法很單純:

SELECT SN, DataTime
FROM (
	SELECT SN, DataTime, COUNT(SN) AS nCount
	FROM Data_Temp
	GROUP BY SN, DataTime
) AS Data_Limit
WHERE nCount > 1

我一直以為搭配 EXISTS 是類似子查詢,把上面語法嵌入即可,不過實際上不是,需要把 WHERE 條件合併,測試時,先用 SELECT 測:

用 SELECT 測試 EXISTS
SELECT *
FROM Data_Temp
WHERE EXISTS (
	SELECT SN, DataTime
	FROM (
		SELECT SN, DataTime, COUNT(SN) AS nCount
		FROM Data_Temp
		GROUP BY SN, DataTime
	) AS Data_Limit
	WHERE nCount > 1 AND Data_Temp.SN=Data_Limit.SN AND Data_Temp.DataTime=Data_Limit.DataTime
) 
;

如上面語法,其中,下底線加粗體字的條件,基本上就是 JOIN 在 ON 後面的條件,要一起組進去,組好測試無誤後,把 SELECT 改成 DELETE 即可。

最後測試完成的語法:

DELETE 
FROM Data_Temp
WHERE EXISTS (
	SELECT SN, DataTime
	FROM (
		SELECT SN, DataTime, COUNT(SN) AS nCount
		FROM Data_Temp
		GROUP BY SN, DataTime
	) AS Data_Limit
	WHERE nCount > 1 AND Data_Temp.SN=Data_Limit.SN AND Data_Temp.DataTime=Data_Limit.DataTime
) 
;

實際在用的時候,要在 GROUP BY 之前再加入一個 WHERE DataTime<=’日期’ 的條件,避免有即時備份重複資料時,有即時最新的重複資料沒備份到,而執行刪除重複資料時,卻被刪除到。

Categories: 工作點滴, 技術分享 | 標籤: | 發表留言

[Web] frame 的 name 生命空間


我個人很喜歡使用 frame (框架) ,這樣可以減少我重複的頁頭、頁尾,比如說選單、工具列之類的功能性網頁,我不需要為每個網頁插入選單,這也可以減少選單的重複傳輸、載入。

在 HTML4 的年代,框架為王,到了 HTML5 建議不要使用 frame ,最多用 iframe ,所以現代的網頁幾乎都是一頁滾輪到底的網頁,包含選單,框架變的沒人用,也很麻煩。

麻煩 1:安全性變更。

框架限制只能存取同網站的內容,整個 frame 屬性都無法存取,這部分可以避免跨網站取得資料,比如說早期騙帳號密碼的,用框架包起來,絕對是看起來跟原網站一模一樣,當然,用 proxy 概念的代理機器人,也能讓網頁看起來一模一樣。

跨框架存取位置

麻煩 2:同時開啟多個頁籤時,命名空間會共用。

在 IE11 開相容 IE10 的模式下,會以 IE10 的架構去跑,但使用 HTML5 就會共用。如下圖:

框架名稱順序

在舊板的網頁架構下,同時開多個頁籤,工具列網頁使用:

<base target="main">

預設會走藍色路線,也就是說不用管多個頁籤,自己會在自己框架命名空間下正確執行。

但在 HTML5 會當成共用的命名空間,所以就會走紅色路線,通通到第一個 資料頁 去顯示內容。

要改善這個問題,就是依框架樹狀結構搜尋,先往上層走到樹跟或是指定的框架後,列舉下方所有的框架名稱,再使用該框架變數變更。

若是其中一個框架是麻煩1 的狀況,那個框架名稱就會無法列舉,就只能回去用名稱。

比如說頁籤2 某個功能不會用,從 data.name.com 導向 help.name.com 查線上說明後,因為 資料頁 這個框架的網站不同,已不可列舉,無法使用 frame 的權限存取,所以只能回去用 window.open(路徑, “資料頁"); 去更新內容,則新的內容會在頁籤1 呈現,而不是在頁籤2 呈現。

消極的解決方案不要同時多開有框架的網頁。

積極的解決方案是框架名稱依規則產生唯一名稱,在工具列呼叫時,依照該規則唯一名稱顯示更新的內容。

我喜歡框架,可是 HTML5 不喜歡它。

Categories: 工作點滴, 技術分享 | 標籤: | 發表留言

[IPv6] 非預期的遭遇戰


話說離開學校後,就沒碰過 IPv6 的環境,大概有 17 年沒碰過了。

今天女兒在校外租的地方碰上網路異常,最後的結果很瞎,所以我先說背景。

女兒有手機、平板、筆電要上網,所以我幫他準備了 TotoLink AC3 無線基地台,1 WAN / 2 LAN / 300 MHz:

https://www.totolink.tw/products_view/N200REplus

女兒都是透過這台無線基地台上網,這台無線基地台則上接牆孔。

女兒反映,筆電部份網站不能連線,比如說成大首頁,但多數網站可以連線,比如說 Google 首頁、Youtube ,但 iPad 則都可以連線,因為要上傳作業,要連到系上,問我怎麼辦。

我確認女兒是都用 AC3 無線上網後,先行排除 AC3 異常,請女兒跑 ipconfig /all 給我看,DNS 如下:

無法連到成大的 DNS

我離開成大 17 年,但我還是記的 163.28.112.1 是成大在用的 DNS ,我一開始以為她在學校,但是不是,檢查網卡 DNS 設定,又是自動設定,所以顯然這 DNS 是上游散布下來的。

我讓她手動設定 DNS 為 8.8.8.8 測試,可以解析 http://www.ncku.edu.tw ,但是仍然連不上。

把 DNS 改回自動後,又回到 163.28.112.1 ,我一度以為是快取問題,所以請女兒把 iPhone 開無線分享給 NB 測試,女兒使用 iPhone 無線上網則一切正常,我順便跑 tracert http://www.ncku.edu.tw ,意外發現 iPhone 無線基地台的 IP 是 172.20.10.1 。

切回 AC3 後,網路設定還是回到上圖,我一度以為會不會是同學使用 VPN 連到成大,網路設定錯誤導致被覆蓋或混淆,或是房東的網路設定錯誤,導致牆孔異常。

既然女兒可以連線到 Youtube ,我請女兒測試 tracert http://www.youtube.com ,果然,可以正確連上。

都是 ipv6

一看,是從 HiNet 出去,果然是用校外網路,但是越看越不對,怎麼全部都是 ipv6 的節點?

請女兒把網卡 IPv6 關閉後,就變成完全不能上網了,但是還是能連線到 AC3 。忽然想到,該不會女兒 WAN 端接錯了吧?請女兒把 AC3 系統狀態貼給我看,果然,WAN 是斷的,女兒把網路線插到 LAN1 去了。

問題找到就一下解決了,改插到 WAN 就恢復正常。

當然,網卡有快取,iPad 是關閉網路再重開才恢復正常。

至於先前網路會通,我是這樣判斷:

假定房東裝的是中華電信光纖到府,預設有開啟 Router (WiFi) ,所以直接插網孔就能上網,例如 AC3 取得 WAN 的 IP 是 192.168.1.116 。

假定中華電信數據機的 IPv6 是開著。

所以當女兒接到 LAN1 時,筆電 > WiFi > LAN1 (Switch) > 數據機 IPv6 上網。

接回 WAN 時,筆電 > WiFi > WAN (Router) > 數據機 IPv4 上網。

也就是說我判斷數據機那邊會直接分配 IPv6 的 IP 上網。

至於 163.28.112.1 這個 DNS ,我記得是在高速網域,不在成大網域內,當初是 IPv6 的備用 DNS 的樣子,還好有點印象,還會聯想到。

這次遭遇戰,完全沒有準備,被打得莫名其妙。

Categories: 自用整理, 技術分享 | 標籤: | 發表留言

[Web] JavaScript 事件掛載的順序


因為我的網頁還有些 Windows XP Embedded (XPE) 要支援,所以我寫網頁時,還要測試 Internet Explorer (IE) 舊版本的相容。

前陣子我在大量將 VBScript 網頁改寫為 JavaScript 網頁時,我打算調整部分網頁架構,讓共用的部分在一開始就事件掛載共用函數,在執行到需要的功能時,再追加事件掛載差異的函數。

在 IE 相容測試時,IE9 以後都能正常依順序執行,IE8 以前卻是反序執行,主要是因為 IE9 以後支援 HTML5 ,使用 H5 的事件呼叫 addEventListener ,但 IE8 以前不支援,必須改呼叫 attachEvent ,掛載單一事件還沒感覺,多個事件就會出問題了。

下面這段程式碼在多數的網站都可以搜尋到:

// 設定事件掛載
function SetEventHandler(obj, eventName, pointFunction) {
   try {  // Chrome、FireFox、Opera、Safari、IE9.0及其以上版本
      obj.addEventListener(eventName, pointFunction, false);
   } catch (e) {
      try {  // IE8.0及其以下版本
         obj.attachEvent('on' + eventName, pointFunction);
      } catch (e) {  // 早期瀏覽器
         obj['on' + eventName] = pointFunction;
      }
   }
}

測試程式碼用一個按鈕 cmdTest 來接收:

// 設定 window_onload 事件
function window_onload() {
   SetEventHandler(cmdTest, "click", fun1);
   SetEventHandler(cmdTest, "click", fun2);
   SetEventHandler(cmdTest, "click", fun3);
}

function fun1() {
	console.log("fun1");
}

function fun2() {
	console.log("fun2");
}

function fun3() {
	console.log("fun3");
}

Edge / IE9 等支援 HTML5 的瀏覽器都能依照預期執行 (after):

Edge 依序執行
IE9 依序執行

但是 IE8 呼叫舊方法,則是反序執行 (Before):

IE8 反序執行

最後沒辦法,還是回到 VBScript 時代的做法,在最後才掛載事件一次,而在被掛載的事件去呼叫共用方法。

留個紀錄提醒自己,不然真的是會忘。

Categories: 工作點滴, 技術分享 | 標籤: | 發表留言

[Virus] 不明的惡意程式


小女兒在玩手機,忽然女兒電腦跳出要求提高權限執行,女兒問我是啥,我就幫忙看看。

部分內容沒保存,直接刪了,簡單的描述一下。

首先是小紅傘攔了一個批次檔,放在 %LocalAppData% 下,因為批次檔不執行就沒事,我先把他從小紅傘還原回來檢查。

看起來是透過 Windows 內建的 SmartScreen 提高權限允許做某些事,但是那些指令我沒研究過,之後呼叫 PowerShell 處理幾個目錄:

%LocalAppData%\Update
%LocalAppData%\Updates
%LocalAppData%\Google\Update
%LocalAppData%\Microsoft\Update
%LocalAppData%\Mozilla\Update
%LocalAppData%\Packages\Update

檢查這幾個目錄,目錄裡面都被塞入下圖這些檔案,看起來部分程式是用 python 寫的,或是要偽裝成正常程式?

自動產生目錄的惡意程式

先看工作管理員,看不到可疑程式,就先把上面的目錄全砍了,砍完後沒幾分鐘,這幾個目錄就生出來了。

近期看到很多惡意程式是透過排程啟動,檢查排程後,發現下圖由 OS 建立的排程,分別每 10 分鐘執行各目錄下的 updates.exe

惡意排程

除了一個排程 ServiceGPUTaskUpdate 是使用者登入時觸發外,其他 UpdateCore0x30? 都是每 10 分鐘觸發一次,分別對應到上述不同目錄的執行檔。

所以要刪除前,先把所有服務停用,再分別刪除上述目錄,再刪除服務即可。

Google 相關關鍵字還沒找到是甚麼病毒,最近要稍微關注一下。

Categories: 技術分享 | 標籤: | 發表留言

[T-SQL] 評估 PVIOT 加速資料組成效益


關於 PVIOT 官方說明請參考:

https://docs.microsoft.com/zh-tw/sql/t-sql/queries/from-using-pivot-and-unpivot

前篇 [T-SQL] WITH 通用資料表運算式:暫時資料表 有提到,要來介紹 PVIOT ,我在實際運用時,是測完 WITH 後,直接進入 PVIOT ,所以實際上 WITH 並沒用在系統中,只有測試過。

使用暫存資料庫、WITH 的範例語法請參考前篇,這篇就著重在 PVIOT ,範例也可以看看官方說明。

PVIOT 語法比 LEFT JOIN 簡潔

前篇是使用專案資料庫,資料筆數少,所以很難正確評估效益,這篇改用主資料庫,先用 COUNT 把資料庫筆數撈出來,有 158,673,734 ,也就是說有 1.58 億筆資料。

資料庫筆數

之後同時比較三種查詢方式的執行計畫:

將執行計劃時間整理如下表:

動作時間(秒)估計筆數
插入資料到暫存資料庫2.806202809
從暫存資料表查詢並組合資料0.0923038960
使用 WITH 查詢並組合資料3956.86894E+44
使用 PVIOT 查詢並組合資料2.4524782

我很驚訝 WITH 使用時間是 PVIOT 的 161 倍,我推論 WITH 並非原先想像先完成查詢結果集放在記憶體內的暫時資料表 (@MSSQL2017) ,應該是 T-SQL 字串的變數,因此每次 LEFT JOIN 都從 1.58 億筆內資料撈,導致 Cross 乘積 達到 6.86894E+44 那麼大。

也還好我實際系統沒用 WITH ,直接跳過去用 PVIOT ,少了踩雷,難怪如前篇般,我根本想不起 WITH 這個關鍵字。

去掉 WITH 查詢後,重跑執行計畫:

將執行計劃時間整理如下表:

動作時間(秒)估計筆數
插入資料到暫存資料庫2.956202809
從暫存資料表查詢並組合資料0.0873038960
使用 PVIOT 查詢並組合資料2.4144782

PVIOT 的確有增速效益,但並不如想像中明顯,大概為 1.26 倍。

這篇最大的心得是 WITH 是個雷… PVIOT 加速其實也有限。

Categories: 資料庫, SQL, 工作點滴, 技術分享 | 標籤: | 發表留言

[VBNET] 取得文字盒的游標位置


這個主題應該到處都搜尋得到,這邊討論一下我沒找到的部分。

我不確定我原始碼最早從哪來,也是天下文章一大抄,在 VB6 抄的,移植到 VBNET ,這邊假定我原始碼是抄 cww 的:

參考位置:http://www.hosp.ncku.edu.tw/~cww/html/q00221.html

原先的原始碼,會在超過約 32kb 以上的內容發生定位錯誤,當然就是溢位錯誤導致計算為負,google 後大部分原始碼都是這樣,所以只好自己偵錯。

首先先研讀 Windows API 說明,微軟已經把 Windows API 說明中文化了,所以不要再因為閱讀障礙不去看:

EM_GETSEL: https://docs.microsoft.com/zh-tw/windows/win32/controls/em-getsel

EM_LINEFROMCHAR: https://docs.microsoft.com/zh-tw/windows/win32/controls/em-linefromchar

EM_LINEINDEX: https://docs.microsoft.com/zh-tw/windows/win32/controls/em-lineindex

從 EM_GETSEL 說明中,可以看到,其實分成目前游標及選擇區域 (反白) 兩種模式,為了不把問題複雜化,只看目前游標。

傳回位置有提到分成 LOWORD (低位元組) 與 HIWORD (高位元組) ,任何一數超過 65536 則傳回 -1 ,我猜很多人看到超過回傳 -1 ,就沒管了,這也是網路上搜尋到的範例基本上只適合小文字檔。

說明也提到建議使用 wParam / lParam ,我測出這兩參數回傳結果都是 0 ,暫時放棄。

由於 HIWORD 是 65536 ,但 VBNET 的 Integer 的 HIWORD 只能到 32768 ,所以 32 kb 以上文件會出問題。因此這邊將 Windows API 呼叫改為 UInt32 來接收:

<Runtime.InteropServices.DllImport("user32.dll", EntryPoint:="SendMessage")>
Public Function SendMessageUInt32(
	hWnd As Integer,
	wMsg As enuWindowMessageId,
	wParam As Integer,
	lParam As Integer

) As UInt32
End Function

所以解決了 64 kb 以下檔案問題。

經過測試,EM_GETSEL 超過 64kb 並不會回傳 -1 ,所以應該是原始文件誤植,或是微軟已經擴充功能後沒有正確更新文件。

所以游標計算方式更新如下:

Public Function GetCaretPos(ByVal EditControl As Control) As System.Drawing.Point
	Dim i, j, k As Long
	Dim lineNo, colNo As Integer
	Dim lParam, wParam As Integer
	i = SendMessageUInt32(EditControl.Handle, EditTextMessage.EM_GETSEL, wParam, lParam)
	j = Int(i / 65536)
	lineNo = SendMessageUInt32(EditControl.Handle, EditTextMessage.EM_LINEFROMCHAR, -1, 0) + 1
	k = SendMessageUInt32(EditControl.Handle, EditTextMessage.EM_LINEINDEX, -1, 0)
	colNo = ((j + 65536 - (k Mod 65536)) Mod 65536) + 1
	Return New System.Drawing.Point(lineNo, colNo)
End Function

VBNET 並不完全支援 UInt32 ,很多函數僅支援 VBNET 內建型別,因此在收 SendMessageUInt32 回傳值時,都立刻改為 Long 。

j 在算 HIWORD ,這個數值超過 65535 後,會從 0 再開始,類似里程表。

而在呼叫 EM_LINEFROMCHAR 時,依照 Windows API 說明,回傳目前位置是使用 -1 ,有用到選擇範圍時才用 lParm ,所以直接改成 -1 。

在計算欄位置時 (每行第幾個字元) ,j 僅 65536 以下,k 可超過 65536 ,所以這邊要先取餘數,但我現在還沒碰到這樣的文字檔,測試 TextBox 超過 1024 字元會自動換行,所以暫時先擺著。

以後有碰到可以測試的文字檔再來測,有問題再修改這篇。目前側到 4MB 的 log 都能正常跑。

Categories: 工作點滴, 技術分享 | 標籤: | 發表留言

在 WordPress.com 建立免費網站或網誌.