網頁

2013年12月12日

[php] 使用網頁操作建立Windows Server使用者帳戶

在網路上很容易找到用來建立Windows使用者帳戶的PHP腳本程式,這些腳本程式在Windows XP以前的作業系統,可以順利執行,而Windows Vista(含)以後的作業系統,卻都不能執行。

因為微軟在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」記錄檔,直接點擊兩次將檔案打開,可看到帳戶建立過程的訊息。

步驟十一:若在記錄檔裡有看到"命令執行成功"字樣,可以再到控制台做進一步的確認。