Пишемо менеджер служб windows засобами командного рядка і windows script host

Гаразд, давайте для початку розглянемо ази, а саме, які утиліти командного рядка застосовуються для управління службами:

Утиліта sc (я її вже розглядав частково в статті Отримання списку служб засобами командного рядка і сервера Windows Script Host), з неї нам знадобляться тільки деякі команди, а саме:
Sc start ім'я_служби -запуск служби з командного рядка
Sc pause ім'я_служби - припинення служби Windows з командного рядка
Sc continue ім'я_служби - відновлення служби з командного рядка
Sc stop ім'я_служби - зупинка служби з командного рядка
Параметр ім'я_служби визначає ім'я сервісу. Так само варто враховувати, що у сервісу можуть бути залежні від нього служби.
Однак, тут є один підводний камінь - тип запуску, так якщо служба повністю зупинена, то вам спочатку потрібно змінити тип запуску, а вже потім запускати службу Windows через командний рядок. Для зміни типу запуску, можна використовувати наступну команду:
Sc config ім'я_служби start = прапор
Обов'язково після знака рівності ставте пробіл, інакше станеться помилка. Прапор може приймати три значення:
Auto - автоматичний запуск при старті системи
Demand - ручний запуск
Disabled - відключення

Що б запустити або зупинити службу з командного рядка, є ще дві утиліти:
net stop ім'я_служби
net start ім'я_служби
Не забувайте, що управляти службами Windows можна з Панелі Управління, папка Адміністрування, ярлик Служби.
Взагалі, цю публікацію я б фізично не зміг написати, якби не два моменти:
- Як тільки я починав вести блог, то для реалізації віконного інтерфейсу використовував програму LangMF, про неї досить широкі можливості, але, як тільки я познайомився з компонентом WSO. то вона мені більше не знадобилася.
- Як то мені спало на думку написати файловий менеджер з допомогою мови jscript, з подальшим переведенням коду в область vbscript. Я накинув початкові штрихи, але ... що то у мене не виходило, за порадою я пішов на форум, і там мені все грамотно пояснили, і я зрозумів ... що нічого не зрозумів. Після того моменту мені довелося багато перевчити і переосмислити, як результат, я видалив практично всі статті на блозі і написав нові.

Добре, тепер настав час приступити до програмування, я спочатку покажу приклад на мові jscript. Далі дам його опису і інформативні картинки, ну а потім вже приклад на мові vbscript.

У сценарії ми створили два масиви def_column і data_array. давайте розглянемо їх:
def_columns - даний масив зберігає в собі об'єкти, які будуть відповідати за обробку кожної колонки. Реалізація масиву об'єктів для мови vbscript (прочитайте "Урок 9 по VBScript: Масиви") і jscript (прочитайте "Урок 5 по JScript: Робота з масивами") різна, тому давайте розберемо все окремо:
Реалізація на jscript
def_columns = [,, ...,] - як бачимо, через кому в фігурних дужках ми повинні вказати об'єкти, але не імена, а весь код. Кожен об'єкт містить інформацію про ім'я колонки, її розмір, тип даних і функцію, яка відповідає за доступ до вибраного елементу в списку.
Реалізація на vbscript
def_columns = Array (об'ект_1, об'ект_2, ..., об'ект_n) - на перший погляд все просто, нам тільки потрібно прописати через змінну імена об'єктів (класів), але є одне але. Спершу нам довелося створити ці класи, і так як колонок п'ять, то і класів має бути п'ять, як створювати класи, почитайте в статті "Урок 8 по VBScript: Об'єкти і класи". Прямо перед формуванням масиву ми створили посилання на класи, інакше ніяк.

data_array - даний масив як і попередній, складається з об'єктів кожен об'єкт зберігає в собі інформацію про службу (ім'я, статус, псевдонім і так далі). Кожен раз при спробі запустити службу з командного рядка, зупинити службу з командного рядка, поставити на паузу або відновити, або при спробі обробити обрану службу Windows засобами WMI, буде відбуватися звернення до даного масиву за індексом і отримання даних з поточного об'єкта. У більшості випадків нам знадобиться тільки одна властивість Name, всього об'єкти зберігають п'ять властивостей (число колонок).
Сам масив є динамічним, в прикладі на jscript додавання даних відбувається за допомогою функції push. У vbscript такої можливості немає, тому мені довелося спочатку визначити довжину колекції зі службами, і вже потім за допомогою ключового слова ReDim задати довжину масиву.

Всі функції я зачіпати не буду, так як вийти ціла петиція, та й мене самого, якщо чесно такий величезний код відлякує. Ми розглянемо тільки керуючі функції, ті, які виробляють запуск служб з командного рядка, зупинка служб через командний рядок, відновлення, призупинення, переклад в автоматичний режим, переклад в ручний режіт і відключення служби Windows.

function ServiceStop, function ServicePause, ServiceContinue - функції, що відповідають за зупинку, припинення і відновлення сервісу Windows. Код практично той же, що у попередньої функції, тільки змінюється ім'я методу.
А ось зараз починається найцікавіше ..
function ServiceAuto - дана функція відповідає за переклад служби в автоматичний режим. Я не став використовувати функціонал WMI, а вирішив вдатися до утиліт командного рядка. За весь процес відповідає наступна точки:
WshShell.Run "cmd.exe / c sc config" cur_service_name "Start = Auto" ">" + Temp_file, 1, true
Тут відбувається запуск командного рядка з параметром "/ c", тобто, вона автоматично завершиться після виконання команди sc config. Однак, дані будуть записуватися в тимчасовий файл. Після виконання команди відбувається відкриття файлу, щоб споживач побачив, успішною була команда чи ні.

ServiceManual () і ServiceDisable () - функції перекладу служби Windows в ручний режим і її відключення, код практично той же, змінюється лише команда.
Гаразд, ось код на vbscript: