สูงสุด XP และ Server 2003 คุณสามารถใช้เครื่องมืออื่นที่รวมอยู่ (VBScript) - สคริปต์สองตัวต่อไปนี้ทำงานที่คุณต้องการ
อันดับแรกgetpwd.cmd:
@echo off
<nul: set /p passwd=Password:
for /f "delims=" %%i in ('cscript /nologo getpwd.vbs') do set passwd=%%i
echo.
จากนั้นgetpwd.vbs:
Set oScriptPW = CreateObject("ScriptPW.Password")
strPassword = oScriptPW.GetPassword()
Wscript.StdOut.WriteLine strPassword
getpwd.vbsเพียงใช้วัตถุรหัสผ่านเพื่อใส่รหัสผ่านของผู้ใช้และจากนั้นพิมพ์ออกมาตรฐาน (ย่อหน้าถัดไปจะอธิบายว่าทำไมไม่แสดงขึ้นใน terminal)
getpwd.cmdคำสั่งสคริปต์เป็น trickier บิต แต่มันเป็นพื้นทำงานดังนี้
เอฟเฟกต์ของ"<nul: set /p passwd=Password: "คำสั่งคือการส่งออกพรอมต์โดยไม่มีอักขระขึ้นบรรทัดต่อท้ายซึ่งเป็นวิธีที่แอบแฝงในการจำลอง "echo -n"คำสั่งจากbashเชลล์ มันตั้งค่าpasswdเป็นสตริงว่างเป็นผลข้างเคียงที่ไม่เกี่ยวข้องและไม่รอการป้อนข้อมูลเนื่องจากรับอินพุตจากnul:อุปกรณ์
"for /f "delims=" %%i in ('cscript /nologo getpwd.vbs') do set passwd=%%i"คำสั่งเป็นบิตยาก มันทำงาน VBScript กับไมโครซอฟท์ไม่มี "การโฆษณา" เพื่อให้การส่งออกเพียงบรรทัดคือรหัสผ่าน (จาก "Wscript.StdOut.WriteLine strPassword"VBscript
การตั้งค่าตัวคั่นเป็นอะไรไม่จำเป็นต้องจับบรรทัดอินพุตทั้งหมดด้วยช่องว่างมิฉะนั้นคุณจะได้คำแรก "for ... do set ..."บิตชุดpasswdจะเป็นเอาท์พุทรหัสผ่านที่เกิดขึ้นจริงจาก VBScript
จากนั้นเราจะสะท้อนบรรทัดว่าง (เพื่อยุติ"Password: "บรรทัด) และรหัสผ่านจะอยู่ในpasswdตัวแปรสภาพแวดล้อมหลังจากที่โค้ดทำงาน
ตอนนี้ดังที่ได้กล่าวไปแล้วscriptpw.dllใช้ได้ถึง XP / 2003 เท่านั้น ในการแก้ไขปัญหานี้คุณสามารถคัดลอกscriptpw.dllไฟล์จากWindows\System32โฟลเดอร์ของระบบ XP / 2003 ไปยังโฟลเดอร์Winnt\System32หรือWindows\System32ในระบบของคุณเอง เมื่อคัดลอก DLL แล้วคุณจะต้องลงทะเบียนโดยเรียกใช้:
regsvr32 scriptpw.dll
ในการลงทะเบียน DLL บน Vista และใหม่กว่าคุณจะต้องมีสิทธิ์ของผู้ดูแลระบบ ฉันยังไม่ได้ตรวจสอบความถูกต้องตามกฎหมายของการย้ายดังกล่าวดังนั้นผู้บรรยายในถ้ำ
หากคุณไม่กระตือรือร้นที่จะพยายามติดตามและลงทะเบียนไฟล์ DLL รุ่นเก่ามากเกินไป (เพื่อความสะดวกหรือเหตุผลทางกฎหมาย) มีอีกวิธีหนึ่ง Windows รุ่นที่ใหม่กว่า (รุ่นที่ไม่มี DLL ที่จำเป็น) ควรมี Powershell ให้คุณใช้งาน
cmd.exeและในความเป็นจริงคุณควรพิจารณาปรับสคริปต์ของคุณจะใช้มันได้อย่างเต็มที่เนื่องจากเป็นภาษาสคริปต์ที่มีความสามารถมากขึ้นกว่า อย่างไรก็ตามหากคุณต้องการเก็บโค้ดจำนวนมากไว้เป็นcmd.exeสคริปต์ (เช่นหากคุณมีโค้ดจำนวนมากที่ไม่ต้องการแปลง) คุณสามารถใช้เคล็ดลับเดียวกันได้
ขั้นแรกให้แก้ไขcmdสคริปต์เพื่อให้เรียกว่า Powershell แทนที่จะเป็น CScript:
@echo off
for /f "delims=" %%i in ('powershell -file getpwd.ps1') do set passwd=%%i
สคริปต์ Powershell นั้นง่ายพอ ๆ กัน:
$password = Read-Host "Enter password" -AsSecureString
$password = [Runtime.InteropServices.Marshal]::SecureStringToBSTR($password)
$password = [Runtime.InteropServices.Marshal]::PtrToStringAuto($password)
echo $password
แม้ว่าจะมีมาร์แชลลิ่งเพื่อรับข้อความรหัสผ่านจริง
โปรดจำไว้ว่าในการเรียกใช้สคริปต์ Powershell ในเครื่องที่ไม่ได้ลงนามในเครื่องของคุณคุณอาจต้องแก้ไขนโยบายการดำเนินการจากค่าเริ่มต้น (draconian แม้ว่าจะปลอดภัยมาก) โดยมีสิ่งต่างๆเช่น:
set-executionpolicy remotesigned
จากภายใน Powershell เอง