Captura VBScript StdOut do ShellExecute

Captura VBScript StdOut do ShellExecute

Estou tentando executar o seguinte trecho de código como parte de uma ferramenta para coletar e registrar alguns diagnósticos de sistema pertinentes. O objetivo deste trecho é reunir o resultado da execução do comando:

vssadmin list writers

O trecho é o seguinte:

'   Set WshShell = CreateObject("WScript.Shell")
'   WScript.Echo sCurPath & "\vsswritercheck.bat"
'   Set WshShellExec = WshShell.Exec("elevate.cmd cmd.exe /c " & sCurPath & "\vsswritercheck.bat")

Set oShell = CreateObject("Shell.Application")
oShell.ShellExecute "cmd.exe", sCurPath & "\vsswritercheck.bat", , "runas", 1
vsswriter = VSSWriterCheck

Select Case oShell.Status
    Case WshFinished
        strOutput = oShell.StdOut.ReadAll
    Case WshFailed
        strOutput = oShell.StdErr.ReadAll
End Select
WScript.Echo strOutPut
vsswriter = strOutPut

Com o primeiro trecho de código (comentado), posso executar o comando e capturar stdout do arquivo em lote. No segundo código cortado, não consigo capturar o stdout.

Preciso ser capaz de executar o script em lote com permissões elevadas, por isso estou procurando um compromisso entre a funcionalidade dos dois.

Não consigo executar todo o script de chamada em modo elevado devido a restrições de outras funcionalidades.

Estou procurando ideias sobre como adicionar essa saída ao meu log, pois estou ficando sem opções que estão dentro do escopo dos scripts básicos.

Responder1

strcmd="cmd /c " & sCurPath & "\vsswritercheck.bat"
return = wshshell.run(strcmd , 0 , true)
if return=0 then
    blnSuccess = True
else
    blnSuccess = False
end if

Responder2

Que tal usar os dois?

Use o código que você comentou, que funciona em modo não elevado, e adicione um teste extra onde, se forem necessários direitos elevados, o script se chamará usando ShellExecute(), fazendo com que a chamada subsequente para Exec() já tenha direitos elevados e ainda capturar stdout.

É um pouco maluco, mas fácil.

informação relacionada