因為微軟在VISTA(含)以後的版本,加入使用者帳戶控制User Account Control功能(簡稱UAC),UAC功能會在程式啟動前做執行驗證,所謂的執行驗證,就是彈跳訊息視窗,要求用戶確認是否執行,以防止程式(木馬、病毒)在未經過授權的情況下,在背景偷偷執行。
剛好用來建立使用者帳戶的php程式,就是屬於背景執行程式,當然會被UAC擋下,但這問題關閉UAC功能就可以解決,而最大的問題是php執行cmd.exe(命令提示字元)權限不足,因為php的system()、shell_exec()及exec()函數,在windows系統都是呼叫cmd.exe來執行命令。
針對cmd.exe執行權限不足的問題,有人提出把cmd.exe授權給php執行的做法,個人則不建議採用此做法,因為php取得授權後,大部份的Windows指令都可以執行,這樣子會增加主機安全性風險。
本次要介紹的是透過主機的「工作排程器」功能,以定時的方式自動建立帳戶,這方式的優點是將內部跟外部的作業分開,而且不用做cmd.exe授權的動作,系統安全性較高。
首先將程式碼分別儲存成「RegisterAccount.php」及「BackgroundCreate.php」檔案。
外部網頁註冊程式碼(RegisterAccount.php):
<?php //網頁語系 header('Content-Typ: text/html; charset=utf-8'); if ($_POST['user'] && $_POST['pwd'] && $_POST['register']){ //將要註冊的帳號密碼寫入暫存檔案 $file = dirname(__FILE__).'\RegisterAccount.txt'; $fp = fopen($file, "a+"); fwrite($fp, serialize(array("user"=>$_POST['user'], "pwd"=>$_POST['pwd']))."\n"); fclose($fp); //輸出訊息 echo "<font color=red>註冊完成!</font>"; } echo "<html><head><title>AD帳號註冊 — blog.nux.tw</title> <meta content=\"text/html; charset=utf-8\" http-equiv=\"content-type\" /> </head><body> <form method=\"post\" name=\"frm\" enctype=multipart/form-data> 帳號:<input type=\"text\" name=\"user\"></input> 密碼:<input type=\"password\" name=\"pwd\"></input> <input type=\"submit\" name=\"register\" value=\"註冊\"></input> </form> </body></html>"; ?>
內部建立帳號程式碼(BackgroundCreate.php):
<?php $file = dirname(__FILE__).'\RegisterAccount.txt'; if (file_exists($file)){ $data = file_get_contents($file); //刪除申請建立帳號的檔案 unlink($file); $data = explode("\n", $data); $log = array(); foreach ($data as $ad){ if ($ad){ $ad = unserialize($ad); //執行建立帳號 $message = shell_exec("net user ".$ad['user']." ".$ad['pwd']." /add"); $log[] = $ad['user']."_".date("Y-m-d H:i:s")."_".$message; } } if ($log){ //回寫執行建立帳號所回傳的訊息 $log_file = dirname(__FILE__).'\CreateLog.txt'; $fp = fopen($log_file, "a+"); fwrite($fp, implode("\r\n", $log)."\r\n"); fclose($fp); } } ?>
步驟一:將「RegisterAccount.php」及「BackgroundCreate.php」檔案放到網頁程式執行路徑。
步驟二:到「控制台→系統管理工具→工作排程器」設定排程。
步驟三:在「一般」頁籤,將「以最高權限執行」選項勾選起來。
步驟四:在「觸發程序」頁籤,新增一個觸發條件。
觸發條件沒有限定要如何設定,可以依自已的需求設定,每小時或早晚一次都可以,本範例是設定為每分鐘觸發一次。
步驟五:在「動作」頁籤,設定執行的動作。
第一個設定值「C:\AppServ\php5\php」是php.exe程式路徑,第二個設定值「C:\AppServ\www\BackgroundCreate.php」是程式腳本路徑。
步驟六:工作排程設定完成後,在「工作排程器程式庫」中會看到剛才設定好的工作排程。
步驟七:若依照本排程設定範例為1分鐘循環執行,應該每1分鐘,就會出現此視窗。
步驟八:開啟瀏覽器,在網址列輸入「http://網址/RegisterAccount.php」網址後,填寫帳號及密碼後,按「註冊」按鈕,系統儲存後會出現「註冊完成!」字樣。
步驟九:這個時候程式腳本的資料匣,會出現「RegisterAccount.txt」檔案,而這檔案並非永遠都存在,當用戶帳號建立完成後,檔案會自動刪除。
步驟十:在檔案「RegisterAccount.txt」消失後,同時會出現「CreateLog.txt」記錄檔,直接點擊兩次將檔案打開,可看到帳戶建立過程的訊息。
步驟十一:若在記錄檔裡有看到"命令執行成功"字樣,可以再到控制台做進一步的確認。