Pergunta

Eu tenho o seguinte código para terminar um processo, mas eu ainda receber um código de erro 2 (acesso negado).

strComputer = "." 
Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\cimv2")
Set colProcessList = objWMIService.ExecQuery("SELECT * FROM Win32_Process WHERE Name = 'MSSEARCH.exe'")
For each objProcess in colProcessList
  wscript.echo objProcess.processid
  intrc = objProcess.Terminate()
  if intrc = 0 then wscript.echo "succesfully killed process" else wscript.echo "Could not kill process. Error code: " & intrc End if
Foi útil?

Solução

É perfeitamente legítimo para obter "acesso negado" para acabar com um programa. Se é um serviço (que eu estou supondo mssearch.exe é), então é provável que seja executado como o usuário "SYSTEM", que tem privilégios maiores do que até mesmo a conta de administrador.

Você não pode fazer logon como a conta SYSTEM, mas você provavelmente poderia escrever um serviço para gerenciar outros serviços ...

Outras dicas

Como um usuário não-privilegiado, você só pode processos que você próprio fim. Em um ambiente multiusuário isso pode morder-lhe no tornozelo, porque WMI voltaria processos de mesmo nome de outros usuários, bem como, a menos que você escrever uma consulta WQL mais específico.

Se o seu processo é um serviço, e suas corridas script em uma conta privilegiada, você ainda pode precisar de tomar "a rota regular" para pará-lo, por exemplo, usando WScript.Shell para net stop chamada ou sc.exe, ou, mais elegante, usando a classe Win32_Service:

Set Services = objWMIService.ExecQuery _
               ("SELECT * FROM Win32_Service WHERE Name = '" & ServiceName & "'")

For Each Service In Services
  Service.StopService()
  WSCript.Sleep 2000 ' wait for the service to terminate '
Next

Se você olhar para esta página: http: / /msdn.microsoft.com/en-us/library/aa393907(VS.85).aspx você veria que o código de erro 2 é o acesso negado ao invés de arquivo não encontrado

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top