Страница 20 из 27

Добавлено: Чт сен 15, 2011 23:04
Flasher
ApceH писал(а):

Код: Выделить всё

Set WshShell = WScript.CreateObject("WScript.Shell")
- это лишнее.

А в другом сеансе программы точно из этой папки запускаются?

Добавлено: Чт сен 15, 2011 23:17
ApceH
Flasher
Да. Сейчас вывел все процессы с их путями. Перечисление срабатывает. Отличие лишь одно:
objProcess.GetOwner возвращает разных пользователей. То есть всё правильно.
В крайнем случае я возьму objProcess.ProcessId и просто убью по пиду. Сейчас попробую. Но почему же Terminate не срабатывает! :cry:

Добавлено: Чт сен 15, 2011 23:31
Rodny
Что-то никак не могу понажимать кнопки в ИГП. Открываю, например, через TCMC

Код: Выделить всё

Dim WSH, TCS
Set WSH = CreateObject("WScript.Shell")
Set TCS = WScript.CreateObject("TCScript.Helper")
WSH.Run """" & WSH.ExpandEnvironmentStrings("%COMMANDER_PATH%\Utils\TCMultipleCommands\TCMC.exe") & """ 50 CM2400" & """ """"", 1, True
Wscript.Sleep 1000
' варианты:
'WSH.SendKeys "qwe"
TCS.SendKeystroke "qwe"
Отправка клавиш происходит уже в сам TC после ручного закрывания диалога. До этого окно не подаёт признаков жизни.

Добавлено: Чт сен 15, 2011 23:37
ApceH
Сделал убийство процессов через костыль:

Код: Выделить всё

Set objService = GetObject("WinMgmts:\\.\Root\CIMV2")
Set WshShell = WScript.CreateObject("WScript.Shell")
Set colProcesses = objService.ExecQuery("SELECT * FROM Win32_Process WHERE ExecutablePath Like '" & Replace(WScript.Arguments(0),"\","\\") & "%'")
PIDs = ""
For Each objProcess in colProcesses
  PIDs = PIDs & " /PID " & objProcess.ProcessId
Next
WshShell.Run "TASKKILL /F" & PIDS, 0, False
Если кто подскажет, как без запуска сторонних программ, будет совсем хорошо!

Добавлено: Чт сен 15, 2011 23:55
Flasher
ApceH
Можно использовать tskill c ключом /A для всех сеансов. Т.е.:

Код: Выделить всё

Set WMI = GetObject("winmgmts:{impersonationLevel=impersonate}!\\.\root\cimv2")
For Each p in WMI.ExecQuery("SELECT * FROM Win32_Process WHERE ExecutablePath Like '" & Replace(WScript.Arguments(0),"\","\\") & "%'")
  CreateObject("WScript.Shell").Run "tskill " & p.ProcessID & " /A", 0
Next
Rodny

Код: Выделить всё

With CreateObject("WScript.Shell")
  .Exec("%COMMANDER_PATH%\Utils\TCMultipleCommands\TCMC.exe CM2400")
'  .Run """" & .ExpandEnvironmentStrings("%COMMANDER_PATH%\Utils\TCMultipleCommands\TCMC.exe") & """ CM2400", 1
  Wscript.Sleep 40
  .SendKeys "qwe"
End With

Добавлено: Пт сен 16, 2011 22:16
ApceH
Нет :cry: Приведённые в двух постах выше скрипты для убийства процессов из папки не работают в общем случае.
В Win6+ нет tskill, во-первых. Мой скрипт работает только в Win6+.
В XP совсем другая проблема, которая меня ввела в ступор совсем.
Там свойства ExecutablePath (и даже CommandLine) равны пустой строке, если речь идёт о процессе в другом сеансе... Поэтому хоть tskill, хоть taskkill применить не удастся!

Единственный выход вижу: насильно завершить все сеансы, кроме текущего...

Добавлено: Пт сен 16, 2011 22:56
Flasher
ApceH писал(а):В Win6+ нет tskill, во-первых.
А поставить?
Если не работает, можно перед /A указать /server:<Имя компа>

Добавлено: Пт сен 16, 2011 23:00
ApceH
Flasher
Уже без разницы, чем убивать, если нельзя получить список процессов, запущенных из папки, в XP...
Поставить tskill? Зачем????

Я понимаю, что запрограммировать это на винапи за полчаса можно. Но не писать же новую программу для каждой появившейся задачи(((

Добавлено: Пт сен 16, 2011 23:15
Rodny
Flasher
Спасибо.

Добавлено: Пт сен 16, 2011 23:21
Flasher
ApceH писал(а):Уже без разницы, чем убивать, если нельзя получить список процессов
Т.е. как нельзя? А в чём проблема? (я просто не хочу создавать акк для тестов.)

Можно, конечно, убивать по имени, но тогда будут убиваться одноимённые процессы не только из этой папки.

Добавлено: Пт сен 16, 2011 23:29
ApceH
ApceH писал(а):В XP совсем другая проблема, которая меня ввела в ступор совсем.
Там свойства ExecutablePath (и даже CommandLine) равны пустой строке, если речь идёт о процессе в другом сеансе... Поэтому хоть tskill, хоть taskkill применить не удастся!
Короче, сделал просто вот так пока:

Код: Выделить всё

Set objService = GetObject("WinMgmts:")
Set WshShell = WScript.CreateObject("WScript.Shell")
XP = (Left(WshShell.RegRead("HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\CurrentVersion"),1) = "5")
If XP Then
  Set colSessions = objService.ExecQuery("Select * from Win32_LogonSession Where LogonType = 2") 	
  If colSessions.Count > 1 Then
    WScript.Quit 1
  End If
End If
Set colProcesses = objService.ExecQuery("SELECT * FROM Win32_Process WHERE ExecutablePath Like '" & Replace(WScript.Arguments(0),"","\") & "%'")
If XP Then
  For Each objProcess in colProcesses
    WshShell.Run "TSKILL /A " & objProcess.ProcessId, 0, False
  Next
Else
  For Each objProcess in colProcesses
    WshShell.Run "TASKKILL /F /PID " & objProcess.ProcessId, 0, False
  Next
End If
WScript.Quit 0
Уже в вызывающем процесс (в NSIS-скрипте) проверяю возвращаемый код и, если =1, говорю пользователю завершить все сеансы кроме админовского...
Кстати, обнаружил интересность... Если завершить сеанс через диспетчер задач, то он не полностью завершается colSessions.Count будет всё ещё > 1... Только настоящий выход прокатит.

Ну будет время напишу, конечно, утилку, раз дохлый номер с WSH/WMI...

Добавлено: Пн сен 19, 2011 18:11
Andrey_A
Подскажите как правильно передать адрес интернета с параметрами

Код: Выделить всё

CreateObject("WScript.Shell").Run "http://translate.google.com/#auto|ru|\привет"
пробовал и с пробелам и с чёрточками, не получается - переходит к сайту, выдаёт ошибку, параметр соответственно не передаёт

Добавлено: Пн сен 19, 2011 18:18
ApceH
Andrey_A
А у меня открывается так:

Код: Выделить всё

CreateObject("WScript.Shell").Run "http://translate.google.com/#ru|en|привет"
В чём проблема-то?

Добавлено: Пн сен 19, 2011 18:22
Andrey_A
У меня выдаёт ошибку

Код: Выделить всё

Сценарий:	C:\TC Image\AkelFiles\Plugs\Scripts\Test_001.vbs
Строка:	1
Символ:	1
Ошибка:	Не удается найти указанный файл. 
Код:	80070002
Источник: 	(null)
в скрипте одна эта строка

Добавлено: Пн сен 19, 2011 18:27
ApceH
Andrey_A
Понял проблему. Преобразуй в ANSI-кодировку. Или в юникод UCS-2 Little Endian.