web-dev-qa-db-ja.com

psloggedonタイムアウト

ネットワークからのマシン名のリストがあり、バッチファイルに入れてリストを実行し、それぞれにログオンしているユーザーを表示します。

psloggedon \\machineA
psloggedon \\machineB
psloggedon \\machineC
psloggedon \\machineD
psloggedon \\machineE
psloggedon \\machineF
...

Psloggedonは正常に動作しますが、実際にはネットワーク上にないマシンにヒットすると、次のマシンに移動する前に30〜60秒間ハングします...これを高速化する方法があるかどうか疑問に思っていました。ネットワーク上にないマシンにヒットした場合、リスト内の次のマシンにはるかに速く移動します。

コマンドにping-nループを追加することでこれが可能になる可能性があることを他の場所で読んだことがありますが、どうすればよいでしょうか。

1
user60707

Dosでそれを行う方法がわかりません。 Autoitを使用して「クリア」リストを取得できます。 http://www.autoitscript.com

Autoitをインストールすると、このスクリプトを使用できます。最新のpsloggedon.exe(1.34)を使用する必要があります

スクリプトを「NAME.au3」(任意の名前)ファイルとして保存します。

例:

c:\ NAME.au3
c:\ pclist.txt
c:\ pstools\psloggedon.exe

#include <Constants.au3>
Dim $line, $line2, $file, $icount, $reg, $reg2, $reg3
$file = FileOpen("pclist.txt", 0)
While 1
    $line = FileReadLine($file)
    If @error Then ExitLoop
    $reg3 = ""
    $reg2 = ""
    $reg = ""
    If Ping($line, 200) Then
        $reg = @ComSpec & ' /C "' & @ScriptDir & "\pstools\psloggedon.exe -l -x \\" & $line & '"'
        $reg = Run($reg, "", @SW_HIDE, $STDOUT_CHILD + $STDERR_CHILD)
        While 1
            $reg2 = StdoutRead($reg)
            If @error Then ExitLoop
            If $reg2 Then
                $reg3 &= $reg2
            EndIf
        WEnd
        If StringInStr($reg3, "Error") Then
            $reg = "Error"
        ElseIf StringInStr($reg3,"No one is logged") Then
                $reg = "No one is logged on locally."
        Else
                $reg = StringTrimLeft($reg3, StringInStr($reg3, Chr(13), "", 3))
                $reg = StringTrimLeft($reg, StringInStr($reg, "\"))
                $reg = StringTrimRight($reg, StringLen($reg) - StringInStr($reg, Chr(13)))
                $reg = StringStripWS($reg, 8)
        EndIf
        $icount += 1
        $line2 &= $icount & @TAB & $line & @TAB & $reg & @CRLF
    EndIf
    TrayTip("Psloggedon", $icount & " " & $line & " User: " & $reg, 10)
WEnd
FileClose($file)
ConsoleWrite($line2)
FileDelete("C:\output.txt")
FileWrite("C:\output.txt", $line2)
ShellExecute("C:\output.txt")
1
user60738

あなたの場合、pingコマンドを使用するのが正しいでしょう。

Start.cmd

FOR /F %%x in (c:\temp\pclist.txt) do call ping_psloggedon.cmd %%x

ping_psloggedon.cmd

ping -n 1 -i 200 -w 130 %1
if errorlevel 1 goto exit
c:\temp\pstools\psloggedon.exe \\%1
:exit

pclist.txt

PCNAME1
PCNAME2
PCNAME3
1
user60738

>> c:\ outputをc:\ temp\pstools\psloggedon.exe \%1に追加するだけです

ping -n 1 -i 200 -w 130 %1
if errorlevel 1 goto exit
c:\temp\pstools\psloggedon.exe \\%1 >> C:\output.txt
:exit

これで、start.cmdを開始するたびに、結果がc:\ output.txtに追加されます。

必要に応じて、echo LoggedonUsers> c:\ output.txtをstart.cmdに追加して、開始時にクリーンなoutput.txtを取得できます。

echo LoggedonUsers > c:\output.txt
FOR /F %%x in (c:\temp\pclist.txt) do call ping_psloggedon.cmd %%x

「これもERRORLEVELステートメントでしょうか?」とはどういう意味ですか?

0
user60738

もう一度ありがとう:)

それもうまくいきます!マシン名の値だけを出力することは可能ですか?私が現在出力ファイルで取得している他のすべてのテキストとは対照的に。

したがって、output.txtには現在、これが表示されています...

\ LT013131のレジストリに接続しています...

ローカルにログオンしたユーザー:19/11/2010 09:08:05ドメイン名\ユーザーIDリソース共有を介してログオンしたユーザー:19/11/201011:44:17ドメイン名\ユーザーID

とにかく、リストを実行してLT013131だけを出力するようになっていますか?

したがって、スクリプトが完了すると、マシン名のリストが表示されます。

ありがとう:)

0
user60833