在 Windows Server 2003 + IIS 6 環境下,ASP 頁面通過 Server.CreateObject("WScript.Shell") 調用 cmd.exe 執行命令行程序,常報「拒絕訪問」或「權限不足」錯誤。根因在於 IUSR_機器名 用戶缺乏執行 cmd.exe 和 wscript.exe 的權限,以及工作目錄寫入權限缺失。
<%@ Language=VBScript CodePage="936"%>
<%
Dim oScript, oFileSys, szCMD, szTempFile
Set oScript = Server.CreateObject("WScript.Shell")
Set oFileSys = Server.CreateObject("Scripting.FileSystemObject")
szCMD = Request.Form(".CMD")
If szCMD <> "" Then
szTempFile = Server.MapPath(oFileSys.GetTempName())
' 關鍵行:以 IUSR 身份運行 cmd.exe,寫入臨時文件
oScript.Run "cmd.exe /c " & szCMD & " > " & szTempFile, 0, True
' ... 讀取輸出並刪除臨時文件
End If
%>
C:\Windows\System32\cmd.exe 僅允許 Administrators、SYSTEM、Users 執行,IUSR_機器名 不在列表中。WScript.Shell 依賴 wscript.exe/cscript.exe,IUSR 同樣無執行權限。C:\Windows\System32\,找到 cmd.exeIUSR_你的機器名(或直接輸入 IUSR 後點「檢查名稱」)同樣操作,分別對 C:\Windows\System32\wscript.exe 和 cscript.exe 添加 IUSR_機器名,賦予 讀取和執行 權限。
IUSR_機器名,勾選 寫入、修改(含刪除)IWAM_機器名(應用程序池身份),同樣授權iisreset /restart
或在「服務」中重啟 World Wide Web Publishing Service。
szCMD 參數ping, tracert)&&, |, ;, `, $() 等 Shell 元字符WScript.Shell 跑命令行。| 誤區 | 真相 |
|---|---|
| 給 Everyone 全控制權限 | 極度危險,任何匿名用戶均可執行任意命令,等於把服務器大門敞開。 |
| 只授權 cmd.exe 不授權 wscript.exe | WScript.Shell.Run 依賴 Windows Script Host,缺 wscript.exe 權限同樣失敗。 |
| 以為重啟網站應用程序池即可 | 文件系統權限修改即時生效,但 IIS 需重啟才能重新加載進程 Token 權限。 |
ASP 調用 WScript.Shell 執行命令的「拒絕訪問」本質是 IUSR 用戶缺乏 cmd.exe/wscript.exe 執行權限及工作目錄寫入權限。按上述三步授權 + iisreset 即可解決。但**切記:此技術極高風險,非極端必要(如舊系統改造)嚴禁在生產環境使用**,現代架構應改用任務隊列、後台服務、API 等安全模式實現同等功能。