2012-09-11

運用batch使用cacls修改資料匣或檔案的使用者權限

其實…這件事是不必要做的…但還是有需要…

起因是,自從把網站中公告系統的db從access換成mysql之後,發現,只要是在需要多人連上首頁時,首頁會slow…大約連上同時有1200人左右的時候…像是成績發佈、選課之類的時間…


觀察是mysql的service的loading變的很高…

雖然我不敢說我在sql text寫的ok,但其實主要還是太多人同時連線的關係(but…話說在使用mdb時期沒這問題…但,我覺得應該是選課系統的關係)

所以,為了減少mysql的loading,我想到了兩種方式…

a) 把單頁sql語法重寫…

b) 把首頁改靜態的html…

a的做法比較麻煩,因為,目前首頁會使用mysql來load資料有四個部份
  1. 載入公告、榮譽榜與廣告區的config,所謂的config其實只會存放這三個區會列出來的筆數,以前都是人工去修改原始檔,但因為學校大頭有時要求東又要求西,變動性高,所以才放到db。
  2. 其他三個部份就是所謂的公告區、榮譽榜區跟廣告區,這三區又是分別放到三個table…所以就分成三次connection來做資料取出…原則上做成一次取出應該是ok,但…其實這種跨table的寫的不好的話其實會比原來的更差。
所以a先暫時不做





b的做法應該是對web service的load會最輕…
當然,也不是傻傻改成手動寫html…每公告一次或更新內容一次就要把網頁打開後編寫…也太累了…
所以,我使用
  1. 叫asp使用winhttp做類似curl或wget的方式先把以前的首頁程式抓出來,因為以前的首頁程式本來就是寫出首頁的html的…所以直接抓就可以現用
  2. 再讓asp的程式把winhttp取回的首頁結果資料寫入真正要讓人去連結的首頁html…
到這邊,其實都是小case…但最後卻發現b.2的最後那個首頁html,在它的安全性權限上會給與 IUSR_<hostname>(就是網際網路guest用戶)有寫入與修改的權限,這一點會造成極大的安全上的麻煩,什麼植入、掛馬或xss攻擊的…(雖然我在iis上有用urlscan),所以,還是得把權限的問題給解決…

但,很多東西不是網頁程式可以做的…因為網頁基本上的使用者就是 IUSR_<hostname>(就是網際網路guest用戶),所以你用網頁產生出來的檔案基本上會給與 IUSR有最高的安全性權限。所以就算可以用網頁程式修改,但也跑不出 IUSR的範圍。

所以,得朝向可以在server的local端執行的應用程式才行…但,不想花太多精神寫什麼dotNET、java、c的…所以,還是用batch好了…再來就是使用windows的cacls來修改權限…

CACLS是windows的修改資料匣或檔案的群組權限功能的工具,是內建的(註:windows 2003有內建,其他我不知道)…

CACLS的使用方式如下
C:\Users\fox>cacls /?

 注意: Cacls 現在已經過時,請使用 Icacls。

 顯示或修改檔案的存取控制清單 (ACL)

 CACLS filename [/T] [/M] [/L] [/S[:SDDL]] [/E] [/C] [/G user:perm]
        [/R user [...]] [/P user:perm [...]] [/D user [...]]
    filename      顯示 ACL。
    /T            變更目前目錄與所有子目錄中指定檔案的
                  ACL。
    /L            處理符號連結本身而不是目標
    /M            變更掛接到目錄的磁碟區 ACL
    /S            顯示 DACL 的 SDDL 字串。
    /S:SDDL       以 SDDL 字串中指定的項目取代 ACL
                  (不能搭配 /E、/G、/R、/P 或 /D 使用)。
    /E            編輯 ACL 而不是取代 ACL。
    /C            發生拒絕存取錯誤時仍繼續。
    /G user:perm  授與指定使用者存取權限。
                  Perm 可以是 : R  讀取
                                W  寫入
                                C  變更 (寫入)
                                F  完全控制
    /R user       撤銷指定使用者的存取權限 (必須與 /E 一起使用)。
    /P user:perm  取代指定使用者的存取權限。
                  Perm 可以是 : N  無
                                R  讀取
                                W  寫入
                                C  變更 (寫入)
                                F  完全控制
    /D user       拒絕指定使用者存取。
 可以在命令中使用萬用字元指定一個以上的檔案。
 您可以在命令中指定一個以上的使用者。

 縮寫:
    CI - 容器繼承。
         目錄將繼承 ACE。
    OI - 物件繼承。
         檔案將繼承 ACE。
    IO - 僅繼承。
         ACE 不會套用到目前的檔案/目錄。
    ID - 已繼承。
         從父目錄的 ACL 繼承 ACE。

以上述方式在index.html給與 IUSR_<hostname> 僅讀取與執行的權限的指令方式如下:

cacls index.html /T /E /P IUSR_<hostname>:R
註:因為用網頁程式產生出來存在server端的檔案是給與 IUSR_<hostname>有可讀可寫可修改的最高權限,所以,使用[/P]的方式來把原來的群組安全性的權限給取代掉…如果,你是想把本來只有可讀的權限再加上可寫入…那可以把[/P]改為[/G],把[:R]改為[:W]…這樣僅是在原有的『可讀』的權限再加上『可寫』…如果是使用[/P]的話,那[:R]就要改為[:C]

註2:cacls /P 這個方式是在該檔案寫入新的或取代原有的…但,這會破壞繼承…繼承的關係可以在安全性那邊看勾勾是灰的還是明顯黑白的…灰的是繼承,明顯黑白是破壞原有的關係再寫新的上去…目前我還想不到怎麼繼承父系或本層或上一層的安全性權限的方式…CACLS或ICACLS我都沒看到有直接繼承或不破壞的方式…

2 則留言:

匿名 提到...

改謝大大分享
可以試試-->/E
會保留繼承

死狐狸 提到...

你好
感謝你建議的方式