顯示具有 MIS 標籤的文章。 顯示所有文章
顯示具有 MIS 標籤的文章。 顯示所有文章

2020年3月26日 星期四

Vigor2960 使用者設定檔 - 使用 Active Directory Server 認證

這一篇是如何使用2960搭配AD/LDAP做VPN帳號認證連線一文的補充說明,或許是因為居易希望能夠同時適用 AD/LDAP,因此說明文件中對於 AD (有自己獨特的定義) 的設定說明實在是不夠清楚。


名詞解釋


屬性:

1. 名稱 (Common Name, CN):使用者名稱 (例如,John Smith) 或伺服器名稱,AD 使用的是 CN 而不是下列的 UID;
2. 使用者識別碼 (User ID, UID):使用者登入識別碼 (例如,jsmith) ,通常是 CN 簡化的識別碼;
3. 組織名稱 (Organizational Unit, OU):組織內單位的名稱 (例如,IT);
4. 組織 (Organizational, O):組織的名稱 (例如,ABC.com);
5. 網域元件 (Domain Component, DC):將組織的網域名稱拆成個別的網域元件 (例如,ABC 跟 com),AD 使用的是 DC 而不是 O;
6. 國別 (Country, C):國家名稱,一般較少使用;
7. 相對識別名稱 (Relative Distinguished Name, RDN):是跟目錄樹結構無關的部份,通常 RDN 的值會是 CN 或是 UID;
8. 識別名稱 (Distinguished Name, DN):用來代表一個 LDAP 物件的名稱 / 路徑的絕對位置,每一個 DN 都是由 RDN 跟路徑所組成。



屬性名稱對於大小寫字母沒有區別,但是一般在使用時屬性名稱會使用小寫字母。



屬性的定義:

屬性 (Attribute) = 值 (value),

例如,ou=IT、dc=ABC、或是 dc=com 等。



Vigor2960 AD 認證設定


在 "單一帳號/活動目錄管理" 設定畫面中,有下列幾個項目需要設定:

1. 綁定方式,分為:

1) 匿名模式:"使用 anonymous 匿名帳號登入 AD/LDAP 查詢";網域控制站 (Domain Controller, DC) 應該是沒有在接受匿名帳號查詢的,這個選項不適用於 AD 環境。

2) 簡易模式:"使用空白帳號登入 AD/LDAP 查詢";DC 應該是沒有在接受空白帳號查詢的,這個選項不適用於 AD 環境。

3) 常規模式:"使用指定帳號登入 AD/LDAP 查詢(需設定 Regular DN 和密碼)",只有這項是適用於一般的 AD 環境。可是居易對於這項設定的說明幾乎是沒有。

所以,AD 環境下只能夠選用常規模式


2. 伺服器IP位址:
AD/LDAP 的伺服器 IP,在 AD 環境具有全域目錄 (Global Catalog, GC) 功能 DC 的 IP。


3. 通用名稱識別符:
以什麼屬性做為帳號比對的依據,常見的有 cn 和 uid;AD 使用的是 cn 而不是 uid。



4. 基本識別名稱 (Base DN):
"從哪個基本網域名稱路徑開始查詢認證的帳號",

要從目錄樹狀結構的那裡開始查詢認證的帳號,一般會是 dc,例如,dc=ABC, dc=com;如果認證的帳號全部屬於某個組織單位,也可以加上 ou 成為 ou=IT, dc=ABC, dc=com。



5. Group DN (非必要):
檢查所要認證的帳號是否有在指定的群組內。



6. Regular DN:
"輸入指定的帳號路徑",

這個部份是最難的部份,因為我們通常不會記得 AD 物件的 DN。不過,透過在 DC 的命令提示字元下達 dsquery user -samid 命令可以得到物件的 DN。例如,要利用 AD 上的 VPNusr 這個帳號 (需要先在 AD 上建立這個帳號) 來進行認證查詢,可以利用下列的命令來查詢其 DN:

dsquery user -samid "VPNusr"


可以得到

"cn=VPNusr,ou=IT,dc=ABC,DC=com"


再將查到的 DN (去除隻引號) 填入 Regular DN 欄位。


7. 常規密碼:

認證查詢的帳號 (例如,上例的 VPNusr) 的密碼。



在完成上述的設定後,在 "基本識別名稱" 旁邊會出現按鈕,點進去可以看到 Base DN 下的樹狀結構,如果看不到,表示上面的設定有錯誤。


另外,Vigor2960無法顯示有中文的 DN,當組織單位等屬性有使用中文時,會查不到使用者。









2020年3月16日 星期一

Windows Server 2008 R2 Event Log 無法啟動

事由:使用者無法登入,DNS無法查詢。在登入 DC (Windows Server 2008 R2) 後,在開啟事件檢視器時出現:Event Log 服務未啟動。到 services.msc 啟動 Windows Event Log 出現:Windows 無法啟動本機的 Windows Event Log 服務,錯誤5:存取被拒絕。


解法:

1. 把 C:\Windows\System32\winevt\Logs 裡的檔案先移到其他資料夾;

2. 重設相關的權限 (參考自 https://support.microsoft.com/en-us/help/2751670/we-are-seeing-an-error-where-we-are-unable-to-access-the-security-log):

1) 檢查 C:\Windows\System32\winevt\Logs 的 NTFS 權限 (permissions),eventlog 使用者需要有完全控制的權限;

2) 執行 regedit,檢查 HKLM\SYSTEM\CurrentControlSet\Services\EventLog\Security 的權限,移除 eventlog 的權限;

3) 新增 "本機" 的 "NT service\EventLog" (就是 eventlog ) 的讀取權限到 HKLM\SYSTEM\CurrentControlSet\Services\EventLog\Security;

3. 重新啟動  Windows Event Log 服務。


備註:
因為步驟 1 跟 步驟 2 是同時做的,所以無法驗證是不是只要做步驟 1 或是步驟 2 即可。

2019年12月13日 星期五

在 macOS 安裝 Apache HTTP Server


Apache HTTP Server (httpd) 是一款常見的開源網頁伺服器軟體。近年來面對 Nginx、IIS 等網頁伺服器軟體的競爭,仍然具有很高的市佔率。是不少的網頁開發套件 (例如,XAMPP) 內建的網頁伺服器。httpd 的設定問題容易在網路上找到相關的解決方法,適合做為小型開發專案或是輕量服務需求的網頁伺服器。

卸載 macOS 內建的 httpd


檢查 macOS 是否內建 Apache HTTP Server (httpd)1,並且已經將其載入到 Launchd:
sudo launchctl list | grep httpd


如果 macOS 有內建 httpd,並且已經將其載入到 Launchd 時;必須先將其從 Launchd 中卸載:
sudo apachectl stop
sudo launchctl unload -w /System/Library/LaunchDaemons/org.apache.httpd.plist 2>/dev/null


(launchctl 以及 Launchd 的簡介請參考。)


註1:配合 macOS Server 5.7 以後不再支援來自開源軟體的圖形化管理介面,從 macOS 10.14 開始,已不再內建 httpd (請參考 macOS Server 的前世今生)。


使用 Homebrew 安裝 httpd

安裝 httpd 最簡單的方式是使用網頁開發套件。但是,使用套件會有下列的缺點:打包好的軟體不一定包含需要的軟體、軟體的版本受到限制、更新的速度較慢等。為了安裝與管理應用程式,套件管理工具被廣為使用。其中 Homebrew 是 macOS 使用者最常使用的套件管理工具 (Homebrew 的簡介請參考)。


使用 Homebrew 安裝 httpd 只需要執行下列的命令:
brew update
brew upgrade
brew install httpd


Homebrew 會執行下列的安裝工作:
1. 安裝檔案夾在 /usr/local/Cellar/httpd/2.24.xx (xx為版本號碼),
2. 執行程式 (例如,apachectl、httpd 等) 會被符號連結 (symlink) 到 /usr/local/bin,
3. 設定檔則是放在 /usr/local/etc/httpd,
4. /usr/local/opt 檔案夾中的 apache-httpd、apache2、以及 httpd 是安裝檔案夾的符號連結。


我們可以透過執行 echo $PATH 檢查 PATH 環境變數的設定,確認在使用 apachectl 等命令時,會優先執行使用 Homebrew 安裝的 httpd:
echo $PATH
PATH=/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin


因為 /usr/local/bin 在路徑設定的最前面,所以被 symlink 到該檔案夾的命令會被優先執行。


安裝完成後可以執行下列的命令來啟動 httpd:
apachectl start


開啟瀏覽器,連線到 http://localhost:8080/,可以看到 It works! 的網頁。

注意:存取記錄 (Access Log) 跟錯誤記錄 (Error Log) 預設是記錄在 /usr/local/var/log/httpd/ 檔案夾,並且對應到 /private/var/log/apache2/ 檔案夾。如果之前已經使用過 root 啟動過 httpd,命令前面需要加上 sudo,不然執行 apachectl start 時會出現需要 root 權限的提示,執行 httpd -k start 時會出現 AH00091: httpd: could not open error log file /private/var/log/apache2/error_log.
解決的方法為使用 root 權限刪除記錄檔。

設定 httpd (修改 httpd.conf)


/usr/local/etc/httpd/httpd.conf 是 httpd 的主要設定檔。為了使用上的需求,我們需要修改某些設定。下面列出幾個常見的設定。


監聽埠

安裝完後的預設監聽埠是 8080,而不是常用的 80 埠;我們需要找到 httpd.conf 中的 Listen 設定,更改為監聽 80 埠:
Listen 80


伺服器名稱

當沒有在 httpd.conf 設定伺服器名稱時,在啟動或關閉 httpd 時會出現下列的訊息:
AH00558: httpd: Could not reliably determine the server's fully qualified domain name, using MacBook-Pro.local. Set the 'ServerName' directive globally to suppress this message


找到 ServerName 設定,取消註解並且改為下列的設定:
ServerName localhost


文件根目錄

做為個人開發平台,預設的文件根目錄 /usr/local/var/www,在文件的相關操作上會比較不方便。將文件根目錄改設為使用者家目錄下的 www 檔案夾,可以方便文件的編修以及檢視。找到 httpd.conf 中的 DocumentRoot 設定,指定文件根目錄到使用者家目錄下的檔案夾:

DocumentRoot "/Usrs/user_name/www"
<directory "/usr/local/www></directory>


在文件根目錄設定的下方會有一個針對該檔案夾的設定,我們需要改為新的文件根目錄:
<Directory "/Usrs/user_name/www">


注意:因為 macOS 的系統完整保護 (System Integrity Protection, SIP)機制,建議文件根目錄設定為使用者家目錄下的檔案夾,或是使用預設值。


在使用者家目錄建立文件根目錄檔案夾並且新增一個 index.html 檔案:
mkdir ~/www
echo "<h1>My Page</h1>" > ~/www/index.html



重新啟動 httpd:
sudo apachectl -k restart


注意:因為使用了 80 埠,此時命令要加上 sudo。


開啟瀏覽器,連線到 http://localhost/,可以看到 My Page 的網頁。



將 httpd 設定為開機時啟動的守護行程 (Daemon)


要讓 httpd 能夠在開機自動執行,可以執行下列的命令:
sudo brew services start httpd


brew services 的簡介可以參考這裡

安裝 Homebrew-services 後,也可以使用它將 httpd 從  Launchd 移除:
sudo brew services stop httpd


或是重新加入 Launchd:
sudo brew services restart httpd


將 httpd 設定為登入時啟動的任務項 (Agent)


要讓 httpd 能夠在登入後自動執行 (注意,此時 httpd.conf 中的監聽埠不可以小於 1024,LOG 檔的擁有者要是使用者),可以執行下列的命令:
brew services start httpd


安裝 Homebrew-services 後,也可以使用它將 httpd 從任務項中移除:
brew services stop httpd


或是重新加入任務項:
sudo brew services restart httpd


僅啟動 httpd


Homebrew-services 也可以只用來啟動 httpd:
brew services run httpd


brew services run 使用目前使用者的權限執行,所以要注意監聽埠、檔案夾權限等設定問題。



2019年12月12日 星期四

在 WSUS 伺服器環境中如何替 Windows 10 安裝 .net Framework 3.5

Windows 10 不再內建 .net Framework 3.5,如果需要使用 .net Framework 3.5 的功能,需要透過 [控制台/程式集/開啟或關閉 Windows 功能] 自行安裝。

如果內部有使用 WSUS 伺服器,在安裝 .net Framework 3.5 時,出現了 0X800F0954 的錯誤;代表 WSUS 伺服器無法讓你正確下載 .net Framework 3.5。那是因為 "Windows 10 Feature on Demand" 中的  .net Framework 3.5 只有支援到 Windows 10 1703。



可以使用下列兩種方式來解決這個問題:
1. 讓電腦離開網域,安裝完後再重新加入網域。

2. 讓電腦暫時不受 WSUS 伺服器管理。

(1) 在 [工作管理員/服務] 停用 wuauserv;

(2) 執行 regedit,展開至HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\Windows\WindowsUpdate\AU,將 UseWUServer 的數值資料改成 0;

(3) 在 [控制台/程式和功能/開啟或關閉 Windows 功能],安裝 .net Framework 3.5;

(4) 執行 regedit,展開至HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\Windows\WindowsUpdate\AU,將 UseWUServer 的數值資料改回來 1;

(5) 重新啟用 wuauserv。




另外,如果要安裝 XPS Viewer,記得在步驟 (3) 之後要執行下列的命令:

dism /Online /Add-Capability /CapabilityName:XPS.Viewer~~~~0.0.1.0

2019年5月30日 星期四

Windows 10 1803 安裝 XPS Viewer


在 AD Domain 並且使用 WSUS

1. 暫時停止 wuauserv 

工作管理員 -> 服務 -> wuauserv -> 停止


2. 執行 regedit

展開至HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\Windows\WindowsUpdate\AU,將UseWUServer 改成 0。


3. 控制台 -> 程式和功能 ->  開啟或關閉 Windows 功能

安裝 .net Framework 3.5


4. 安裝 XPS Viewer (命令提示字元-系統管理員)

dism /Online /Add-Capability /CapabilityName:XPS.Viewer~~~~0.0.1.0


5. 將 UseWUServer 改回 1

HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\Windows\WindowsUpdate\AU


6. 啟動 wuauserv

2019年2月11日 星期一

Wacom Intuos 觸控筆無法拖曳 Chrome 視窗以及直接反白文字

Wacom Intuos 觸控筆在 Windows 下的 Chrome 預設為 "畫筆模式",因此無法拖曳 Chrome 視窗以及直接反白文字。要解決這個問題,可以將 Chrome 加入應用程式,並且在 "觸控筆設定" 的 "映射" 選項中改為 "滑鼠模式"。
實際的操作可以參考:https://www.youtube.com/watch?v=v6SFw7A_Uok

2018年1月3日 星期三

無法停用 “伴隨系統啟動TeamViewer”

在安裝完 TeamViewer 後,會在 /Library/LaunchDaemons  (表示其為由管理員定義的系統守護行程) 新增一個 com.teamviewer.teamviewer_service.plist,並且設定為開機自動啟動。


 TeamViewer 的喜好設定中的一般設定畫面中,顯示 TeamViewer 是隨著系統啟動的


在 com.teamviewer.teamviewer_service.plist 會有下面的設定:

<key>Disabled</key>
<false/>
<key>KeepAlive</key>
<true/>
<key>RunAtLoad</key>
<true/>

如果使用 LaunchControl 則可以看到 com.teamviewer.teamviewer_service 為啟動 (Enabled) 而且狀熊為執行中 (Running)。


 com.teamviewer.teamviewer_service 為啟動 (Enabled) 而且狀熊為執行中 (Running)



如果在 TeamViewer 的一般設定中取消核可 “伴隨系統啟動TeamViewer”,在 com.teamviewer.teamviewer_service.plist 中
<key>Disabled</key> 會變成 <true/>,但是 <key>KeepAlive</key>
的值還是 <true/> (TeamViewer 的 plist 檔同時還設了  RunAtLoad 的值為 true),會造成重新開機時 TeamViewer 還是會伴隨系統啟動。是一個不正確的 plist 檔。

而在 LaunchControl 中可以看到 com.teamviewer.teamviewer_service 的狀態為 Disabled 而且 Unloaded,但是事實上我們在執行取消核可 “伴隨系統啟動TeamViewer”時,TeamViewer 還是在執行中。





因為不想要 “伴隨系統啟動TeamViewer”,試過將 com.teamviewer.teamviewer_service.plist 中的 KeepAlive 以及  RunAtLoad 的設定移除或是改為 false,可是在每次重啟 TeamViewer 後,這兩個設定又被還原回去了。

後來找到了原因了,是因為覆寫資料庫 (/var/db/com.apple.xpc.launchd/disabled.plist) 中,鍵值被改為 false 了。使用下列的指令將 disabled.plist 改為 true, TeamViewer 應該就不會伴隨系統啟動了:

sudo launchctl unload -w /Library/LaunchDaemons/com.teamviewer.teamviewer_service.plist

可是這樣,每次要開啟 TeamViewer 時都要執行:

sudo launchctl load -w /Library/LaunchDaemons/com.teamviewer.teamviewer_service.plist


不然 launchd 無法載入服務。

2017年11月14日 星期二

Apache HTTP Server 的多程序處理模組 (Multi-Processing Module, MPM)

在 Unix 系統,Apache HTTP Server (httpd) 2.4 提供了三種不同的多程序處理模組 (Multi-Processing Module,MPM),它們分別是:Prefork,Worker 和 Event。httpd 官網的 MPM 介紹 請參考

Prefork 模組:

Prefork 模組實作了一個非執行緒、預先分叉 (Pre-fork) 的網頁伺服器。當 httpd 在啟動時就預先 fork 一些子程序來等待請求。

優點:較為成熟穩定,兼容所有新舊模組;沒有使用執行緒,可以完全的區隔每一個不同的請求,所以不用擔心執行緒安全的問題。

缺點:每一個子程序相對的會占用更多的系統資源,消耗更多的記憶體;面對高並發 (High Concurrency) 請求時,系統效能會大幅下降。


Worker 模組:

這個模組混合使用多個子程序 (Multi-process) 和多個執行緒 (Multi-threaded)。一個單一控制程序 (父程序) 會預先啟動數個子程序,然後每個子程序會建立一些伺服器執行緒,以及一個監聽執行緒;監聽執行緒負責監聽連線 (Connection),並將連線傳遞給伺服器執行緒進行處理。相較於基於程序的伺服器,因為使用執行緒回應請求,可以有效減少系統資源的使用。

優點:使用較少的記憶體、CPU 時間等系統資源,因此相較於 Prefork 模組,較能夠回應高並發請求。

缺點:因為多個執行緒共享父程序的記憶體地址,所以必須考慮執行緒的安全問題;每個執行緒處理一個連線,會有阻塞 (Blocking) 的問題。


Event 模組:

以 Worker 模組為基礎, Event 模組一樣是使用子程序和執行緒處理客戶諯請求;最大的差別在於 Event 模組會為每個 HTTP 請求對應到一個執行緒,而 Worker 模組則是每一個 HTTP 連線(可能會有多個請求)對應到一個執行緒。在  keep-alive1 連線模式下,httpd 傳統上會持續占用整個子程序 / 執行緒來等待客戶端的資料,造成了自身的劣勢。

而在 Event 模組中,每一個程序會有一個專門的監聽執行緒來管理兩種不同的監聽插座 (Listening Socket):在 Keep-alive 狀態的所有插座,以及已經處理完畢或是只剩下等待回傳資料給客戶端的插座。因此 Event 模組可以修正 Worker 模組會碰到的 keep-alive 問題。這種架構需要利用非阻塞 (Non-blocking) 插座和現代作業系統內核的輪詢 (Polling) 功能,以避免驚群問題 (Thundering Herd Problem)。


優點:解決了在 keep-alive 情境下,資源被沒有 HTTP 請求的連線長期占用的問題。


註1. 當一個客戶端完成第一項請求時,它可以繼續維持連線,讓後續的請求使用相同的插座 (Socket),節省在建立 TCP 連線時的顯著負擔。


模組設定


下列的指令可以檢查目前的 MPM。

httpd -V


Server version: Apache/2.4.29 (Unix)
Server built:   Nov  6 2017 14:32:45
Server's Module Magic Number: 20120211:68
Server loaded:  APR 1.6.3, APR-UTIL 1.6.1
Compiled using: APR 1.6.3, APR-UTIL 1.6.1
Architecture:   64-bit
Server MPM:     prefork
  threaded:     no
    forked:     yes (variable process count)


(預設為使用 prefork 模組)


使用 Homebrew 安裝的 httpd 已經將 3 種模組都預先編譯到套件內了,只需要在 httpd.conf 啟用相關的模組就可以了。例如,要啟用 Event 模組,只需要完成下列的設定:

LoadModule mpm_event_module lib/httpd/modules/mod_mpm_event.so
#LoadModule mpm_prefork_module lib/httpd/modules/mod_mpm_prefork.so
#LoadModule mpm_worker_module lib/httpd/modules/mod_mpm_worker.so


重新啟動 httpd,就可以改為 Event 模組:

httpd -V


Server version: Apache/2.4.29 (Unix)
Server built:   Nov  8 2017 08:51:12
mac1deiMac:~ timmy$ httpd -V
Server version: Apache/2.4.29 (Unix)
Server built:   Nov  8 2017 08:51:12
Server's Module Magic Number: 20120211:68
Server loaded:  APR 1.6.3, APR-UTIL 1.6.1
Compiled using: APR 1.6.3, APR-UTIL 1.6.1
Architecture:   64-bit
Server MPM:     event
  threaded:     yes (fixed thread count)
    forked:     yes (variable process count)



預設的 MPM


根㨿 httpd 官網,在安裝 MPM 時,主要考慮下列的兩個問題

1. 系統支援執行緒嗎?

2. 系統支援執行緒安全輪詢 (thread-safe polling)嗎 (特別是 kqueue 以及 epoll 兩個函數)?

如果兩個答案都是肯定的,預設安裝的 MPM 會是 Event 模組;如果只有問題 1 的答案是肯定的,預設的 MPM 會是 Worker 模組;如果兩個答案都是否定的,預設的 MPM 會是 Prefork 模組。因為現代的作業系統都支援這兩個特性,實際上預設的 MPM 都會是 Event 模組。

不過,MPM 的選擇還牽涉到 SAPI 對於 MPM 的支援;例如,在生產環境,如果使用 PHP 的 Apache 2 Handler 模組,就不建議使用執行緒類型的 MPM。相關理由請參考

2017年11月9日 星期四

macOS 的啟動守護行程 (Launch Daemon):launchd

修訂日期:2019/09/18

詳細的 launchd 介紹可以參考

macOS1 自 10.4 開始使用 launchd 這一個啟動守護行程 (Launch Daemon) 來管理系統中的程序 (Processes)、應用程式 (Applications) 及腳本 (Scripts),以及進行工作排程。Launchd 透過屬性列表檔案 (Property List File)2 來描述執行內容 (工作定義),使用 launchctl 命令來進行操作。

打開活動監視器,並且將顯示方式改為依階層排列,可以發現在最上層的 kernel_task  (PID 為 0) 下只有 launchd  (PID 為 1) 這個 Process,而其它的 Processes 則會在 launchd 下面 (為  launchd 的子程序或是孫程序)。

將 "活動監視器" 的顯示方式改為 "依階層排列"


 launchd 的 PID 為 1 為 kernel_task 的唯一子程序,其他的程序則為 launchd 的子或是孫程序



透過 pstree (使用 Homebrew 安裝) 可以知道其它的 Processes 為 launchd 的子程序或孫程序 



註1:為 Apple 桌機和筆電內建的作業系統,2011 年前稱為 Mac OS X (Mac OS X Lion 10.7 之前的版本),2012 年 (OS X Mountain Lion 10.8) - 2015 (OS X El Capitan 10.11) 年稱為 OS X,2016 (macOS Sierra 10.12) 年起改稱為 macOS。

註2:屬性列表檔案是副檔名為 plist 的 XML 格式檔案。

屬性列表 (Property List) 檔案簡介


MacOS的服務可以分為系統層級 (System-Wide) 以及使用者層級 (Per-User) 兩種。系統層級的服務被稱為是守護行程 (Daemon),會在開機時載入;使用者層級的服務則被稱為任務項 (Agent),會在使用者登入時才載入。
負責儲存服務工作定義 (Job Definition) 的檔案被稱為屬性列表 (Property List) 檔案 (簡稱為 plist 檔),分別存放在下列的檔案夾中:


檔案夾描述
~/Library/LaunchAgents由用戶自己定義的任務項 (Agents provided by the user.)
/Library/LaunchAgents由管理員為用戶定義的任務項 (Agents provided by the administrator.)
/Library/LaunchDaemons由管理員定義的系統守護行程 (System daemons provided by the administrator.)
/System/Library/LaunchAgents由 Apple 為用戶定義的任務項 (Agents provided by Apple.)
/System/Library/LaunchDaemons由 Apple 定義的系統守護行程 (System daemons provided by Apple.)


plist 檔是 XML 格式的檔案,標籤 (Tags) 的文件類型定義 (Document Type Definition, DTD) 在 http://www.apple.com/DTDs/PropertyList-1.0.dtd;標籤可以分為集合 (Collections)、原始 (Primitive) 型別、以及數值原姶 (Numerical primitives) 型別等不同的類型。

plist 檔首先由 <plist> 標籤來說明其版本,所有的設定內容都會定義在一組集合類型的<dict> 標籤內。每一項的設定內容都由屬於集合類型的鍵值標籤 <key> 開始,加上被解析字元資料 (Parsed Character Data, PCDATA) 的設定項目,以及鍵值標籤的結束標籤 <key/>,在其後則是相對應的設定用標籤。

下面為存放在 /System/Library/LaunchDaemons 檔案夾中的  tftp.plist 檔的設定內容:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" 
    "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
 <key>Disabled</key>
 <true/>
 <key>Label</key>
 <string>com.apple.tftpd</string>
 <key>ProgramArguments</key>
 <array>
  <string>/usr/libexec/tftpd</string>
  <string>-i</string>
  <string>/private/tftpboot</string>
 </array>
 <key>inetdCompatibility</key>
 <dict>
  <key>Wait</key>
  <true/>
 </dict>
 <key>InitGroups</key>
 <true/>
 <key>Sockets</key>
 <dict>
  <key>Listeners</key>
  <dict>
   <key>SockServiceName</key>
   <string>tftp</string>
   <key>SockType</key>
   <string>dgram</string>
  </dict>
 </dict>
</dict>
</plist>


在  tftp.plist 檔中:

  1. <key>Disabled</key> 設定項目用來決定工作定義內容是否會被載入 (此項設定的 PCDATA 為 Disabled);其後緊跟著屬於數值原姶的 <true/> 設定用標籤,代表設定內容將不會被載入。
  2. <key>Label</key> 設定項目用來識別工作,對於 launchd 而言,它必需是唯一的;其後緊跟著 <string> 原始型別類型標籤來設定守護行程或是任務項的名稱 。
  3. <key>ProgramArguments</key> 設定項目指定要執行的程式的路徑以及參數,因為需要設定較多的內容,因此使用 <array> 集合類型標籤來設定多個參數,而每個參數則會使用 <string> 標籤。


如果使用 Homebrew 安裝伺服器軟體,並且將其設定為  daemon,則其 plist 檔會儲存在 /Library/LaunchDaemons 檔案夾中。例如,在安裝完 Apache Web Server,並將其設定為 daemon 後,在 /Library/LaunchDaemons 檔案夾會新增下列內容的  homebrew.mxcl.httpd.plist 檔:

<?xml version="1.0" encoding="UTF-8"??>
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" 
    "http://www.apple.com/DTDs/PropertyList-1.0.dtd"?>
<plist version="1.0"?>
<dict?>
  <key?>Label</key?>
  <string?>homebrew.mxcl.httpd</string?>
  <key?>ProgramArguments</key?>
  <array?>
    <string?>/usr/local/opt/httpd/bin/httpd</string?>
    <string?>-D</string?>
    <string?>FOREGROUND</string?>
  </array?>
  <key?>RunAtLoad</key?>
  <true/?>
</dict?>
</plist?>


守護行程以及任務項的啟動



macOS 在開機時,首先會載入作業系統核心 (OS Kernel) ,核心載入完成後就執行 launchd 來載入其它的 daemons。launchd 在開機時會完成下列的工作:

  1. 載入工作定義:掃描所有 daemon 類別的  plist 檔 (存放在 /System/Library/LaunchDaemons 以及 /Library/LaunchDaemons ),然後根據 plist 檔中
    <key?>Disabled</key?>
    的設定值或是覆寫資料庫 disabled.plist3  的內容 (以 disabled.plist 的設定優先),來決定是否載入 plist 檔中的工作定義。
  2. 執行工作:執行已經載入的 plist 檔中
    <key?>KeepAlive</key?>
    的值不為 false 或是
    <key?>RunAtLoad</key?>
    的值為 true 的守護行程。

而當使用者登入時,一個新的 launchd process 將會啟動;這個 process 和開機時的 launchd process 類似,它將會:

  1. 載入工作定義,不過掃描的是 agent 類別的檔案夾 (/System/Library/LaunchAgent,/Library/LaunchAgents 和 ~/Library/LaunchAgents)。
  2. 執行 plist 檔中  <key?>KeepAlive</key?>  的值不為 false 或是 <key?>RunAtLoad</key?> 的值為 true 的任務項。



註3. disabled.plist 為覆寫資料庫 (Override Database) 存放在 /var/db/com.apple.xpc.launchd/ 檔案夾中;而較舊版本的 macOS 使用的是 overrides.plist,存放在 /var/db/launchd.db/com.apple.launchd/ 檔案夾中。覆寫資料庫只可以藉由 launchctl 來覆寫裡面的資料。

一個覆寫資料庫 disabled.plist 的內容可能如下:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" &quot
    ;http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
 <key>com.apple.AppleFileServer</key>
 <true/>
 <key>com.apple.ManagedClientAgent.enrollagent</key>
 <true/>
 <key>com.apple.screensharing</key>
 <true/>
 <key>com.apple.ftpd</key>
 <true/>
 <key>com.apple.usbmuxd</key>
 <false/>
 <key>com.apple.smbd</key>
 <true/>
 <key>com.apple.mrt</key>
 <true/>
 <key>com.teamviewer.service</key>
 <false/>
 <key>com.apple.stackshot</key>
 <false/>
 <key>org.apache.httpd</key>
 <true/>
 <key>com.apple.backupd-auto</key>
 <false/>
 <key>com.apple.pacemaker</key>
 <true/>
 <key>homebrew.mxcl.httpd</key>
 <false/>
</dict>
</plist>

Launchctl 命令簡介


(適用於 OSX 10.10 Yosemite以及之後的版本,更早之前版本請參考中的 "Operation")

Launchctl 命令是用來控制 Launchd 的命令,它有十分豐富的子命令,可以讓使用者列出目前的工作 (list)、載入工作 (load)、卸載工作 (unload)、執行工作 (start)、中止工作 (stop) 等。通常套件都會提供執行與中止的控制方式,所以本文不介紹 launchctl 的 start 及 stop 功能。


1) 列出目前載入的工作:
sudo launchctl list



會列出:

  • PID:數值為執行中的工作的 PID,- 則表示工作目前沒有執行。
  • 狀態 :0 代表工作成功結束,正值為發生錯誤,負值表示工作因為收到訊號而中止。
  • 工作的標頭等。


sudo launchctl list 也可以加上工作的標頭,查詢工作的詳細狀態,例如:
sudo launchctl list homebrew.mxcl.httpd



2) 載入工作:

sudo launchctl load /Library/LaunchDaemons/homebrew.mxcl.httpd.plist

在載入工作時,如果 plist 檔中  KeepAlive  的值不為 false 或是 RunAtLoad 的值為 true,服務同時會被執行 (產生新的程序)。

而如果工作的 plist 檔中的 Disabled 鍵值為 true 或是覆寫資料庫 (disabled.plist) 中工作的鍵值為 true,會出現下面服務停用的訊息,無法載入工作:

/Library/LaunchDaemons/homebrew.mxcl.httpd.plist: Service is disabled

此時要用下列的指令載入工作

sudo launchctl load -w /Library/LaunchDaemons/homebrew.mxcl.httpd.plist

(使用 -w 參數代表要覆寫 disabled.plist 中工作的鍵值為 false。)

3) 缷載並停止工作:

sudo launchctl unload /Library/LaunchDaemons/homebrew.mxcl.httpd.plist

由於設定為自動執行的守護行程 (任務項) 會在啟動 (登入) 時會自動載入,上面的操作是讓工作從目前的 Launchd 中缷載,並不會影響到 plist 檔跟 disabled.plist 的設定。如果要缷載 守護行程 (任務項) ,並且讓其不會在重新開機後自動啟動,則需要使用下面的指令 (使用 -w 參數覆寫 disabled.plist):

sudo launchctl unload -w /Library/LaunchDaemons/homebrew.mxcl.httpd.plist





2017年11月6日 星期一

Line@ 以及網頁版無法複製


早上同事反應 Line@ 客服網頁無法複製文字。

身為打雜工,一定要能夠解決問題。

Google 只有找到一篇是 Line 網頁版無法複製的文章 (goo.gl/pbo29N)。雖然應用情境不同,但是問題相同:Line 把網頁中的 "element.style" 的 "user-select" 設成 "None" 了 (Line 網頁版則是根本沒設定值)。

我的解決方法就是手動把網頁上 "element.style" 的 "user-select" 設成 "auto" (自訂及管理 Google Chrome -->更多工具 -->開發人員工具);不過可能每次重開 Chrome 就得重來一次 QQ。








PS, 原文中少提了要把 "擴充功能" 中的 "開發人員模式" 打勾 (不過圖示中有),如果你是使用LINE 網頁版,而且找不到 index.html,應該是忘了勾選該選項。

2017年9月7日 星期四

Windows 10 加入網域後連線到 WSUS 碰到的錯誤 0x8024401f 跟 0x8024401c

幫使用者更新 Windows 10,首先在 WSUS Server 上核准 1703 版的更新 (確認在 "需要這個更新" 包含要升級的電腦),然後到 PC 端使用 Windows Update 更新。 Windows Update 一直沒有辦法更新,於是打開了 好像是 "允許自網路檢查" 的選項 (這個選項在 1607 版不見了 QQ),然後就更新到 1607 版了。

更新完、重新開機,再執行 Windows Update 確出現 0x8024401f 的錯誤,上網找了一下解決方法,有人提出了可以使用 Microsoft easy fix solutions 來解決
(https://goo.gl/m2m3rj)。下載並執行了 "Resolve problems that prevent you from updating Windows" 這個 easy fix,果然發現了許多問題,也成功的修復了。 (真的嗎?!)

再次執行 Windows Update,0x8024401f 沒再出現,這次出現的是 0x8024401c 錯誤。再次 google 錯誤代碼,說如果 easy fix 沒有用,就請還原到某個檢查點吧 (還不保證一定有效)。
而在 https://goo.gl/5JoKj9 則是提出了修改 WSUS Server 的 IIS 設定可以修正這個錯誤。 

在不想執行系統還原、也不想修改 WSUS Server 的 IIS 設定下,忽然想到會不會是因為使用了微軟的線上更新而造成了 WSUS Server 和 PC 之間對於更新資訊產生了衝突!之前也曾經碰到過相同的問題 (不過在 Windows 7 時,錯誤代碼是 80072ee2)。解決方法也還算簡單 (https://goo.gl/sU2Xeb),而且看起來不太會有後遺症 (畢竟曾有過系統還原的不愉快經驗啊)。

修正方法為:
以系統管理員身分執行命令提示字元,然後執行下列三行指令
net stop wuauserv
reg delete HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\Windows\WindowsUpdate
net start wuauserv

果然,在執行完 3 個簡單的步驟後,Windows Update 恢復正常了。

2017年7月28日 星期五

管理 Windows Server 檔案伺服器中已開啟的檔案和資料夾

1. 使用 "系統管理工具 > 共用與存放管理" 的 “管理開啟的檔案”

在 Windows Server 2008 R2 要管理檔案伺服器中已經開啟的檔案和資料夾,可以使用 "系統管理工具 > 共用與存放管理" 的 “管理開啟的檔案” 功能。




Windows Server 2012 R2,"共用與存放管理" 被擺放到了 "遠端伺服器管理工具" 項目下 ("新增角色及功能精靈" 的: 功能 > 遠端伺服器管理工具 > 角色管理工具 > 檔案服務工具 > 共用與存放管理工具);代表 "共用與存放管理" 只能夠被用在 "遠端伺服器管理" 工作上,而無法提供本機 (Windows Server 2012 R2) 的 "共用與存放管理"。


執行 Windows Server 2012 R2 的 "共用與存放管理",出現該工具只能夠在 Windows 2008 或 2008 R2 中使用 (難怪放到遠端伺服器管理工具了),2012 以後的請使用伺服器管理員的提示。)



而 Windows 2012 R2 的 "伺服器管理員 > 檔案和存放服務 > 共用" 也沒有提供 “管理開啟的檔案” 的相關功能。




2. 使用 Microsoft 管理主控台的 "共用資料夾" (FSMGMT.MSC)

Microsoft 管理主控台的 "共用資料夾" 也提供了管理開啟檔案的功能。執行 "FSMGMT.MSC" (在命令提示字元或是 Windows圖示 + R),開啟 "共用資料夾" 管理主控台,可以較快地 (跟上述的 "共用與存放管理" 相比) 管理已經開啟的共用檔案,是最方便的圖形化共用資料夾管理工具。



在微軟的 TechNet,有人建議應該要使用  FSMGMT.MSC 來替代 "共用與存放管理",因為 FSMGMT.MSC 是一個較快速且具有時間彈性選擇 (A faster and more time resilient alternative):
https://technet.microsoft.com/en-us/library/cc725689(v=ws.11).aspx

3. 使用 OPENFILES 指令

除了上述的兩種方法之外,還可以使用 OPENFILES 指令來管理開啟的檔案,OPENFILES 指令有三個主要的功能,分別可以用來中斷一個或數個開啟檔案的連線、顯示本機或從共用資料夾開啟的檔案、以及啟用/停用顯示本機已開啟的檔案等 ( "啟用/停用顯示本機已開啟的檔案" 不在本文討論範圍)。
要查詢已經開啟的檔案,可以使用下列的指令:
OPENFILES /Query /FO CSV


其中,FO 為指定輸出的格式;在較大型的檔案伺服器上 "ID" 的長度可能會超過預設 Table 格式的長度 (8碼),所以建議指定輸出的格式為 CSV (Comma-Separated Values)。
為了方便查詢檔案的開啟狀態,可以將查詢指令寫到 batch script 中,方便查詢 (例如,可以將下列的程式碼另存成 "openfiles-q.bat",就可以快速查找相關開啟檔案的資訊)。
@echo off
set /p var=請輸入查詢關鍵字:
OPENFILES /Query /FO CSV | FINDSTR %var%
pause


如果要中斷已經開啟的檔案或是資料夾連線,可以使用下列的指令:
OPENFILES /Disconnect /ID 20 

為了方便中斷檔案的連線,可以將中斷連線指令寫到 batch script 中,方便使用 (例如,可以將下列的程式碼另存成 "openfiles-d.bat",就可以快速中斷相關開啟檔案的連線)。
@echo off
echo 1 以檔案名稱來中斷開啟的檔案
echo 2 以使用者名稱來中斷所有開啟的檔案
echo 3 以檔案識別碼來中斷開啟的檔案
set /p case=請輸入要中斷方式的代碼:
goto %case% 
:1
set /p file=請輸入檔案名稱:
OPENFILES /Disconnect /OP %file% /ID *
pause
goto :eof
:2
set /p userid=請輸入使用者名稱:
OPENFILES /Disconnect /A %userid%
pause
goto :eof
:3
set /p openid=請輸入開啟檔案的 ID:
OPENFILES /Disconnect /ID %openid%
pause
goto :eof



2016年1月28日 星期四

刪除Windows 10安裝檔所佔用的磁碟空間

不論是否有跟微軟預約Windows 10,當個人用戶 (非AD網域的用戶) 使用者將 Windows Update 設定為自動更新時,微軟都會自動在系統磁碟機的根目錄上 (一般為  C:\) 新增一個名稱為 $Windows.~BT 的隱藏資料夾。這個佔3.5GB6GB空間的資料夾中存放新版  Windows 的安裝檔案 (Windows 8.1安裝檔也是放在這資料夾裡)。原來當個人用戶使用者將  Windows Update設定為自動更新時,Windows Update 會自動將  Windows 10 的安裝檔下載至使用者的系統磁碟機中。
要刪除  Windows 10安裝檔所佔用的系統磁碟機空間,而且不要一直出現升級至  Windows 10 的訊息,需要執行以下的步驟:

(1) 變更  Windows Update 設定:在 [重要更新],不能夠選擇「自動安裝更新」,而要選擇其他三種選項之一。




(2) 以系統管理員身分執行命令提示字元 (cmd),然後輸入下列指令:

WUSA /UNINSTALL /KB:3035583

Windows Update 就會將  KB3035583 這個升級預約程式  (GWX.EXE) 移除掉,螢幕的右下角就不會再出現  Windows 10 升級圖示。
我們只能夠用上述的指令方式來移除升級預約程式,如果僅使用 [解除安裝更新] 的方式,是無法移除升級預約程式。




(3) 在檔案管理員中的 [組合管理 / 資料夾和搜尋選項],點選 [檢視] 標籤,勾選「顯示隱藏檔案、資料夾及磁碟機」,就可以在系統磁碟機下找到 $Windows.~BT 這個資料夾。



(4) 微軟從  Windows Vista 開始使用了一個虛擬的使用者 TrustedInstaller 和一個名稱為 Windows Modules Installer 的服務,來避免電腦被病毒感染,或是重要的系統檔案遭到竄改或刪除。這個機制後來在 Windows 7 中被大量的使用。Windows 7 會將完整的控制功能,則交給  TrustedInstaller 這個虛擬帳號,而不管是 System   Administrator 帳號,都只被賦予讀取的功能。
$Windows.~BT 資料夾中有部份的檔案的擁有者是 TrustedInstaller,因此我們無法直接刪除該資料夾;而需要先將該資料夾中所有檔案的擁有者都改為目前的系統管理員。我們以系統管理員身分執行命令提示字元 (cmd),切換到 $Windows.~BT 資料夾,然後輸入下列指令:

takeown /F * /R

(5) 再讓目前的使用者 (假設使用者名稱為 timmy) $Windows.~BT 資料夾中所有檔案都具有完全控制權,一樣以系統管理員身分執行命令提示字元 (cmd),並在 $Windows.~BT 資料夾下輸入下列指令:

icacls * /grant timmy:F /T


(6) 在檔案管理員刪除 $Windows.~BT 資料夾。

2015年12月10日 星期四

刪除電腦中的AD網域使用者

當AD網域的使用者登入網域中的電腦後,會在該電腦中留下個人資料夾,但是在電腦的使用者名單中 ( [控制台\使用者帳戶\使用者帳戶] 的 [管理使用者帳戶] ) 卻找不到該使用者。
若要刪除使用者留下的資料,可以:
方法一:直接刪除 「C:\Users\網域使用者名稱」這個資料夾。
方法二:將使用者加入本機的任一群組
1) [開始\電腦] 按右鍵選 [管理]。
2) 在電腦管理視窗中的 [電腦管理\系統工具\本機使用者和群組] 中,將該使用者加入本機的任一群組。
3) 在 [控制台\使用者帳戶\使用者帳戶] 的 [管理使用者帳戶] 中就可以看到該使用者,也能夠刪除使用者。 (在刪除時會出現 [使用者將無法再登入電腦] 的訊息,這是針對本機使用者,網域使用者在刪除後還是能夠再次登入該電腦)。

2015年12月9日 星期三

綠色的檔案和資料夾

今天有使用者發現前一位同仁所留下的檔案和資料夾在檔案總管中所顯現的顏色不是常見的黑色,而是綠色的。

檔案也沒有辦法打開來編輯或是讀取內容。


原來是前一位同仁使用了「加密內容,保護資料」的功能。為了要解決這個問題,只好使用前一位同仁的帳號登入,再來取消「加密內容,保護資料」的功能。

1) 對著資料夾按下右鍵,點選內容。

2) 在資料夾內容對話框的「一般」標籤中,點選「進階」。

 3) 取消已經勾選的「加密內容,保護資料」。