View previous topic :: View next topic |
Author |
Message |
Flasher
Joined: 06 Nov 2009 Posts: 14229 Location: Москва
|
(Separately) Posted: Thu Sep 15, 2011 23:04 Post subject: |
|
|
ApceH wrote: | Code: | Set WshShell = WScript.CreateObject("WScript.Shell") |
| - это лишнее.
А в другом сеансе программы точно из этой папки запускаются? |
|
Back to top |
|
|
ApceH
Joined: 08 Apr 2011 Posts: 316 Location: Димитровград
|
(Separately) Posted: Thu Sep 15, 2011 23:17 Post subject: |
|
|
Flasher
Да. Сейчас вывел все процессы с их путями. Перечисление срабатывает. Отличие лишь одно:
objProcess.GetOwner возвращает разных пользователей. То есть всё правильно.
В крайнем случае я возьму objProcess.ProcessId и просто убью по пиду. Сейчас попробую. Но почему же Terminate не срабатывает! |
|
Back to top |
|
|
Rodny
Joined: 24 Jan 2007 Posts: 949 Location: Могилёв, Беларусь
|
(Separately) Posted: Thu Sep 15, 2011 23:31 Post subject: |
|
|
Что-то никак не могу понажимать кнопки в ИГП. Открываю, например, через TCMC
Code: | 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 после ручного закрывания диалога. До этого окно не подаёт признаков жизни. |
|
Back to top |
|
|
ApceH
Joined: 08 Apr 2011 Posts: 316 Location: Димитровград
|
(Separately) Posted: Thu Sep 15, 2011 23:37 Post subject: |
|
|
Сделал убийство процессов через костыль:
Code: | 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 |
Если кто подскажет, как без запуска сторонних программ, будет совсем хорошо! |
|
Back to top |
|
|
Flasher
Joined: 06 Nov 2009 Posts: 14229 Location: Москва
|
(Separately) Posted: Thu Sep 15, 2011 23:55 Post subject: |
|
|
ApceH
Можно использовать tskill c ключом /A для всех сеансов. Т.е.:
Code: | 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
Code: | 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 |
|
|
Back to top |
|
|
ApceH
Joined: 08 Apr 2011 Posts: 316 Location: Димитровград
|
(Separately) Posted: Fri Sep 16, 2011 22:16 Post subject: |
|
|
Нет Приведённые в двух постах выше скрипты для убийства процессов из папки не работают в общем случае.
В Win6+ нет tskill, во-первых. Мой скрипт работает только в Win6+.
В XP совсем другая проблема, которая меня ввела в ступор совсем.
Там свойства ExecutablePath (и даже CommandLine) равны пустой строке, если речь идёт о процессе в другом сеансе... Поэтому хоть tskill, хоть taskkill применить не удастся!
Единственный выход вижу: насильно завершить все сеансы, кроме текущего... |
|
Back to top |
|
|
Flasher
Joined: 06 Nov 2009 Posts: 14229 Location: Москва
|
(Separately) Posted: Fri Sep 16, 2011 22:56 Post subject: |
|
|
ApceH wrote: | В Win6+ нет tskill, во-первых. | А поставить?
Если не работает, можно перед /A указать /server:<Имя компа> |
|
Back to top |
|
|
ApceH
Joined: 08 Apr 2011 Posts: 316 Location: Димитровград
|
(Separately) Posted: Fri Sep 16, 2011 23:00 Post subject: |
|
|
Flasher
Уже без разницы, чем убивать, если нельзя получить список процессов, запущенных из папки, в XP...
Поставить tskill? Зачем????
Я понимаю, что запрограммировать это на винапи за полчаса можно. Но не писать же новую программу для каждой появившейся задачи((( |
|
Back to top |
|
|
Rodny
Joined: 24 Jan 2007 Posts: 949 Location: Могилёв, Беларусь
|
(Separately) Posted: Fri Sep 16, 2011 23:15 Post subject: |
|
|
Flasher
Спасибо. |
|
Back to top |
|
|
Flasher
Joined: 06 Nov 2009 Posts: 14229 Location: Москва
|
(Separately) Posted: Fri Sep 16, 2011 23:21 Post subject: |
|
|
ApceH wrote: | Уже без разницы, чем убивать, если нельзя получить список процессов | Т.е. как нельзя? А в чём проблема? (я просто не хочу создавать акк для тестов.)
Можно, конечно, убивать по имени, но тогда будут убиваться одноимённые процессы не только из этой папки. |
|
Back to top |
|
|
ApceH
Joined: 08 Apr 2011 Posts: 316 Location: Димитровград
|
(Separately) Posted: Fri Sep 16, 2011 23:29 Post subject: |
|
|
ApceH wrote: | В XP совсем другая проблема, которая меня ввела в ступор совсем.
Там свойства ExecutablePath (и даже CommandLine) равны пустой строке, если речь идёт о процессе в другом сеансе... Поэтому хоть tskill, хоть taskkill применить не удастся!
|
Короче, сделал просто вот так пока:
Code: | 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... |
|
Back to top |
|
|
Andrey_A
Joined: 10 Apr 2009 Posts: 394 Location: Сочи
|
(Separately) Posted: Mon Sep 19, 2011 18:11 Post subject: |
|
|
Подскажите как правильно передать адрес интернета с параметрами
Code: | CreateObject("WScript.Shell").Run "http://translate.google.com/#auto|ru|\привет" |
пробовал и с пробелам и с чёрточками, не получается - переходит к сайту, выдаёт ошибку, параметр соответственно не передаёт |
|
Back to top |
|
|
ApceH
Joined: 08 Apr 2011 Posts: 316 Location: Димитровград
|
(Separately) Posted: Mon Sep 19, 2011 18:18 Post subject: |
|
|
Andrey_A
А у меня открывается так:
Code: | CreateObject("WScript.Shell").Run "http://translate.google.com/#ru|en|привет" |
В чём проблема-то? _________________ kIT Programs PowerPack, kIT Universal Presets | Есть только одна истинная вера: чёрная магия... |
|
Back to top |
|
|
Andrey_A
Joined: 10 Apr 2009 Posts: 394 Location: Сочи
|
(Separately) Posted: Mon Sep 19, 2011 18:22 Post subject: |
|
|
У меня выдаёт ошибку
Code: | Сценарий: C:\TC Image\AkelFiles\Plugs\Scripts\Test_001.vbs
Строка: 1
Символ: 1
Ошибка: Не удается найти указанный файл.
Код: 80070002
Источник: (null) |
в скрипте одна эта строка |
|
Back to top |
|
|
ApceH
Joined: 08 Apr 2011 Posts: 316 Location: Димитровград
|
(Separately) Posted: Mon Sep 19, 2011 18:27 Post subject: |
|
|
Andrey_A
Понял проблему. Преобразуй в ANSI-кодировку. Или в юникод UCS-2 Little Endian. _________________ kIT Programs PowerPack, kIT Universal Presets | Есть только одна истинная вера: чёрная магия... |
|
Back to top |
|
|
|