ฉันเชื่อว่าสิ่งต่อไปนี้เป็นระบบกันกระสุนหากผู้ใช้มีการเข้าถึงจุด WMIC และ TEMP ไปยังเส้นทางที่ถูกต้องที่ผู้ใช้มีสิทธิ์ในการเขียน นี้เป็นผลสิ้นสุดของบางส่วนทำงานร่วมกันที่http://www.dostips.com/forum/viewtopic.php?f=3&t=6133
@echo off
:getPID [RtnVar]
::
:: Store the Process ID (PID) of the currently running script in environment variable RtnVar.
:: If called without any argument, then simply write the PID to stdout.
::
setlocal disableDelayedExpansion
:getLock
set "lock=%temp%\%~nx0.%time::=.%.lock"
set "uid=%lock:\=:b%"
set "uid=%uid:,=:c%"
set "uid=%uid:'=:q%"
set "uid=%uid:_=:u%"
setlocal enableDelayedExpansion
set "uid=!uid:%%=:p!"
endlocal & set "uid=%uid%"
2>nul ( 9>"%lock%" (
for /f "skip=1" %%A in (
'wmic process where "name='cmd.exe' and CommandLine like '%%<%uid%>%%'" get ParentProcessID'
) do for %%B in (%%A) do set "PID=%%B"
(call )
))||goto :getLock
del "%lock%" 2>nul
endlocal & if "%~1" equ "" (echo(%PID%) else set "%~1=%PID%"
exit /b
สคริปต์สร้างการล็อคแบบเอกสิทธิ์เฉพาะบุคคลในไฟล์ชั่วคราวที่รวมเวลาปัจจุบันไว้ในชื่อ อาจมีการชนกันได้ถ้าสองอย่างเช่นกระบวนการแบทช์ที่มีชื่อพยายามที่จะได้รับ PID ภายในช่วงเวลา 0.01 วินาทีเดียวกันซึ่งในกรณีเดียวจะประสบความสำเร็จ
กระบวนการใด ๆ ที่ล้มเหลวจะวนซ้ำและลองอีกครั้งด้วยพา ธ ล็อกไฟล์ใหม่จนกว่าจะสำเร็จ
พา ธ แบบเต็มไปยังไฟล์ล็อกถูกเปลี่ยนเป็น ID เฉพาะที่สามารถใช้ในแบบสอบถาม WMIC WMIC ถูกเรียกใช้ภายในคำสั่ง FOR / F ซึ่งหมายความว่ามันกำลังทำงานอยู่ในกระบวนการ child cmd.exe นั่นคือเหตุผลที่ ParentProcessID ของกระบวนการ cmd.exe ถูกดึง