在 Web 環境下透過 PHP 新增 Windows 系統使用者,屬於高權限操作,必須嚴謹評估安全風險。執行 PHP 的使用者需具備管理員權限,且 php.ini 不得啟用安全模式,同時需開放 system()、exec()、passthru() 等函數。本文提供兩種實作方式,適用於 Windows 2000/XP/2003 環境。
若使用 IIS(微軟 Web 伺服器平台),PHP 執行身份為 IUSR_電腦名 與 IWAM_電腦名,需將這兩個帳號加入 Administrators 群組。警告:此做法會嚴重降低伺服器安全性,生產環境強烈不建議。
Apache(Unix 平台最流行的 Web 伺服器平台)安裝為服務後以 System 權限執行,PHP 即擁有最高權限。若修改執行身份,務必指定為 Administrator 或 System 權限帳號。
<?php
define('USER_GROUP', 'Users'); // 預設使用者群組
define('ACTIVE', 'YES'); // 建立後立即啟用
// 假設從 user_info 資料表讀取帳號密碼
$sql = "SELECT user, password FROM user_info";
$result = mysql_query($sql) or die("資料庫查詢失敗");
while ($row = mysql_fetch_array($result)) {
if (!function_exists('system')) {
die('system() 函數不存在,無法新增使用者');
}
// 新增本地使用者
@system("net user {$row['user']} {$row['password']} /active:" . ACTIVE . " /add");
// 移除預設 Users 群組再加入指定群組
@system("net localgroup Users {$row['user']} /delete");
@system("net localgroup " . USER_GROUP . " {$row['user']} /add");
}
?>
注意:此範例使用已棄用的 mysql_* 函數,現代專案請改用 PDO 或 MySQLi,並務必對輸入進行嚴格驗證與跳脫處理,防止指令注入攻擊。
此方式避免 Web 伺服器進程擁有高權限,透過排程任務定期執行,安全性較高。
c:\test.php<?php
@system("net user heiyeluren test /add");
?>
c:\php\php.exe c:\test.php
若顯示「命令成功完成」,即表示機制正常。實際部署時,可將方案一的同步邏輯移至此腳本,配合 Windows 排程器定期執行。
Web 直接操作系統帳號風險極高,生產環境應優先考慮方案二或專用同步服務。任何涉及系統級操作的功能,都應遵循最小權限原則,並建立完善的存取控制與稽核機制。