2016-11-22 10 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 

私はset /p password="Enter password: "でそれをテストし、まだ最後の文字をエコーするために失敗したので、それはPowerShellコマンドではありません知っています。 。私の問題は、3つのドメインの2のために、PSEXECが実行されることである

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 

:私が使用した文の場合は、ここに私のコメントを1として

であり、 domain1の場合、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! "以前はもちろん 'setlocal EnableDelayedExpansion'を使って' cmd'を実行しました。 – Mofi

+4

正直なところ、SecureStringを再び安全でないようにするという激しいダンスをするのではなく、PowerShellからpsexecを実行するだけでいいですか? – Joey

+0

@joey私はできると思います。 –

答えて

0

は、これはまだ関与非ASCII文字がなければならない障害が発生した場合、それは

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

完全だかどうかを確認するために、あなたのパスワードを使用して、この最初の試してみてください。
次に、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を実行していることですが、1つのドメインでは機能しません。新しい質問をする必要があるかもしれません。 –

関連する問題