Muito obrigado a Ryan Ries por sua paciência e persistência.
O que eu fiz é apenas um arquivo em lote que usa psexec (Sysinternals) para enviar handle.exe (também Sysinternals) para cada cliente com uma sessão SMB ativa como o usuário de destino e verificar se há um identificador correspondente ao nome de arquivo especificado ou nome de arquivo parcial.
Isso pode não ser muito bonito, mas funcional é elegante e isso parece fazer o trabalho. (Ou seja, ele me fornece uma lista de endereços IP correspondentes a uma lista de pessoas com as quais eu deveria estar ao telefone.) Demora 15 ~ 20 segundos para ser executado agora, ou ~ 30 se eu remover a filtragem com base no nome de usuário.
O único argumento deve ser o nome do arquivo ou o fragmento de nome de arquivo para corresponder, embora também possa ser chamado com uma máquina de destino e um nome de arquivo para verificar apenas essa máquina.
Como NET SESSION
é usado para obter a lista de sessões, isso deve ser executado com privilégios de administrador por padrão. A documentação do PsExec alega que o PsExec não retornará seu próprio status, então eu suspeito que falsos positivos sejam possíveis se o PsExec não conseguir se conectar. Também é possível que o arquivo do manipulador correspondente não esteja no compartilhamento ou seja um arquivo diferente, resultando em um falso positivo.
@SETLOCAL ENABLEEXTENSIONS ENABLEDELAYEDEXPANSION
@ECHO OFF
IF "%2" NEQ "" GOTO :check
IF "%1" EQU "" ECHO No argument provided & GOTO :EOF
ECHO Waiting for all instances of psexec.exe to return...
FOR /F %%i in ('NET SESSION ^| findstr /I username') DO (
IF /I "%%i" NEQ "!LASTLINE!" (
start /B cmd /c %0 %%i %1
)
set LASTLINE=%%i
)
:WAIT
TIMEOUT 1 > NUL
TASKLIST | findstr /I psexec 2> NUL > NUL
IF %ERRORLEVEL% EQU 0 GOTO WAIT
ECHO Press any key to continue...
pause > NUL 2> NUL
EXIT /B
:check
PSEXEC.EXE -s %1 -c handle.exe /accepteula -a %2 2> NUL |findstr /I %2 > NUL 2> NUL
IF %ERRORLEVEL% EQU 0 ECHO Handle found on machine: %1
EXIT