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.