亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

為什么不由 PsExec 執行的遠程批處理文件是從使用函數 exec 的 PHP 腳本中運行的

為什么不由 PsExec 執行的遠程批處理文件是從使用函數 exec 的 PHP 腳本中運行的

PHP
慕容708150 2022-05-27 14:50:14
我目前面臨的問題是我想實現一個在遠程服務器上啟動批處理文件的 PHP 腳本。經過幾個小時的想法,我最接近的解決方案是本地服務器上的一個批處理文件,可以由 PHP 腳本啟動。但是,當通過 PHP 腳本啟動時,批處理文件不會以某種方式啟動遠程批處理文件。如果在c:\directoryapps\sub\classes\actions\test.bat本地雙擊啟動批處理文件,則遠程批處理文件c:\directory\sub\test.bat執行沒有問題PsExec。根據需要授予權限。我在 PHP 中使用以下代碼來啟動第一個批處理文件:$cmd = '"c:\\directoryapps\\sub\\classes\\actions\\test.bat"'; exec('cmd /c '.$cmd.' &');該批處理文件的代碼如下:"C:/Windows/System32/SysinternalsSuite/PsExec.exe" \\server -i -u **** -p **** c:\\directory\\sub\\test.bat我如何實現這個的工作版本?我還嘗試從 PHP 腳本中運行第一個批處理文件代碼,但成功率更低。
查看完整描述

1 回答

?
12345678_0001

TA貢獻1802條經驗 獲得超5個贊

主要問題是將Sysinternals Suite安裝到%SystemRoot%\System32. 這不是一個好的決定,并導致了這里的問題。

該目錄%SystemRoot%\System32適用于在 64 位 Windows 上的 64 位環境中執行的 64 位應用程序。

在 32 位環境中使用通常擴展為%SystemRoot%\System32的會導致 Windows文件系統重定向器重定向到分別擴展的 .C:\Windows\System32%SystemRoot%\SysWOW64C:\Windows\SysWOW64

%SystemRoot%\SysWOW64包含 32 位系統可執行文件,但不SysinternalsSuite包含 file的目錄PsExec.exe。

python.exe是一個 32 位的可執行文件。出于這個原因,僅cmd在 Python 腳本%SystemRoot%\SysWOW64\cmd.exe中啟動,該腳本是 32 位版本的 Windows 命令處理器。32 位cmd找不到C:\Windows\SysWOW64\SysinternalsSuite\PsExec.exe,所以psexec.exe根本不執行。

好吧,根本不需要開始cmd.exe運行一個只包含一個命令行的批處理文件,以psexec.exe在 32 位環境下以錯誤的路徑運行。

在 Python 腳本中使用就足夠了:

$args = '\\\\server -i -u "****" -p "****" "C:\\directory\\sub\\test.bat"';exec('C:\\Windows\\Sysnative\\SysinternalsSuite\\PsExec.exe '.$args.);

32 位使用此代碼在64 位 Windows 系統目錄的子目錄中使用適當的參數python.exe運行 32 位可執行文件。PsExec.exeSysinternalsSuite

特殊重定向Sysnative僅適用于在 32 位環境中執行的 32 位應用程序。請注意,Sysnative它既不是目錄也不是符號鏈接或硬鏈接。文件系統不包含Sysnative目錄中的條目C:\Windows。由于這個原因,不可能在批處理文件中使用,if exist %SystemRoot%\Sysnative或者if exist %SystemRoot%\Sysnative\因為這兩個條件總是評估為假。但if exist %SystemRoot%\Sysnative\cmd.exe可以在批處理文件中使用,以確定批處理文件是否在 64 位 Windows 上由 32 位 Windows 命令處理器處理,因為在此用例中條件評估為真。

我還建議閱讀 Microsoft 文檔頁面WOW64 Implementation Details and Registry Keys Affected by WOW64,以了解 32 位 Windows 仿真如何在 64 位 Windows 上工作。


一個小問題是附加&在 Windows 命令行的末尾。shell 腳本行末尾的 & 符號僅由 Unix/Linux/Mac shell 腳本解釋器解釋為在后臺運行分離的可執行文件的指令。因此,shell 腳本解釋器不會在腳本繼續之前或用戶可以輸入下一個要執行的命令之前等待已啟動的可執行文件終止。

Windows 命令處理器cmd.exe將雙引號參數字符串之外的 & 符號解釋為AND運算符,通常用于在一個命令行上指定多個命令,請參見使用 Windows 批處理文件的單行多命令。如果在&由 解釋的命令行上什么都沒有cmd.exe,Windows 命令處理器將忽略AND運算符。

因此,不要&在 Windows 命令行上附加。


命令行的批處理文件中還有兩個小問題:

"C:/Windows/System32/SysinternalsSuite/PsExec.exe" \\server -i -u **** -p **** c:\\directory\\sub\\test.bat

Windows 上的目錄分隔符\/Microsoft 在文檔頁面Naming Files, Paths, and Namespaces中的解釋不同。在將字符串傳遞給適當的文件系統函數之前,Windows 內核默認替換文件/文件夾字符串中的 all /by 。\但是 Linux/Mac 目錄分隔符的使用/仍然會導致意外行為。

例子:

在 Windows 命令提示符窗口中運行:

for %I in (C:/Windows/*.exe) do @echo %I

在 Windows 目錄中找到的可執行C:文件以不帶路徑的文件名輸出。因此,分配給循環變量I的是一個字符串,它引用驅動器當前目錄中的可執行文件C:。但是C:執行此命令行時驅動器上的當前目錄很可能不會C:\Windows導致真正處理分配給循環變量的文件名I而不是僅將其打印到控制臺窗口時出現問題。

現在在同一命令提示符窗口中運行:

for %I in (C:\Windows\*.exe) do @echo %I

輸出與以前相同的文件名,但這次使用完整路徑。

結論:不要/在 Windows 上的文件/文件夾字符串中使用,依賴于 Windows 內核的自動更正。/在 Windows 上主要用于選項的開頭。

在批處理文件中,兩個目錄名之間以及目錄名和文件名之間的用法\\也總是錯誤的,必須由 Windows 內核糾正,然后才能通過刪除一個反斜杠將文件/文件夾名稱字符串傳遞給文件系統。\\僅在UNC 路徑的開頭有效。


查看完整回答
反對 回復 2022-05-27
  • 1 回答
  • 0 關注
  • 169 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號