Bir yarasa dosyasındaki bir girdi metnini maskeleyebilir miyim?


102

Diğer bazı programları çalıştırmak için bir toplu iş dosyası yazıyorum. Bu durumda bir parola istemem gerekiyor. Giriş metnini maskelemek için herhangi bir yolum var mı? Giriş karakterleri yerine ******* karakterleri yazdırmam gerekmiyor. Linux'un Parola istemi davranışı (Yazarken hiçbir şey yazdırma) yeterlidir.

@echo off
SET /P variable=Password : 
echo %variable%
Pause

Bu, girişi okuyacak, ancak bu yaklaşımı kullanarak metni maskeleyemiyorum.


Yanıtlar:


50

XP ve Server 2003'e kadar, başka bir araçtan (VBScript) yararlanabilirsiniz - aşağıdaki iki komut dosyası istediğiniz işi yapar.

İlk olarak getpwd.cmd:

@echo off
<nul: set /p passwd=Password: 
for /f "delims=" %%i in ('cscript /nologo getpwd.vbs') do set passwd=%%i
echo.

Daha sonra getpwd.vbs:

Set oScriptPW = CreateObject("ScriptPW.Password")
strPassword = oScriptPW.GetPassword()
Wscript.StdOut.WriteLine strPassword

getpwd.vbsBasitçe girişine kullanıcıdan şifreyi şifre nesnesini kullanır ve sonra (yani terminalde görünmüyor neden sonraki paragraf açıklayacağız) standart çıkışa yazdırmak.

getpwd.cmdKomut komut biraz daha zordur ama temelde aşağıdaki gibi çalışır.

"<nul: set /p passwd=Password: "Komutun etkisi, komut isteminin sonunda satırsonu karakteri olmadan çıktısını almaktır - bu, "echo -n"komutu bashkabuktan taklit etmenin sinsi bir yoludur . passwdAlakasız bir yan etki olarak boş bir dizeye ayarlar ve nul:cihazdan girdi aldığı için girdi beklemiyor .

"for /f "delims=" %%i in ('cscript /nologo getpwd.vbs') do set passwd=%%i"İfadesi en zor biraz. VBScript'i Microsoft "reklamı" olmadan çalıştırır, böylece tek satır çıktısı paroladır (VBscript'ten "Wscript.StdOut.WriteLine strPassword".

Sınırlayıcıları hiçbir şeye ayarlamak boşluklarla tüm bir giriş satırını yakalamak için gerekli değildir, aksi takdirde sadece ilk kelimeyi alırsınız. "for ... do set ..."Bit setleri passwdVBScript gerçek şifre çıktısı olması.

Ardından boş bir satırı yansıtırız (satırı sonlandırmak için "Password: ") ve passwdkod çalıştırıldıktan sonra şifre ortam değişkeninde olur.


Şimdi, belirtildiği gibi scriptpw.dll, yalnızca XP / 2003'e kadar kullanılabilir. Bunu düzeltmek için, scriptpw.dlldosyayı Windows\System32bir XP / 2003 sisteminin klasöründen kendi sisteminizdeki Winnt\System32veya Windows\System32klasörüne kopyalayabilirsiniz. DLL kopyalandıktan sonra, şunu çalıştırarak kaydetmeniz gerekir:

regsvr32 scriptpw.dll

DLL'yi Vista ve sonraki sürümlere başarıyla kaydettirmek için yönetici ayrıcalıklarına ihtiyacınız olacaktır. Mağara bekçisi böyle bir hareketin yasallığını incelemedim.


Eski DLL dosyalarını bulmaya ve kaydetmeye fazla hevesli değilseniz (kolaylık veya yasal nedenlerle), başka bir yol var. Windows'un sonraki sürümlerinde (olanları yok gerekli DLL) size Powershell mevcut olmalıdır.

Ve aslında, komut dosyalarınızı tam olarak kullanacak şekilde yükseltmeyi düşünmelisiniz çünkü bu, bundan çok daha yetenekli bir betik dili cmd.exe. Bununla birlikte, kodunuzun büyük bir kısmını cmd.exekomut dosyaları olarak tutmak istiyorsanız (örneğin, dönüştürmek istemediğiniz çok sayıda kodunuz varsa), aynı numarayı kullanabilirsiniz.

İlk olarak, cmdkomut dosyasını CScript yerine Powershell'i çağıracak şekilde değiştirin :

@echo off
for /f "delims=" %%i in ('powershell -file getpwd.ps1') do set passwd=%%i

Powershell betiği de aynı derecede basittir:

$password = Read-Host "Enter password" -AsSecureString
$password = [Runtime.InteropServices.Marshal]::SecureStringToBSTR($password)
$password = [Runtime.InteropServices.Marshal]::PtrToStringAuto($password)
echo $password

gerçek şifre metnini almak için biraz sıralama olsa da.

Makinenizde yerel imzasız Powershell komut dosyalarını çalıştırmak için, yürütme politikasını (çok güvenli olsa da) varsayılandan aşağıdaki gibi değiştirmeniz gerekebileceğini unutmayın:

set-executionpolicy remotesigned

Powershell'in içinden.


2
Whoa, bu <nul: set / p gerçekten harika. Şimdiye kadar bilmiyordum :-). Ancak VBScript benim için çalışmıyor: Microsoft VBScript çalışma zamanı hatası: ActiveX bileşeni nesneyi oluşturamıyor: 'ScriptPW.Password'. Windows 7 Beta x64 burada.
Joey

İlginç, XP'den itibaren mevcut olması gerekiyordu. Win7'nin orada çalışmıyorsa henüz tam olarak bitmemiş olduğundan şüpheleniyorum (veya çalışması için başka bir numara yapmanız gerekiyor). Biraz araştırma nedenini gösteriyor: güncellememe bakın.
paxdiablo

2
Güzel. Ayrıca, VBS dosyasını komut satırından çağrılabilen herhangi bir eşdeğer dil ile değiştirebileceğinizi de unutmamak gerekir. Örneğin, getpass import getpass; pwd = getpass (); print pwd; "'
Cerin

1
Bu soru yeni olduğunda eskiden bu yolu kullanırdım - aşağıda fazladan komut dosyası olmadan yapmanın bir yolunu yanıtladım .
unlemeat

1
@Bill: "Şimdi, maalesef ..." şeklinde başlayan bölümüm :-) Ancak, umarım daha iyi hale getirmek için cevaba daha fazla seçenek ekledim. Özellikle, powershell'in kullanımı scriptpw.dll.
paxdiablo

153

Evet - 4 yıl geciktim.

Ancak bunu harici bir komut dosyası oluşturmak zorunda kalmadan tek satırda yapmanın bir yolunu buldum; bir toplu iş dosyasından powershell komutlarını çağırarak.

TessellatingHeckler sayesinde - bir metin dosyasına çıktı göndermeden (powershell komutunu bir değişkende ayarladım, çünkü bir for döngüsü içindeki uzun bir satırda oldukça dağınık).

@echo off
set "psCommand=powershell -Command "$pword = read-host 'Enter Password' -AsSecureString ; ^
    $BSTR=[System.Runtime.InteropServices.Marshal]::SecureStringToBSTR($pword); ^
        [System.Runtime.InteropServices.Marshal]::PtrToStringAuto($BSTR)""
for /f "usebackq delims=" %%p in (`%psCommand%`) do set password=%%p
echo %password%

Başlangıçta bir metin dosyasına çıktı olarak yazdım, sonra o metin dosyasından okudum. Ancak yukarıdaki yöntem daha iyidir. Son derece uzun, neredeyse anlaşılmaz bir satırda:

@echo off
powershell -Command $pword = read-host "Enter password" -AsSecureString ; $BSTR=[System.Runtime.InteropServices.Marshal]::SecureStringToBSTR($pword) ; [System.Runtime.InteropServices.Marshal]::PtrToStringAuto($BSTR) > .tmp.txt & set /p password=<.tmp.txt & del .tmp.txt
echo %password%

Bunu parçalayacağım - imleci kullanarak birkaç satıra bölebilirsiniz ^ , ki bu çok daha hoş ...

@echo off
powershell -Command $pword = read-host "Enter password" -AsSecureString ; ^
    $BSTR=[System.Runtime.InteropServices.Marshal]::SecureStringToBSTR($pword) ; ^
        [System.Runtime.InteropServices.Marshal]::PtrToStringAuto($BSTR) > .tmp.txt 
set /p password=<.tmp.txt & del .tmp.txt
echo %password%

Bu makale powershell komutlarının ne yaptığını açıklar; temelde kullanarak girdi alır Read-Host -AsSecureString- aşağıdaki iki satır, bu güvenli dizeyi tekrar düz metne dönüştürür, çıktı (düz metin parolası) daha sonra >.tmp.txt. Bu dosya daha sonra bir değişkene okunur ve silinir.


5
Orijinal cevap harikaydı, ama bence bu artık kesin cevap olmalı
James Wiseman

30
Bu harika. Ancak düz metin parolasını diske kaydetme biçimi beni rahatsız ediyor. Bunu yerine bunu yaparak yapmaktan kaçının: for /f "usebackq tokens=*" %%p in (``powershell -Command "$pword = read-host 'Enter Password' -AsSecureString ; $BSTR=[System.Runtime.InteropServices.Marshal]::SecureStringToBSTR($pword); [System.Runtime.InteropServices.Marshal]::PtrToStringAuto($BSTR)"``) do set password=%%pve sonra echo %password%. NB. Bu yorumu, geri tepelerden düzgün bir şekilde kaçmak için alamıyorum - "powershell" den önce ve sondan önce ")" iki geri işarettir, ancak bir ters işaret olmalıdır.
TessellatingHeckler

1
@TessellatingHeckler İyi fikir, cevabımı güncelledim. Önerinizin biraz değiştirilmiş bir versiyonu. Teşekkürler.
unlemeat

Bu yöntemin her tuşa basışta "*" (yıldız) yankılamasını durdurmak mümkün müdür? yani bir gözlemcinin şifrenin ne kadar uzun olduğunu bilmesini istemiyorum.
Sam Hasler

1
@RegieBaguio Hayır, Powershell'in etkinleştirilmesi gerekir. Aşağıdaki npocmaka'nın saf Batch çözümüne bir göz atın. Bu çok daha karmaşık ama sizin için çalışmalı.
unlemeat

26

1. (ab) XCOPYkomutunu kullanan ve burada/P /L bulunan anahtarlarını kullanan saf toplu çözüm ( bu konuda bazı iyileştirmeler burada bulunabilir ):

:: Hidden.cmd
::Tom Lavedas, 02/05/2013, 02/20/2013
::Carlos, 02/22/2013
::https://groups.google.com/forum/#!topic/alt.msdos.batch.nt/f7mb_f99lYI


@Echo Off
:HInput
SetLocal EnableExtensions EnableDelayedExpansion
Set "FILE=%Temp%.\T"
Set "FILE=.\T"
Keys List >"%File%"
Set /P "=Hidden text ending with Ctrl-C?: " <Nul
Echo.
Set "HInput="
:HInput_
For /F "tokens=1* delims=?" %%A In (
 '"Xcopy /P /L "%FILE%" "%FILE%" 2>Nul"'
) Do (
  Set "Text=%%B"
  If Defined Text (
    Set "Char=!Text:~1,1!"
    Set "Intro=1"
    For /F delims^=^ eol^= %%Z in ("!Char!") Do Set "Intro=0"
    Rem If press Intro
    If 1 Equ !Intro! Goto :HInput#
    Set "HInput=!HInput!!Char!"
  )
)
Goto :HInput_
:HInput#
Echo(!HInput!
Goto :Eof 

1.2 Değiştirme komutuna dayalı başka bir yol

@Echo Off
SetLocal EnableExtensions EnableDelayedExpansion

Set /P "=Enter a Password:" < Nul
Call :PasswordInput
Echo(Your input was:!Line!

Goto :Eof

:PasswordInput
::Author: Carlos Montiers Aguilera
::Last updated: 20150401. Created: 20150401.
::Set in variable Line a input password
For /F skip^=1^ delims^=^ eol^= %%# in (
'"Echo(|Replace.exe "%~f0" . /U /W"') Do Set "CR=%%#"
For /F %%# In (
'"Prompt $H &For %%_ In (_) Do Rem"') Do Set "BS=%%#"
Set "Line="
:_PasswordInput_Kbd
Set "CHR=" & For /F skip^=1^ delims^=^ eol^= %%# in (
'Replace.exe "%~f0" . /U /W') Do Set "CHR=%%#"
If !CHR!==!CR! Echo(&Goto :Eof
If !CHR!==!BS! (If Defined Line (Set /P "=!BS! !BS!" <Nul
Set "Line=!Line:~0,-1!"
)
) Else (Set /P "=*" <Nul
If !CHR!==! (Set "Line=!Line!^!"
) Else Set "Line=!Line!!CHR!"
)
Goto :_PasswordInput_Kbd

2. HTA açılır penceresini kullanan parola göndericisi . Bu bir hybrit .bat / jscript / mshta dosyasıdır ve .bat olarak kaydedilmelidir :

<!-- :
:: PasswordSubmitter.bat
@echo off
for /f "tokens=* delims=" %%p in ('mshta.exe "%~f0"') do (
    set "pass=%%p"
)

echo your password is %pass%
exit /b
-->

<html>
<head><title>Password submitter</title></head>
<body>

    <script language='javascript' >
        window.resizeTo(300,150);
        function entperPressed(e){
                if (e.keyCode == 13) {
                    pipePass();
                }
        }
        function pipePass() {
            var pass=document.getElementById('pass').value;
            var fso= new ActiveXObject('Scripting.FileSystemObject').GetStandardStream(1);
            close(fso.Write(pass));

        }
    </script>

    <input type='password' name='pass' size='15' onkeypress="return entperPressed(event)" ></input>
    <hr>
    <button onclick='pipePass()'>Submit</button>

</body>
</html>

3. Kendi kendine derlenen .net hibrit .Again olarak kaydedilmelidir .bat. Diğer çözümlerden farklı olarak, çağrılacak küçük bir .exe dosyası oluşturacak / derleyecektir (isterseniz silebilirsiniz). Ayrıca kurulu .net çerçevesi gerektirir, ancak bu bir sorun değildir:

@if (@X)==(@Y) @end /* JScript comment
@echo off
setlocal enableDelayedExpansion

for /f "tokens=* delims=" %%v in ('dir /b /s /a:-d  /o:-n "%SystemRoot%\Microsoft.NET\Framework\*jsc.exe"') do (
   set "jsc=%%v"
)

if not exist "%~n0.exe" (
    "%jsc%" /nologo /out:"%~n0.exe" "%~dpsfnx0"
)

for /f "tokens=* delims=" %%p in ('"%~n0.exe"') do (
    set "pass=%%p"
)

echo your password is !pass!

endlocal & exit /b %errorlevel%

*/



import System;



var pwd = "";
var key;

Console.Error.Write("Enter password: ");

        do {
           key = Console.ReadKey(true);

           if ( (key.KeyChar.ToString().charCodeAt(0)) >= 20 && (key.KeyChar.ToString().charCodeAt(0) <= 126) ) {
              pwd=pwd+(key.KeyChar.ToString());
              Console.Error.Write("*");
           }

           if ( key.Key == ConsoleKey.Backspace && pwd.Length > 0 ) {
               pwd=pwd.Remove(pwd.Length-1);
               Console.Error.Write("\b \b");
           }


        } while (key.Key != ConsoleKey.Enter);
        Console.Error.WriteLine();
        Console.WriteLine(pwd);

6
Keskin duyum, özellikle melezde karıncalanma!
Mark K Cowan

2
Bu ilk çözüm çok zekice - güzel bir +1.
unclemeat

Değiştir komutunu temel alan 2.1 yöntemi, hızlı yazarsanız
tuşlara basılamayacak

@SamHasler - evet, bunu düzeltmeye çalışacağım. 2.1.0 ile sorunu yeniden oluşturamamasına rağmen Ayrıca, girişin basılı olup olmadığını kontrol etmek için HTA'yı da güncelledim.
npocmaka

1
@npocmaka 1.2 yönteminin son sürümü (Son güncelleme: 20150405) burada: consolesoft.com/batch/password_input/password_input.cmd
carlos

16

Muhtemelen yapardım:

..
echo Before you enter your password, make sure no-one is looking!
set /P password=Password:  
cls
echo Thanks, got that.
.. 

Böylece bir uyarı alırsınız, ardından girildikten sonra ekran temizlenir.

Toplu iş dosyası bir komut isteminden çalıştırılırsa, girilen parolanın CMD geçmişinde saklanacağını unutmayın (Teşekkürler @Mark K Cowan ).

Yeterince iyi değilse, ya python'a geçer ya da komut dosyası yerine çalıştırılabilir bir dosya yazardım.

Bunların hiçbirinin mükemmel çözüm olmadığını biliyorum ama belki biri sizin için yeterince iyi :)


4
Toplu iş dosyası bir komut isteminden çalıştırılırsa, girilen parolanın CMD geçmişinde saklanacağını unutmayın. Cmd'nin iş için yanlış araç olduğunu söylediğiniz gibi olumsuz oy yok.
Mark K Cowan

Konsoldaki komut geçmişi sizin için önemli değilse, doskey /reinstallhemen ardından önceki komut arabelleğini temizlemek için çalıştırabilirsiniz cls.
RuntimeException

1
doskey / yeniden yüklemeyi kullanmak ve komut geçmişini temizlemek istemiyorsanız, başka bir seçenek yukarıdaki kodu ayrı bir terminal penceresinde çalıştırıp hemen çıkmanızdır. Yazdığınız String'inizi yıldızlarla değiştirmediğini unutmayın. Yukarıdaki çözüm, powershell'i çalıştırmak istemiyorsanız bir seçenektir. C:\>start "console" cmd /c ireadconsole.bat
RuntimeException

9

Her tür biçimlendirilmiş girdi için ReadFormattedLine alt yordamını kullanabilirsiniz. Örneğin, aşağıdaki komut 8 karakterlik bir şifreyi okur, ekranda yıldız işaretlerini gösterir ve Enter tuşuna basmaya gerek kalmadan otomatik olarak devam eder:

call :ReadFormattedLine password="********" /M "Enter password (8 chars): "

Bu alt yordam saf Batch olarak yazılmıştır, bu nedenle herhangi bir ek program gerektirmez ve sadece sayıları okumak, harfleri büyük harfe dönüştürmek vb. Gibi çeşitli biçimlendirilmiş girdi işlemlerine izin verir. ReadFormattedLine alt yordamını Belirli bir biçime sahip bir satırı oku bölümünden indirebilirsiniz .


EDIT 2018-08-18 : "Görünmez" bir şifre girmek için yeni yöntem

FINDSTR komutu, bu komut karakterleri renkli göstermek için kullanıldığında VE böyle bir komutun çıktısı CON cihazına yeniden yönlendirildiğinde ortaya çıkan garip bir hataya sahiptir. Metni renkli göstermek için FINDSTR komutunun nasıl kullanıldığına ilişkin ayrıntılar için bu konuya bakın .

FINDSTR komutunun bu biçiminin çıktısı CON'a yeniden yönlendirildiğinde, metin istenen renkte çıktılandıktan sonra garip bir şey olur: bundan sonraki tüm metin "görünmez" karakterler olarak çıktılanır, ancak daha kesin bir açıklama, metnin siyah arka plan üzerine siyah metin olarak çıktı. Tüm ekranın ön plan ve arka plan renklerini sıfırlamak için COLOR komutunu kullanırsanız orijinal metin görünecektir. Bununla birlikte, metin "görünmez" olduğunda bir SET / P komutunu çalıştırabiliriz, böylece girilen tüm karakterler ekranda görünmez.

@echo off
setlocal

set /P "=_" < NUL > "Enter password"
findstr /A:1E /V "^$" "Enter password" NUL > CON
del "Enter password"
set /P "password="
cls
color 07
echo The password read is: "%password%"

5

diğer bir alternatif ise EditV32 (x86) veya EditV64 (x64) komut satırı araçlarım. Örneğin:

editv32 -m -p "Password: " PWD

-m "maskelenmiş girdi" anlamına gelir ve -p komut istemidir. Kullanıcının girişi PWD ortam değişkeninde saklanır. Buradan alabilirsiniz:

https://westmesatech.com/?page_id=19


5
Bu tek kapalı kaynaklı çözüm değildir (Windows kapalı kaynaktır!). Kullanmamakta özgürsünüz elbette ...
Bill_Stewart

Kaynak kodunun eksikliği sizi rahatsız ediyorsa, ReadLine.exe ile ilgili diğer cevabıma bakın .
Bill_Stewart

İyi bir! Lisans, onu kullanmanıza izin verir. Üstelik entegrasyonu kolaydır. Sadece çıkış kodunu işlemek için 1. Komut satırında hata, 2 Giriş satırı
boştu

Not: editenv32 / editenv64 ve readline yardımcı programlarının yerini, açık kaynak editenv kullanımı almıştır .
Bill_Stewart


3

Python yüklediyseniz, şunları kullanabilirsiniz:

for /f "delims=" %%A in ('python -c "import getpass; print(getpass.getpass('Enter the CVS password: '));"') do @set CVSPASS=%%A
echo PASS: %CVSPASS%

çıktı:

Enter the CVS password:
PASS: 123

2

Blorgbeard'ın yukarıdaki çözümünü kullandım ki bu bence gerçekten harika. Sonra bunu şu şekilde geliştirdim:

  1. Ansicon için Google
  2. Zip dosyasını ve örnek metin dosyasını indirin.
  3. Yükle (bu, 2 dosyayı system32'ye kopyalamak anlamına gelir)

Bunu şu şekilde kullanın:

@echo off
ansicon -p
set /p pwd=Password:ESC[0;37;47m
echo ESC[0m

Bu, parola girişiniz için konsolu griye çevirir ve işiniz bittiğinde geri döner. ESC aslında indirilen örnek metin dosyasından (Not Defteri'nde sol ok gibi görünür) toplu iş dosyanıza kopyalayabileceğiniz yazdırılamaz bir karakter olmalıdır. Tüm renk kombinasyonlarının kodlarını bulmak için örnek metin dosyasını kullanabilirsiniz.

Makinenin yöneticisi değilseniz, dosyaları muhtemelen sistem dışı bir dizine yükleyebileceksiniz, ardından programı çağırmadan ve kaçış dizilerini kullanmadan önce dizini komut dosyanızdaki PATH'ye eklemeniz gerekir. Yalnızca birkaç dosyadan oluşan yönetici olmayan dağıtılabilir bir pakete ihtiyacınız varsa, bu muhtemelen geçerli dizin bile olabilir.


Bunu test edemem, ancak yazılan parolanın daha sonra cmd geçmişinde görünmesini beklerim.
Mark K Cowan

@MarkKCowan Tam olarak böyle olur.
sjngm

1

görünmez karakterler için gerekli olanı çağıran bir toplu iş dosyası oluşturun ve ardından çağrılan toplu iş dosyası için bir kısayol oluşturun.

sağ tık

özellikleri

renkler

text == black

background == siyah

uygulamak

tamam

umut size yardımcı olur !!!!!!!!


Ortamı önceden ayarlamak zorunda kaldığı için toplu durumda her zaman pratik olmasa bile güzel yanlamasına düşünme yaklaşımı. Bir dakika, belki bu işe
yarar

1

GÜNCELLEME:
Girişleri gizlemek için cls kullanmak yerine yalnızca tek satırlık yeni bir açılır pencere oluşturan iki yeni yöntem ekledim.

Bunun dezavantajları, bir yöntemin (yöntem 2) kayıt defterinde gereksiz şeyler bırakmasıdır - "Uygun haklar olmadan çalıştırılırsa" ve diğer yöntem (yöntem üç) betiğe bazı önemsiz şeyler ekler. Söylemeye gerek yok, herhangi bir tmp dosyasına kolayca yazılabilir ve silinebilir, sadece bir alternatif bulmaya çalıştım.

Sınırlama: Parola yalnızca alfasayısal olabilir - başka karakter olamaz!

@echo off
if "%1"=="method%choice%" goto :method%choice%
::::::::::::::::::
::Your code here::
::::::::::::::::::
cls
echo :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
echo ::::                   Batch script to prompt for password!                 :::
echo :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
:choice
echo.
echo 1. First method
echo.
echo 2. Second method
echo.
echo 3. Third method
echo.
set/p choice=Choose a method: 
if "%choice%" gtr "3" echo. & echo invalid option & echo. & pause & goto choice

call :vars
    set options= %num%%smAlph%%cpAlph%
    set pwdLen=6

if "%choice%" == "1" (
    set /p=Password: <nul 
    for /l %%i in (1,1,%pwdLen%) do call :password
) else (
    start /wait cmd /c call "%~f0" method%choice%
    )

call :result%choice%


::just to see if it worked!
echo.
echo The Password you entered is: "%pwd%"&pause>nul

::::::::::::::::::
::More code here::
::::::::::::::::::
exit /b





:vars
set num=1234567890
set smAlph=abcdefghijklmnopqrstuvwxyz
set cpAlph=ABCDEFGHIJKLMNOPQRSTUVWXYZ
    set pwd=
goto :EOF


:method2
call :popUp
setx result %pwd% >nul
goto :EOF

:method3
call :popUp
    >> "%~f0" echo.
    >> "%~f0" echo :result%choice%
    >> "%~f0" echo set pwd=%pwd%
goto :EOF

:popUp
title Password
mode con lines=1 cols=30
color 5a
set /p=Password: <nul
for /l %%i in (1,1,%pwdLen%) do call :password
goto :EOF

:password
:: If you don't want case sensative remove "/cs" but remember to remove %cpAlph% from the %options%
choice /c %options% /n /cs >nul
    call SET pwd=%pwd%%%options:~%errorlevel%,1%%
    set /p =*<nul
GOTO :EOF


:result2
for /f "tokens=3" %%a in ('reg query hkcu\environment /v result') do set pwd=%%a
    setx result "" >nul
    reg delete hkcu\environment /v result /f >nul 2>&1
:result1
goto :EOF   
::You can delete from here whenever you want.

Güncelleme: Sachadee'nin gönderisini mükemmel buldum ve ona "pop-up" tuhaflığımı ekledim.

@Echo Off  
  SetLocal EnableDelayedExpansion
  if "%1"==":HInput" goto :HInput
  set r=r%random%
  start /wait cmd /c call "%~f0" :HInput

For /f "tokens=2,13 delims=, " %%a in (
    'tasklist /v /fo csv /fi "imagename eq cmd.exe"
    ^|findstr /v "Windows\\system32\\cmd.exe"
    ^|findstr "set /p=%r%"'
     ) do (
        set pid=%%a
        set Line=%%b
        set Line=!Line:%r%=!
        set Line=!Line:~,-2!
        )       
taskkill /pid %pid:"=%>nul
  goto :HIEnd


  :HInput
  SetLocal DisableDelayedExpansion
  title Password
  mode con lines=2 cols=30

Echo Enter your Code :
   Set "Line="
   For /F %%# In (
   '"Prompt;$H&For %%# in (1) Do Rem"'
   ) Do Set "BS=%%#"

  :HILoop
   Set "Key="
   For /F "delims=" %%# In (
   'Xcopy /W "%~f0" "%~f0" 2^>Nul'
   ) Do If Not Defined Key Set "Key=%%#"
   Set "Key=%Key:~-1%"
   SetLocal EnableDelayedExpansion
   If Not Defined Key start /min cmd /k mode con lines=1 cols=14 ^&set/p %r%!Line!=&exit
  If %BS%==^%Key% (Set /P "=%BS% %BS%" <Nul
   Set "Key="
   If Defined Line Set "Line=!Line:~0,-1!"
   ) Else Set /P "=*" <Nul
   If Not Defined Line (EndLocal &Set "Line=%Key%"
   ) Else For /F delims^=^ eol^= %%# In (
   "!Line!") Do EndLocal &Set "Line=%%#%Key%"
  Goto :HILoop

  :HIEnd
   Echo(
Echo Your code is :  "!Line!"
   Pause
   Goto :Eof

1

editenvEski editv32/ editv64yardımcı programlarımın yerine geçen açık kaynaklı bir program yazdım :

https://github.com/Bill-Stewart/editenv

--maskinput( -m) Seçeneği [*] Eğer (maske) daktilo girişi gizlemek sağlar ve (varsayılan karakter yapılandırılabilir bir karakteri vardır *); Örneğin:

editenv -m -p "Password: " PWD

--prompt( -p) Seçeneği bir giriş istemi belirtmenizi sağlar. Yukarıdakiler bir Password:komut istemi gösterecek ve bir şey girmenizi bekleyecektir. Yazılan karakterler olarak görünecektir *. basmak Ctrl+C programı 1223 çıkış koduyla sonlandırır.

İndirme burada:

https://github.com/Bill-Stewart/editenv/releases

[*] --maskinput( -m) Seçeneğinin güvenli olmadığını unutmayın - girilen dize ortama düz metin olarak girilir. Bu özellik yalnızca kolaylık sağlamak içindir.



-1
@echo off
color 0f
MODE CON COLS=132 LINES=50
:start
cls
choice /C ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789!?.# /N /CS /M Please enter your password to continue. (Valid characters include all letters, numbers, and ! ? .) Press # to submit: 
SET ecode=%ERRORLEVEL%
IF %ecode% EQU 66 goto submit
IF %ecode% EQU 1 SET out=A
IF %ecode% EQU 2 SET out=B
IF %ecode% EQU 3 SET out=C
IF %ecode% EQU 4 SET out=D
IF %ecode% EQU 5 SET out=E
IF %ecode% EQU 6 SET out=F
IF %ecode% EQU 7 SET out=G
IF %ecode% EQU 8 SET out=H
IF %ecode% EQU 9 SET out=I
IF %ecode% EQU 10 SET out=J
IF %ecode% EQU 11 SET out=K
IF %ecode% EQU 12 SET out=L
IF %ecode% EQU 13 SET out=M
IF %ecode% EQU 14 SET out=N
IF %ecode% EQU 15 SET out=O
IF %ecode% EQU 16 SET out=P
IF %ecode% EQU 17 SET out=Q
IF %ecode% EQU 18 SET out=R
IF %ecode% EQU 19 SET out=S
IF %ecode% EQU 20 SET out=T
IF %ecode% EQU 21 SET out=U
IF %ecode% EQU 22 SET out=V
IF %ecode% EQU 23 SET out=W
IF %ecode% EQU 24 SET out=X
IF %ecode% EQU 25 SET out=Y
IF %ecode% EQU 26 SET out=Z
IF %ecode% EQU 27 SET out=a
IF %ecode% EQU 28 SET out=b
IF %ecode% EQU 29 SET out=c
IF %ecode% EQU 30 SET out=d
IF %ecode% EQU 31 SET out=e
IF %ecode% EQU 32 SET out=f
IF %ecode% EQU 33 SET out=g
IF %ecode% EQU 34 SET out=h
IF %ecode% EQU 35 SET out=i
IF %ecode% EQU 36 SET out=j
IF %ecode% EQU 37 SET out=k
IF %ecode% EQU 38 SET out=l
IF %ecode% EQU 39 SET out=m
IF %ecode% EQU 40 SET out=n
IF %ecode% EQU 41 SET out=o
IF %ecode% EQU 42 SET out=p
IF %ecode% EQU 43 SET out=q
IF %ecode% EQU 44 SET out=r
IF %ecode% EQU 45 SET out=s
IF %ecode% EQU 46 SET out=t
IF %ecode% EQU 47 SET out=u
IF %ecode% EQU 48 SET out=v
IF %ecode% EQU 49 SET out=w
IF %ecode% EQU 50 SET out=x
IF %ecode% EQU 51 SET out=y
IF %ecode% EQU 52 SET out=z
IF %ecode% EQU 53 SET out=0
IF %ecode% EQU 54 SET out=1
IF %ecode% EQU 55 SET out=2
IF %ecode% EQU 56 SET out=3
IF %ecode% EQU 57 SET out=4
IF %ecode% EQU 58 SET out=5
IF %ecode% EQU 59 SET out=6
IF %ecode% EQU 60 SET out=7
IF %ecode% EQU 61 SET out=8
IF %ecode% EQU 62 SET out=9
IF %ecode% EQU 63 SET out=!
IF %ecode% EQU 64 SET out=?
IF %ecode% EQU 65 SET out=.
SET code=%out%
SET show=*
:loop
cls
choice /C ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789!?.# /N /CS /M Please enter your password to continue. (Valid characters include all letters, numbers, and ! ? .) Press # to submit: %code%
SET ecode=%ERRORLEVEL%
IF %ecode% EQU 66 goto submit
IF %ecode% EQU 1 SET out=A
IF %ecode% EQU 2 SET out=B
IF %ecode% EQU 3 SET out=C
IF %ecode% EQU 4 SET out=D
IF %ecode% EQU 5 SET out=E
IF %ecode% EQU 6 SET out=F
IF %ecode% EQU 7 SET out=G
IF %ecode% EQU 8 SET out=H
IF %ecode% EQU 9 SET out=I
IF %ecode% EQU 10 SET out=J
IF %ecode% EQU 11 SET out=K
IF %ecode% EQU 12 SET out=L
IF %ecode% EQU 13 SET out=M
IF %ecode% EQU 14 SET out=N
IF %ecode% EQU 15 SET out=O
IF %ecode% EQU 16 SET out=P
IF %ecode% EQU 17 SET out=Q
IF %ecode% EQU 18 SET out=R
IF %ecode% EQU 19 SET out=S
IF %ecode% EQU 20 SET out=T
IF %ecode% EQU 21 SET out=U
IF %ecode% EQU 22 SET out=V
IF %ecode% EQU 23 SET out=W
IF %ecode% EQU 24 SET out=X
IF %ecode% EQU 25 SET out=Y
IF %ecode% EQU 26 SET out=Z
IF %ecode% EQU 27 SET out=a
IF %ecode% EQU 28 SET out=b
IF %ecode% EQU 29 SET out=c
IF %ecode% EQU 30 SET out=d
IF %ecode% EQU 31 SET out=e
IF %ecode% EQU 32 SET out=f
IF %ecode% EQU 33 SET out=g
IF %ecode% EQU 34 SET out=h
IF %ecode% EQU 35 SET out=i
IF %ecode% EQU 36 SET out=j
IF %ecode% EQU 37 SET out=k
IF %ecode% EQU 38 SET out=l
IF %ecode% EQU 39 SET out=m
IF %ecode% EQU 40 SET out=n
IF %ecode% EQU 41 SET out=o
IF %ecode% EQU 42 SET out=p
IF %ecode% EQU 43 SET out=q
IF %ecode% EQU 44 SET out=r
IF %ecode% EQU 45 SET out=s
IF %ecode% EQU 46 SET out=t
IF %ecode% EQU 47 SET out=u
IF %ecode% EQU 48 SET out=v
IF %ecode% EQU 49 SET out=w
IF %ecode% EQU 50 SET out=x
IF %ecode% EQU 51 SET out=y
IF %ecode% EQU 52 SET out=z
IF %ecode% EQU 53 SET out=0
IF %ecode% EQU 54 SET out=1
IF %ecode% EQU 55 SET out=2
IF %ecode% EQU 56 SET out=3
IF %ecode% EQU 57 SET out=4
IF %ecode% EQU 58 SET out=5
IF %ecode% EQU 59 SET out=6
IF %ecode% EQU 60 SET out=7
IF %ecode% EQU 61 SET out=8
IF %ecode% EQU 62 SET out=9
IF %ecode% EQU 63 SET out=!
IF %ecode% EQU 64 SET out=?
IF %ecode% EQU 65 SET out=.
SET code=%code%%out%
SET show=%show%*
goto loop
:submit
cls
SET password=%code%
IF %password% EQU 0cZrocks! SET result=1
IF ELSE SET result=2
IF %result% EQU 1 echo password correct
IF %result% EQU 2 echo password incorrect
timeout /T 2 /NOBREAK >nul
cls
IF %result% EQU 1 goto end
IF ELSE goto start
:end

Kodu açıklamadınız ve sadece o kodu kopyaladınız. Ekranı yenilemeniz gerektiğinden ve şifrenin x karakter uzunluğunda olması gerektiğinden, bu bunu yapmanın iyi bir yolu değildir.
Anic17

-1

Blorgbeard ile aynı çizgide başka bir seçenek çıktı benzer bir şey kullanmaktır:

SET /P pw=C:\^>

^Kaçar >böylece standart gibi şifre istemi irade göz istemi teselli kıl söyledi.


1
Soru, parola isteminin nasıl gizleneceği / gizleneceği değil, yazarken parolanın görünmesini önlemektir. Yani bu, soruyu yanıtlamaz.
Stephan

Bağlandığım yanıt da (yazarken 13 olumlu oy içeriyor). Cevabım, bazıları için faydalı bir alternatif olabileceğinden (Blogbeard benim için olduğu gibi) bunu genişletiyor. (Yorum olarak
eklerdim

Bu iyi bir cevap değil. Parolayı maskelemiyor veya gizlemiyorsunuz. Lütfen iyi bir çözüm veya cevabınız olduğunda yorum yapın.
Anic17

-3

Bir toplu iş dosyasındaki parolaların nasıl maskeleneceği, hide.com çözümlerinin kullanılması ve hatta metni ve arka planı aynı renge çevirenlerle ilgili ağdaki tüm hantal çözümleri okudum. Hide.com çözümü düzgün çalışıyor, çok güvenli değil ve 64 bit Windows'ta çalışmıyor. Her neyse,% 100 Microsoft yardımcı programlarını kullanmanın bir yolu var!

Öncelikle kullanımımı açıklamama izin verin. Windows'ta otomatik olarak oturum açan yaklaşık 20 iş istasyonum var. Masaüstlerinde bir kısayolları var - klinik bir uygulamaya. Makineler kilitlendi, sağ tıklayamıyorlar, masaüstlerindeki tek kısayola erişmekten başka hiçbir şey yapamıyorlar. Bazen bir teknisyenin bazı hata ayıklama uygulamalarını başlatması, Windows gezginine göz atması ve autolog kullanıcı hesabını kapatmadan günlük dosyalarına bakması gerekir.

İşte benim yaptığım şey.

İstediğiniz gibi yapın, ancak iki toplu iş dosyamı kilitli bilgisayarın erişebildiği bir ağ paylaşımına koyuyorum.

Çözümüm, Windows'un 1 ana bileşenini kullanıyor - runalar. Oluşturmak üzere olduğunuz runas.bat için istemcilere bir kısayol ekleyin. Bilginize, müşterilerimde daha iyi görüntüleme amacıyla kısayolu yeniden adlandırdım ve simgeyi değiştirdim.

İki toplu iş dosyası oluşturmanız gerekecektir.

Toplu iş dosyalarına runas.bat ve Debug Support.bat adını verdim

runas.bat aşağıdaki kodu içerir:

cls
@echo off
TITLE CHECK CREDENTIALS 
goto menu

:menu
cls
echo.
echo           ....................................
echo            ~Written by Cajun Wonder 4/1/2010~
echo           ....................................
echo.
@set /p un=What is your domain username? 
if "%un%"=="PUT-YOUR-DOMAIN-USERNAME-HERE" goto debugsupport
if not "%un%"=="PUT-YOUR-DOMAIN-USERNAME-HERE" goto noaccess
echo.
:debugsupport
"%SYSTEMROOT%\system32\runas" /netonly /user:PUT-YOUR-DOMAIN-NAME-HERE\%un% "\\PUT-YOUR-NETWORK-SHARE-PATH-HERE\Debug Support.bat"
@echo ACCESS GRANTED! LAUNCHING THE DEBUG UTILITIES....
@ping -n 4 127.0.0.1 > NUL
goto quit
:noaccess
cls
@echo.
@echo.
@echo.
@echo.
@echo   \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
@echo   \\                                   \\
@echo   \\    Insufficient privileges         \\  
@echo   \\                                    \\
@echo   \\      Call Cajun Wonder             \\
@echo   \\                                    \\
@echo   \\              At                    \\
@echo   \\                                    \\
@echo   \\        555-555-5555                \\
@echo   \\                                    \\
@echo   \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
@ping -n 4 127.0.0.1 > NUL
goto quit
@pause
:quit
@exit

"% Un%" ise istediğiniz kadar ekleyebilirsiniz tüm kullanıcılar için ve eğer değil "% un%" size erişim vermek istiyorum. @Ping, bir saniye zamanlayıcı yapmanın coonass yoludur.

Böylece bu ilk toplu iş dosyasını halleder - oldukça basit, ha?

Debug Support.bat için kod:

cls
@echo off
TITLE SUPPORT UTILITIES
goto menu

:menu
cls
@echo %username%
echo.
echo           .....................................
echo            ~Written by Cajun Wonder 4/1/2010~
echo           .....................................
echo.
echo What do you want to do? 
echo.
echo [1]  Launch notepad
echo.

:choice
set /P C=[Option]? 
if "%C%"=="1" goto notepad
goto choice

:notepad
echo.
@echo starting notepad....
@ping -n 3 127.0.0.1 > NUL
start notepad
cls
goto menu

Ben bir kodlayıcı değilim ve yaklaşık bir yıl önce toplu komut dosyası yazmaya yeni başladım ve bu tur, bir toplu iş dosyasında bir parolayı maskelemeyi keşfettiğim yol oldukça harika!

Umarım benden başka birinin bundan yararlanabileceğini duymayı umuyorum!

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.