1

Тема: JS:не получается "убить" процесс терминального пользователя

Написал скрипт для убития процесов, которые остались от незавершённых терминальных сессий:


var fsObj = new ActiveXObject("Scripting.FileSystemObject");    
var SWbemLocator = WScript.CreateObject("WbemScripting.SWbemLocator");        
var wbemFlagReturnImmediately = 0x10; 
var wbemFlagForwardOnly = 0x20; 

var strLoc = ".";                    
var strFile = "Y:\\Backup_1C\\log.txt";                    // файл для записи результата        
var strProcsToKill = "1cv8.exe";                // приложение, которое будем останавливать

var SWbemServices = SWbemLocator.ConnectServer(strLoc, "root\\cimv2", "", "");
                        
var SWbemObjectSet = SWbemServices.ExecQuery("SELECT * FROM Win32_Process WHERE Name = " + "\"" + strProcsToKill + "\"", "WQL", wbemFlagReturnImmediately | wbemFlagForwardOnly); 
                        
en = new Enumerator(SWbemObjectSet), k = 0;

while (!en.atEnd())
    {
    i = en.item();                
    i.Terminate, k++;            
    en.moveNext();                
    }

var txtfl_ = fsObj.OpenTextFile(strFile, 8, true);    
if(k !== 0)
    {
    txtfl_.WriteLine("Было остановлено: " + k + "  процессов \"1cv8.exe\"");
    txtfl_.WriteLine("----------------------------------------------------");
    }
else
    {
    txtfl_.WriteLine("Активных процессов \"1cv8.exe\" в системе не обнаружено");
    txtfl_.WriteLine("----------------------------------------------------");
    }
txtfl_.close();                        

Пробую запустить этот скрипт от имени Администратора, правда также из терминальной сессии, смотрю в лог, пишет сколько процессов с таким именем было остановлено, на деле этого не происходит, процессы как висели в диспетчере так и висят... "Руками" убиваются нормально... 
Думал скрипт кривой, заменил имя процесса на notepad.exe, скрипт его убил, правда этот notepad был запущен мною же... Чёт не пойму почему мне не удаётся остановить процессы, оставшиеся от терминальных пользователей?

2

Re: JS:не получается "убить" процесс терминального пользователя

не вдаваясь в подробности


    i.Terminate() // скобки!!!
( 2 * b ) || ! ( 2 * b )

3

Re: JS:не получается "убить" процесс терминального пользователя

im2002, привилегии нужны. Вы на MSDN были?

Remarks
To terminate a process that you do not own, enable the SeDebugPrivilege privilege. In VBScript, you can enable this privilege with the following lines of code:

Set objLoc = createobject("wbemscripting.swbemlocator")
objLoc.Security_.privileges.addasstring "sedebugprivilege", true

На JScript сами переводите.

смотрю в лог, пишет сколько процессов с таким именем было остановлено,

Он у Вас неверно считает. Из той же статьи:

Return Value
Returns a value of 0 (zero) if the process was successfully terminated, and any other number to indicate an error.

Return code Description
0 Successful Completion
2 Access Denied
3 Insufficient Privilege
8 Unknown Failure
9 Path Not Found
21 Invalid Parameter

4

Re: JS:не получается "убить" процесс терминального пользователя

Rumata, в данном случае Вы не правы... транскрипция записи со скобками или без скобок, значения не имеет. Работает (или как в данном случае НЕ работает) и со скобками и без них.
По вашему alexii совету проанализировал код возврата операции

i.Terminate

и увидел, что он равен 2, т.е. доступ мне запрещён. Далее добавил строку:

SWbemLocator.Security_.privileges.addasstring("sedebugprivilege", true);

и всё заработало как надо.
Спасибо за подсказку.