2016-11-22 33 views
2

我有一个批处理文件,它接受用户输入的密码。由于某种原因,它不需要最后一个字符,我无法弄清楚。批处理文件中未设置最后一个字符的密码

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 psexec \\%computerName% -u %domainName%\%userName% -p %password% cmd 

我知道这是不是PowerShell命令,因为我与set /p password="Enter password: "测试它仍然无法呼应的最后一个字符。

按我的意见,如果我使用的语句这里是:

set /P domainName= 
    set params = %*:"=""?! 
    if "%domainName%" == "1" (
     set "domainName=domain1" 
     goto nextstep 
    ) 
    if "%domainName%" == "2" (
     set "domainName=domain2" 
     goto nextstep 
    ) 
    if "%domainName%" == "3" (
     set "domainName=domain3" 
     goto nextstep 
    ) else (
     goto resetfile 
    ) 

    :nextstep 

我的问题是2的3个领域,PSEXEC运行的那个。对于domain1,它不会运行。我回应了这个命令,并且它完美地打印出来。当我从命令中删除echo时,它跳过所有这些并重新启动文件。

nextstep是:

:nextstep 
    set /p userName="Enter your Admin username: " 
    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 
    psexec \\%computerName% -u %domainName%\%userName% -p %password% cmd 
    :resetfile 
    set resetfile= 
    set /p resetfile="Do you want to restart this file? Press 'y' for Yes or 'n' for No then Press ENTER: " 
    if not '%resetfile%'=='' set resetfile=%resetfile:~0,1% 
    if '%resetfile%'=='y' goto start 

脚本甚至没有问我是否要重新启动脚本。它只是回到:start,这是在脚本的开始。

请帮忙,谢谢!

+0

使用它,我想密码的最后一个字符是像'&^%'或'!'特殊字符和延迟扩充被启用。尝试'echo psexec.exe“\\%computerName%”-u“%domainName%\%userName%”-p“%password%”cmd“。任何情况下,执行'psexec.exe'都应该使用双引号。但是,如果密码包含启用延迟扩展的'%'或'!',则最好使用'echo psexec.exe“\\%computerName%”-u“%domainName%\%userName%”-p“!password!” cmd“,当然还有'setlocal EnableDelayedExpansion'。 – Mofi

+4

老实说,难道你不能只是从PowerShell运行psexec,而不是做一个让SecureString再次变得不安全的糟糕舞蹈吗? – Joey

+0

@joey我想我可以。 –

回答

0

首先尝试这与您的密码,看它是否是完整的

setlocal EnableDelayedExpansion 
set /p password= 
echo my password '!password!' 

如果仍然失败,必须有参与非ASCII字符。
然后你应该改变与chcp的代码页。

然后你就可以与您的代码

psexec \\%computerName% -u %domainName%\%userName% -p !password! cmd 
+0

除非设置和读取变量发生在同一块('if','for'),否则不需要'EnableDelayedExpansion'。 – Melebius

+5

@Melebius尝试没有延迟扩展和我的默认密码'^ 1&“&',那么你知道你为什么要使用延迟扩展 – jeb

+0

@jeb @Melebius我实际上有'setlocal EnableDelayedExpansion'在我的文件中,但我删除它,现在,我的问题是,脚本中的3个域中有2个运行了psexec comamd,但是对于一个域,它不起作用,我可能需要提出一个新问题。出来psexec命令,它打印正确,没有任何拼写错误,我将添加我在问题中使用的if语句 –