Pergunta

Eu estou escrevendo um arquivo de lote para executar alguns outros programas. Neste caso eu preciso para solicitar uma senha. Eu tenho alguma maneira de mascarar o texto de entrada. Eu não precisa imprimir ******* caracteres em vez de caracteres de entrada. Senha do Linux comportamento do prompt (Print nada enquanto digitação) é suficiente.

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

Isso vai ler a entrada, mas não posso mascarar o texto usando esta abordagem.

Foi útil?

Solução

Até XP e Server 2003, você pode fazer uso de outra ferramenta incluída (VBScript) -. Os dois scripts seguintes fazer o trabalho que você quer

Em primeiro lugar, getpwd.cmd:

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

Então, getpwd.vbs:

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

O getpwd.vbs simplesmente usa o objeto senha para inserir a senha do usuário e, em seguida, imprimi-lo para a saída padrão (o parágrafo seguinte vai explicar por que não aparece no terminal).

O script de comando getpwd.cmd é um pouco mais complicado, mas basicamente funciona da seguinte forma.

O efeito do comando "<nul: set /p passwd=Password: " é para a saída do tempo com nenhum personagem à direita de nova linha - é uma maneira sorrateira para emular o comando "echo -n" do shell bash. Ele define passwd para uma cadeia vazia como um efeito colateral irrelevante e não espera para a entrada, uma vez que está tomando sua entrada a partir do dispositivo nul:.

A declaração "for /f "delims=" %%i in ('cscript /nologo getpwd.vbs') do set passwd=%%i" é o pouco mais complicada. Corre-se o VBScript sem Microsoft "publicidade", de modo que a única saída de linha é a senha (do "Wscript.StdOut.WriteLine strPassword" VBScript.

Definir os delimitadores a nada é necessário para capturar toda uma linha de entrada com espaços, caso contrário, você começa apenas a primeira palavra. Os conjuntos "for ... do set ..." bit passwd ser a saída de senha real do VBScript.

Então nós eco de uma linha em branco (para terminar a linha "Password: ") ea senha será na variável de ambiente passwd após o código foi executado.


Agora, como mencionado, scriptpw.dll está disponível apenas até XP / 2003. A fim de corrigir esta situação, você pode simplesmente copiar o arquivo scriptpw.dll da pasta Windows\System32 de um sistema XP / 2003 para o Winnt\System32 ou pasta Windows\System32 em seu próprio sistema. Uma vez que a DLL foi copiado, será necessário registrá-lo com o comando:

regsvr32 scriptpw.dll

Para registrar com sucesso a DLL no Vista e, mais tarde, você terá privilégios de administrador. Eu não analisou a legalidade de tal medida um modo lector caverna.


Se você não estiver excessivamente que desejam a tentar rastrear e registrar arquivos DLL mais velhos (por conveniência ou razões legais), não há outra maneira. versões mais recentes do Windows (os que não ter o DLL necessário) deve ter PowerShell disponíveis para você.

E, na verdade, você realmente deve considerar atualizar seus scripts para usá-lo totalmente, já que é uma linguagem de script muito mais capaz do que cmd.exe. No entanto, se você quiser manter a maior parte de seu código como scripts cmd.exe (como se você tem um muito de código que você não deseja converter), você pode usar o mesmo truque.

Em primeiro lugar, modificar o script cmd por isso chama PowerShell em vez de CScript:

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

O script PowerShell é igualmente simples:

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

embora com alguma triagem para obter o texto real da senha.

Lembre-se que, para executar scripts do PowerShell não assinados locais em sua máquina, você pode precisar modificar a política de execução do (draconiana, embora muito segura) padrão, com algo como:

set-executionpolicy remotesigned

de dentro da própria PowerShell.

Outras dicas

Sim - eu sou 4 anos de atraso

.

Mas eu encontrei uma maneira de fazer isso em uma linha sem ter que criar um script externo; chamando comandos PowerShell a partir de um arquivo de lote.

Graças à TessellatingHeckler -. Sem saída para um arquivo de texto (I definir o comando PowerShell em uma variável, porque é bastante confuso em uma linha longa dentro de um loop)

@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%

Inicialmente eu escrevi para saída para um arquivo de texto, em seguida, ler a partir desse arquivo de texto. Mas o método acima é melhor. Em um tempo extremamente longo, perto da linha incompreensível:

@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%

Eu vou decompô-lo - você pode dividi-lo ao longo de algumas linhas usando ^ acento circunflexo, que é muito mais agradável ...

@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%

Este artigo explica o que os comandos do PowerShell estão fazendo; essencialmente fica entrada usando Read-Host -AsSecureString - as duas linhas seguintes converter essa volta corda segura em texto simples, a saída (senha de texto) é então enviada para um arquivo de texto usando >.tmp.txt. Esse arquivo é então lido em uma variável e excluídos.

solução lote 1.Pure que (ab) usa comando XCOPY e sua /P /L interruptores encontrados aqui (algumas melhorias nesta podia ser encontrada aqui ):

:: 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 Outra maneira baseado em substituir comando

@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

apresentador 2.Password que usa um pop-up HTA . Esta é uma hybrit .bat / JScript / arquivo MSHTA e deve ser salvo como um < a href = "https://github.com/npocmaka/batch.scripts/blob/master/hybrids/mshta/ui.extensions/passwordSubmiter.bat"> .bat :

<!-- :
:: 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. Um híbrido .NET auto-compilado .Again deve ser salvo como .bat .Em diferença com outros soluções que irá criar / compilar um pequeno arquivo .exe que será chamado (se quiser, você pode excluí-lo). Também requer instalado .NET Framework, mas isso é um pouco não um problema:

@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);

Eu provavelmente apenas fazer:

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

Assim, você receberá um aviso, depois as apaga o ecrã depois que entrou.

Note que a senha digitada será armazenada na história CMD se o arquivo batch é executado a partir de um prompt de comando (graças @ Mark K Cowan ).

Se isso não era bom o suficiente, eu teria quer mudar para python, ou escrever um executável em vez de um script.

Eu sei que nenhum destes são soutions perfeitos, mas talvez um é bom o suficiente para você:)

Outra alternativa é a minha EditV32 (x86) ou EditV64 (x64) ferramentas de linha de comando. Por exemplo:

editv32 -m -p "Password: " PWD

meios -m "mascarada entrada" e -p é o prompt. a entrada do usuário é armazenado na variável de ambiente PWD. Você pode obtê-lo aqui:

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

Se a falta de incomoda código fonte você, eu tenho outra alternativa.

@echo off
for /f "delims=" %%p in ('ReadLine -h -p "Enter password: "') do set PWD=%%p
echo You entered: %PWD%

Você pode obtê-lo a partir https://westmesatech.com/?page_id=49 . O código fonte está incluído.

Se você tem o Python instalado, você pode usar:

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

a saída:

Enter the CVS password:
PASS: 123

Você pode usar ReadFormattedLine sub-rotina para todo o tipo de entrada formatada. Por exemplo, o comando abaixo ler uma senha de 8 caracteres, asteriscos de exibição na tela, e continuar automaticamente, sem necessidade de pressionar Enter:

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

Esta sub-rotina é escrito em Batch pura para que ele não requer nenhum programa adicional, e permite que várias operações de entrada formatada, como números acabou de ler, letras converter para maiúsculas, etc. Você pode baixar ReadFormattedLine sub-rotina de Leia uma linha com formato específico.


EDIT 2018/08/18 : Novo método para digitar uma senha "invisível"

O comando FINDSTR tem um bug estranho que acontecerá quando este comando é usado para mostrar caracteres na cor e a saída desse comando um é redirecionada para o dispositivo CON. Para detalhes sobre como comando uso FINDSTR para mostrar texto em cores, consulte este tema .

Quando a saída desta forma de comando FINDSTR é redirecionado para CON, algo estranho acontece após o texto é emitido na cor desejada: todo o texto depois que ele é emitido como personagens "invisíveis", embora uma descrição mais precisa é que o texto é enviado como texto preto sobre o fundo preto. O texto original vai aparecer se você usar o comando COLOR para repor as cores de primeiro plano e de fundo do ecrã inteiro. No entanto, quando o texto é "invisível" que poderia executar um comando SET / P, para que todos os caracteres introduzidos não aparecerá na tela.

@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%"

Eu costumava solução acima de Blorgbeard que é realmente grande na minha opinião. Então eu aumentei-o como segue:

  1. Google para ansicon
  2. Baixar arquivo zip e arquivo de texto de exemplo.
  3. Instale (que significa copiar 2 arquivos em system32)

Use-o assim:

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

Isso alterna o console para cinza em cinzento para sua entrada de senha e volta quando tiver terminado. O CES deve realmente ser um caractere não imprimível, que você pode copiar a partir do arquivo de texto de exemplo baixado (aparece como uma seta para a esquerda no bloco de notas) em seu arquivo batch. Você pode usar o arquivo de texto de exemplo para encontrar os códigos para todas as combinações de cores.

Se você não é administrador da máquina, provavelmente você vai ser capaz de instalar os arquivos em um diretório não-sistema, então você tem que adicionar o diretório para o PATH em seu script antes de chamar o programa e usando as sequências de escape . Isso poderia até ser o diretório atual, provavelmente, se você precisar de um pacote de distribuição não-administrador de apenas alguns arquivos.

fazer um arquivo batch que chama o necessário para personagens invisíveis, em seguida, fazer um atalho para o arquivo de lote que está sendo chamado.

clique direito

Propriedades

cores

texto == preto

fundo == preto

se candidatar

ok

esperança, portanto, ajuda você !!!!!!!!

UPDATE:
Eu adicionei dois novos métodos que, em vez de utilizar cls para esconder a entrada eles criam um novo pop-up com uma linha única.

As desvantagens são que lixo um método (método 2) folhas no registro - "Se funcionar sem direitos adequados", eo outro (método de três) acrescenta algum lixo para o script. Escusado será dizer que ele pode facilmente ser escrito para qualquer arquivo tmp e eliminados Eu apenas tentei vir acima com uma alternativa.

Limitação: A senha só pode ser alfanumérico - há outros personagens

@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.

Update: Eu encontrei de sachadee post para ser perfeito e eu só adicionei meu capricho "pop-up" para ele.

@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

Isto pode ser um tema antigo, mas se você estiver usando o Windows Vista ou 7, eu tenho uma solução que vai funcionar muito bem. Eu fiz um vídeo dele aqui: http://www.youtube.com/watch?v=mk8uAa6PIFM

Pastebin para o arquivo batch é aqui

@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

Eu li todas as soluções desajeitados na net sobre como mascarar senhas em um arquivo de lote, os da utilização de uma solução hide.com e até mesmo os que fazem o texto eo fundo da mesma cor. A solução hide.com funciona decente, não é muito seguro, e ele não funciona no Windows de 64 bits. Então, de qualquer maneira, usando 100% utilitários da Microsoft, há uma maneira!

Em primeiro lugar, deixe-me explicar o meu uso. Tenho cerca de 20 estações de trabalho que logon automático para o Windows. Eles têm um atalho no seu desktop - para uma aplicação clínica. As máquinas são bloqueados, não pode clique direito, eles não podem fazer nada, mas o acesso a um atalho no seu desktop. Às vezes, é necessário que um técnico para chutar alguns depurar aplicativos, janelas de navegação Explorer e olhar para arquivos de log sem fazer login na conta de utilizador autolog off.

Então aqui está o que eu fiz.

Faça-o como quiser, mas eu coloquei meus dois arquivos em lote em um compartilhamento de rede que o computador bloqueado tem acesso.

A minha solução utiliza um componente principal do Windows - runas. Coloque um atalho nos clientes para o runas.bat você está prestes a criar. FYI, em meus clientes eu renomeado o atalho para fins de melhor visualização e mudou o ícone.

Você precisará criar dois arquivos em lote.

I nomeou os arquivos em lote runas.bat e Debug Support.bat

runas.bat contém o seguinte código:

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

Você pode adicionar como muitos se "% un%" e se não for "% un%" para todos os usuários que você quer dar acesso. O @ping é a minha maneira coonass de fazer um temporizador segundos.

Assim que cuida do primeiro arquivo de lote -? Muito simples eh

Aqui está o código para depuração Support.bat:

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

Eu não sou um programador e realmente só começou a entrar em scripting batch cerca de um ano atrás, e este círculo sobre a maneira que eu descobri de mascarar uma senha em um arquivo de lote é bastante impressionante!

Espero ouvir que alguém que não me é capaz de obter algum uso dele!

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top