1

Тема: JS: вызов методов WMI с выходными параметрами

Обсуждение.

Ссылка на тему в Коллекции

2

Re: JS: вызов методов WMI с выходными параметрами

Да, вывод в первом посте прочитал, но всё же.
Не подскажет ли кто, как будет выглядеть на JS симпатичный VBS скрипт, определяющий PID процесса скрипта:

set test=GetObject("winmgmts:\\.\root\cimv2:win32_process.Handle='" & CreateObject("WScript.Shell").Exec("rundll32 kernel32,Sleep").ProcessId & "'")
msgbox test.ParentProcessId
test.Terminate

Приношу свои извинения автору - ссылку на оригинал потерял...

3

Re: JS: вызов методов WMI с выходными параметрами

Serge Yolkin, как вариант:

var WMI = GetObject("winmgmts:{impersonationLevel=impersonate}!\\\\.\\root\\cimv2");
CLine = (WScript.FullName + '" "' + WScript.ScriptFullName).replace(/\\/g, '\\\\')
Query = "SELECT Handle FROM Win32_Process WHERE CommandLine Like '%" + CLine + "%'"
for(p = new Enumerator(WMI.ExecQuery(Query)) ; !p.atEnd() ; p.moveNext())
  WScript.Echo("PID WScript.exe данного скрипта: " + p.item().Handle);

4 (изменено: JSmаn, 2014-04-20 08:31:50)

Re: JS: вызов методов WMI с выходными параметрами


function GetPID() {
    var WshShell = WScript.CreateObject("WScript.Shell");
    var ChildProc = WshShell.Exec("rundll32 kernel32,Sleep").ProcessId;
    var test = GetObject("winmgmts:\\\\.\\root\\cimv2:win32_process.Handle='" + ChildProc + "'");
    var Result = test.ParentProcessId;
    test.Terminate();
    return Result;
}

5

Re: JS: вызов методов WMI с выходными параметрами

ypppu, а что обсуждать-то? Каким способом узнавать как называть параметры? Один и тот же код везде, по сути.

6

Re: JS: вызов методов WMI с выходными параметрами

JSman

    var WshShell = WScript.CreateObject("WScript.Shell");

?

7

Re: JS: вызов методов WMI с выходными параметрами

Flasher, добавил

8

Re: JS: вызов методов WMI с выходными параметрами

JSman пишет:

ypppu, а что обсуждать-то? Каким способом узнавать как называть параметры? Один и тот же код везде, по сути.

Просто товарищ Serge Yolkin начал обсуждать и задавать вопрос в Коллекции. Мне пришлось создать новую тему и перенести сюда его сообщение.

9 (изменено: Serge Yolkin, 2014-04-22 16:31:55)

Re: JS: вызов методов WMI с выходными параметрами

ypppu пишет:

Просто товарищ Serge Yolkin начал обсуждать и задавать вопрос в Коллекции. Мне пришлось создать новую тему и перенести сюда его сообщение.

Прошу прощения, на пост вышел поиском, и не обратил внимания на форум, в котором он находится.

Всем спасибо за помощь!

P.S. Пример от Flasher не заработал без всяких ошибок, просто ничего не показал (Win7x32). Пример от JSman работает отлично.

10

Re: JS: вызов методов WMI с выходными параметрами

Serge Yolkin пишет:

P.S. Пример от Flasher не заработал без всяких ошибок, просто ничего не показал (Win7x32).

Странно, у меня система та же, всё показывает.

11

Re: JS: вызов методов WMI с выходными параметрами

Serge Yolkin пишет:

на пост вышел поиском, и не обратил внимания на форум, в котором он находится.

Теперь зато ясно, как такое происходит.

12

Re: JS: вызов методов WMI с выходными параметрами

Serge Yolkin
Хотел бы всё-таки уточнить, ты никаких правок не делал? Только копипаст?

13

Re: JS: вызов методов WMI с выходными параметрами

Flasher пишет:

Serge Yolkin
Хотел бы всё-таки уточнить, ты никаких правок не делал? Только копипаст?

У меня аналогично не пашет. Я думаю, что не совсем корректно код написан.
Например, что первое бросается в глаза - это

CLine = (WScript.FullName + '" "' + WScript.ScriptFullName).replace(/\\/g, '\\\\')

Во-первых, нет смысла экранировать косую черту.
Во-вторых, если рабочей папкой программы установлена директория, в которой находится скрипт, то можно допустить, что вызов может быть следующим: wscript.exe test.js. При этом WScript.ScriptFullName покажет полный путь. Имя процесса может быть без расширения "exe". Пример в SCITE запустите для разнообразия. Кавычки также не всегда есть.

Далее,

CLine = (WScript.FullName + '" "' + WScript.ScriptFullName).replace(/\\/g, '\\\\')
Query = "SELECT Handle FROM Win32_Process WHERE CommandLine Like '%" + CLine + "%'"

Ну явно же видно, что Вы не совсем верно кавычки расставили. Получается, LIKE '%wscript.exe" "test.js%'.

Плюс Ваш алгоритм не дает гарантию, что Вы получите идентификатор иного скриптового процесса, который аналогично был запущен с тем же хостом и скриптом в качестве аргумента.

Думаю, что дал развернутый ответ.

14

Re: JS: вызов методов WMI с выходными параметрами

Flasher
Никаких правок. Вставил эхо перед циклом - отрабатывает, а из цикла - тишина. С кавычками поигрался, replace убирал - тишина.

15

Re: JS: вызов методов WMI с выходными параметрами

JSman пишет:

Во-первых, нет смысла экранировать косую черту.

Это разве что-то нарушит?

JSman пишет:

Во-вторых, если рабочей папкой программы установлена директория, в которой находится скрипт, то можно допустить, что вызов может быть следующим: wscript.exe test.js. При этом WScript.ScriptFullName покажет полный путь. Имя процесса может быть без расширения "exe". Пример в SCITE запустите для разнообразия. Кавычки также не всегда есть.

Это всё справедливо для случая намеренного запуска из комстроки, тогда скрипт действительно не отработает. Я же писал для случая прямого вызова скрипта из папки. Как сами запускаете?

Serge Yolkin пишет:

Вставил эхо перед циклом - отрабатывает, а из цикла - тишина.

Проблема может быть только в составленном запросе. Только разобраться бы, что там может не соответствовать действительности. Ты скрипт запускаешь из папки по Enter?

16

Re: JS: вызов методов WMI с выходными параметрами

1) лишняя операция.
2) в коде целесообразно учитывать все условия. Запускаю из папки, в том числе.

17 (изменено: Flasher, 2014-04-23 00:45:18)

Re: JS: вызов методов WMI с выходными параметрами

2) А запуская из папки, тоже не отрабатывает? Если да, то тут какие могут быть причины?

Кстати, я попробовал не экранировать двойную косую - ругается.

18

Re: JS: вызов методов WMI с выходными параметрами

Flasher, все-таки пример Ваш работает, но только при запуске из папки. Недостатки я перечислил.

19 (изменено: Serge Yolkin, 2014-04-23 14:29:12)

Re: JS: вызов методов WMI с выходными параметрами

Сначала запускал из AkelPad'а, сейчас попробовал из TC и Проводника - тот же результат: тишина... Добавил в конце

WScript.echo(Query);

получил

SELECT Handle FROM Win32_Process WHERE CommandLine Like '%C:\\Windows\\System32\\WScript.exe" "G:\\Adds\\Scripting\\Expiriences\\JS'n'VBS\\получить свой PID Flasher.js%'

для всех 3-х типов запуска. Кавычки в середине не по феншую... Если убрать совсем

SELECT Handle FROM Win32_Process WHERE CommandLine Like '%C:\\Windows\\System32\\WScript.exe G:\\Adds\\Scripting\\Expiriences\\JS'n'VBS\\получить свой PID Flasher.js%'

результат тот же, если добавить в начале и в конце

SELECT Handle FROM Win32_Process WHERE CommandLine Like '%"C:\\Windows\\System32\\WScript.exe" "G:\\Adds\\Scripting\\Expiriences\\JS'n'VBS\\получить свой PID Flasher.js"%'

ничего не меняется...

О! Победил.

var WMI = GetObject("winmgmts:{impersonationLevel=impersonate}!\\\\.\\root\\cimv2");
var CLine = (WScript.FullName + '" "' + WScript.ScriptFullName)
 .replace(/\\/g, "\\\\")
 .replace(/'/g, "\\'");
var Query = "SELECT Handle FROM Win32_Process WHERE CommandLine Like '%\"" + CLine + "\"%'";
for(var p = new Enumerator(WMI.ExecQuery(Query)) ; !p.atEnd() ; p.moveNext())
  WScript.Echo("PID WScript.exe данного скрипта: " + p.item().Handle);

удвоение слэшей - обязательно, иначе не работает, не любит апострофы в путях, в определении Query добавил кавычки вокруг CLine, запускается и из папки, и из Акела, и из комстроки.

20 (изменено: Flasher, 2014-04-23 14:49:13)

Re: JS: вызов методов WMI с выходными параметрами

JSman пишет:

Flasher, все-таки пример Ваш работает, но только при запуске из папки. Недостатки я перечислил.

ОК, спасибо, что подтвердили. С недостатками согласен, даже знал про ещё один, поправлю, как разберусь с запрашиваемой стороной.

Serge Yolkin пишет:
...JS'n'VBS...

Вот где собака порылась. Апострофы в пути к файлу дают ошибку в запросе. Хм. В мыслях единственное как это обойти, обрезать путь до первого апострофа, но что-то не ахти идея, с учётом того на каких отрезках этот апостроф может вылезти. Проще вообще отказаться от них в именах скриптовых подпапок.


.replace(/'/g, "\\'");

Какая-то сомнительная история. Добавил в запрос косые перед апострофами - результата нет.

21

Re: JS: вызов методов WMI с выходными параметрами

Flasher пишет:

результата нет

странно, у меня заработало...

Да, проверил оба способа в HTA - оба работают (с минимальными изменениями):

<head><hta:application id="HTApp" /></head>
<script type="text/javascript" language="JavaScript">//<![CDATA[
  var i,
   k=new ActiveXObject('Scripting.FileSystemObject').getSpecialFolder(1);
   l=('"'+k+'\\mshta.exe" '+HTApp.commandLine).replace(/\\/g,'\\\\').replace(/'/g,'\\\''),
   m=GetObject('winmgmts:{impersonationLevel=impersonate}!\\\\.\\root\\cimv2'),
   n='SELECT Handle FROM Win32_Process WHERE CommandLine Like \'%'+l+'%\'';
  for(i=new Enumerator(m.execQuery(n));!i.atEnd();i.moveNext())alert(i.item().handle);
//]]></script>
<script type="text/javascript" language="JavaScript">//<![CDATA[
  var
   p=new ActiveXObject('WScript.Shell').Exec('rundll32 kernel32,Sleep').processId,
   q=GetObject('winmgmts:\\\\.\\root\\cimv2:win32_process.Handle="'+p+'"'),
   r=q.parentProcessId;
  q.terminate();
  alert(r);
//]]></script>