<<

стр. 3
(всего 10)

СОДЕРЖАНИЕ

>>

Item.Uninstaii();
КонецЦикла;
КонецЕсли;



Работа со службами и процессами
Для работы со службами (сервисами) в WMI используется класс
win32_service. Класс имеет довольно большое количество свойств. Рас-
смотрим только основные:
П Accept Pause — признак возможности приостановить службу;
П Acceptstop — признак возможности остановить службу;
Глава 2
72_

П Name — название службы;
П Description — описание;
П DisplayName — имя службы, показываемое пользователю;
П PathName — Путь К файлу;
О Process id — идентификатор процесса;
П started — признак, показывающий, запущена служба или нет;
О State — строка, описывающая состояние службы (stopped, Start Pending,
Stop Pending, Running, Continue Pending, Pause Pending, Paused, Unknown).
Рассмотрим основные методы класса win32_service:
О startservice ( ) — запускает службу;
П stopserviceo — останавливает службу;
П PauseService ( ) — приостанавливает работу службы;
П ResumeService ( ) — восстанавливает работу после приостановления;
П Delete ( ) — удалить службу;
О create (...) — создать службу (метод имеет множество параметров, кото-
рые не будут рассматриваться в рамках данной книги).
Для работы с процессами в WMI используется класс Win32_process. Рас-
смотрим основные свойства класса:
П Description — описание процесса;
П Process id — идентификатор процесса;
П Name — имя процесса;
П Priority — приоритет (от 0 до 37);
П virtuaisize — объем памяти, необходимый процессу.
Основные методы класса win32_Process:
П setPriority (Priority) — установить приоритет процесса, при этом па-
раметр Priority может принимать значения:
• 64 — Idle (Ожидание, наиболее низкий приоритет);
• 16384 — Below Normal (Ниже нормального);
• 32 — Normal (Обычный);
• 32768 — Above Normal (Выше нормального);
• 128 — High Priority (Высокий приоритет);
• 256 — Realtime (Приоритет реального времени, наивысший при-
оритет).
О Terminate о — завершить процесс и выгрузить его из памяти.
Администрирование Windows средствами WMI 73

Получение списка сервисов
Для получения списка установленных сервисов используется класс
Win32_Service (ЛИСТИНГ 2.13).




ServicesSet =
ПолучитьСОМОбъект("winmgmts:{impersonationLevel=impersonate}!\\
" + ИмяКомпьютера + "\root\cimv2");
Items = ServicesSet.ExecQuery("Select * from Win32_Service");
Для каждого Item Из Items Цикл
Сообщить("Сервис: " + Item.DisplayName + " (" + Item.State + ")");
КонецЦикла;

Для определения списка сервисов, которые возможно остановить, использу-
ется также класс win32_service. Однако запрос ограничивается условием
того, что свойство Acceptstop равно True (истина). Пример определения
такого списка показан в листинге 2.14.



ServicesSet =
ПолучитьСОМОбъект("winmgmts:{impersonationLevel=impersonate}! \\" +
ИмяКомпьютера + "\root\cimv2");
Items = ServicesSet.ExecQuery("Select * from Win32_Service Where
Acceptstop = True");
Для каждого Item Из Items Цикл
Сообщить("Имя процесса: " + Item.DisplayName);
КонецЦикла;


Установка приоритета процесса
Рассмотрим пример (листинг 2.15) установки среднего приоритета для за-
пущенного процесса Notepad.exe (блокнот).

Листинг 2.15. Установка приоритета процесса

ABOVE_NORMAL = 32768;
ServicesSet =
ПолучитьСОМОбъект("winmgmts:{impersonationLevel=impersonate}!\\" +
ИмяКомпьютера + "\root\cimv2");
Items = ServicesSet.ExecQuery("Select * from Win32_Process Where Name =
_74 Глава 2

'Notepad.exe'") ;
Для каждого Item Из Items Цикл
Item.SetPriority(ABOVE_NORMAL);
КонецЦикла;



Завершение процесса
Для завершения процесса используется метод Terminate без параметров
(листинг 2.16).



ServicesSet = ПолучитьСОМОбъект
("winmgmts:{impersonationLevel=impersonate}!\\" +
ИмяКомпьютера + "\root\cimv2");
Items = ServicesSet.ExecQuery("Select * from Win32_Process Where Name =
'Notepad.exe'");
Для каждого Item Из Items Цикл
Item.Terminate();
КонецЦикла;



Запуск и приостановка выполнения сервиса
Для запуска сервиса используется метод startservice (листинг 2.17). Для
приостановки — метод stopservice. Оба метода используются без пара-
метров.

нг 2.17. Приостановление

ServicesSet = ПолучитьСОМОбъект
("winmgmts:(impersonationLevel=impersonate)!\\" +
ИмяКомпьютера + "\root\cimv2");
Items = ServicesSet.ExecQuery("Select * from Win32_Service Where Name
='Alerter'"); // Оповещатель
Для каждого Item Из Items Цикл
Item.StartService(); // Запустить процесс
КонецЦикла;

В запросе метода ExecQuery используется фильтрация списка сервисов по
имени Alerter (Оповещатель). Таким образом, в выборку попадает всего
один сервис — Оповещатель, который и запустится после выполнения мето-
да StartService.
Администрирование Windows средствами WMI 75


Работа с операционной системой
Для работы с операционной системой в WMI существует несколько классов,
ОСНОВНЫМ ИЗ КОТОРЫХ ЯВЛЯетСЯ — Win32_OperatingSystem. Рассмотрим ОС-
новные свойства данного класса:
П Name — название операционной системы;
П BootDevice — имя физического диска, с которого загружается операци-
онная сиситема;
П SystemDrive — символ логического диска, на котором установлена сис-
тема;
О windowsDirectory — папка, в которой установлена система;
П Description — описание к объекту класса;
П FreePhysicaiMemory — размер свободной физической памяти (в килобайтах);
П FreeVirtuaiMemory — размер свободной виртуальной памяти (в килобайтах);
П Manufacturer — производитель операционной системы. Обычно данное
свойство имеет значение "Microsoft Corporation";
О NumberOfProcesses — количество запущенных процессов;
П organization — название организации, на которую зарегистрирована
данная копия системы;
П RegisteredUser — имя пользователя, на которого зарегистрирована дан-
ная копия системы;
П SeriaiNumber — регистрационный номер;
О osbanguage— языковая версия системы. Например оооэ — английская,
0419 — русская и т. д.;
П озтуре — тип операционной системы. Например, и — WIN98, 18 —
WINNT, зо - SunOS и т. д.;
П Primary — признак основной операционной системы;
П version — версия системы;
П BuiidNumber — номер сборки операционной системы;
Основные методы класса Win32_OperatingSystem:
П Reboot ( ) — перезагрузить систему;
П shutdown ( ) — выключить компьютер;
П win32shutdown(Fiag) — управление функциями выключения компьютера
(для\Ут32-операционных систем). Параметр Flag может принимать сле-
дующие значения:
• о — завершить работу пользователя (Log Off);
76 Глава 2

4 — принудительное завершение работы пользователя (Forced Log Off);

• i — выключение компьютера (Shutdown);
• 5 — принудительное выключение компьютера (Forced Shutdown);
• 2 — перезагрузка (Reboot);
• 6 — принудительная перезагрузка (Forced Reboot);
• 8 — выключение питания (Power Of!);
• 12 — принудительное выключение питания (Forced Power Off).

Определение информации об ОС
Рассмотрим пример вывода основных свойств операционной системы. В про-
граммном коде, представленном в листинге 2.18, показан пример вывода
названия, пути установки и номера версий установленных операционных
систем (их может быть несколько).




ServicesSet = Locator.ConnectServer(ИмяКомпыотера, "root\cimv2",
Пользователь, Пароль);
Items = ServicesSet.ExecQuery("Select * from Win32_OperatingSystem");
Для каждого Item Из Items Цикл
Сообщить("Название: " + Item.Caption);
Сообщить("Путь: " + Item.WindowsDirectory);
Сообщить("Версия: " + Item.Version);
КонецЦикла;


Выключение компьютера
Рассмотрим пример выключения компьютера с помощью метода
Win32Shutdown (ЛИСТИНГ 2.19).

i Листинг 2.19. Выключение компьютера

ServicesSet=nony4HTbCOM06beKT("winmgmts:{impersonationLevel=impersonate,
(Shutdown)}!\\" + ИмяКомпыотера + "\root\cimv2");
Items = ServicesSet.ExecQuery("Select * from Win32_OperatingSystem");
Для каждого Item Из Items Цикл
Item.Win32Shutdown(5); // Выключение
КонецЦикла;
77
Администрирование Windows средствами WMI


Определение разрешения экрана
Для определения разрешения экрана используются свойства ScreenWidth
(ширина) И ScreenHeight (высота) класса Win32_DesktopMonitor (ЛИС-
ТИНГ 2.20).




ServicesSet = Locator.ConnectServer(ИмяКомпьютера, "root\cimv2".
Пользователь, Пароль);
Items = ServicesSet.ExecQuery("Select * from Win32_DesktopMonitor");
Для каждого Item Из Items Цикл
Сообщить("Разрешение: " + Item.ScreenWidth + " x " + Item.ScreenHeight);
КонецПикла;



Список элементов автозагрузки
Для определения списка программ, которые загружаются при запуске опе-
рационной системы Windows, предназначен класс win32_startupcommand
(листинг 2.21).




ServicesSet = Locator.ConnectServer(ИмяКомпьютера, "root\cimv2",
Пользователь, Пароль);
Items = ServicesSet.ExecQuery("Select * from Win32_StartupCommand");
Для каждого Item Из Items Цикл
Сообщить("Команда: " + Itern.Command);
Сообщить("Описание: " + Item.Description);
Сообщить("Путь: " + Item.Location);
Сообщить("Имя: " + Item.Name);
Сообщить("Пользователь: " + Item.User);
КонецЦикла;



Активизация копии Windows XP/Server 2003
Для активации операционной системы Windows XP или Windows Server 2003
используется метод ActivateOnline () класса Win32_WindowsProductActivation
(листинг 2.22).
78 Глава 2



ServicesSet = Locator.ConnectServer(ИмяКомпьютера, "root\cimv2'
Пользователь, Пароль);
Items = ServicesSet.ExecQuery("Select * from
Win32_WindowsProductActivation");
Для каждого Item Из Items Цикл
Item.ActivateOnline();
КонецЦикла;



Просмотр учетных записей и доменов
Для работы с учетными записями и доменами обычно используются сле-
дующие классы:
О win32_ComputerSystem — содержит системную информацию компьютера;
П win32_Group — содержит данные о пользовательских группах;
О win32_Account — содержит данные о группах и пользователях системы.
Рассмотрим основные свойства класса win32_ComputerSystem:
П Description — описание объекта;
О Domain — имя домена, в котором зарегистрирован компьютер;
П DomainRole — роль компьютера;
П inf raredSupported — признак поддержки работы с инфракрасным портом;
П Manufacturer — производитель компьютера;
П Model — название компьютера;
П NumberOfProcessors — количество процессоров;
П userName — имя пользователя, работающего в настоящее время с системой;
П workgroup — имя рабочей группы.
Класс Win32_ComputerSystem имеет важный метод Rename (строка), который
может изменять сетевое имя компьютера. Метод имеет один параметр —
строка, содержащий новое имя компьютера.
Так как классы win32_Group и win32_Account довольно простые, поэтому
подробно они рассматриваться не будут.

Определение домена компьютера
Для определения домена, в котором находится компьютер, необходимо про-
читать СВОЙСТВО Domain класса Win32_ComputerSystem (ЛИСТИНГ 2.23).
79
Администрирование Windows средствами WMI




ServicesSet = Locator.ConnectServer(ИмяКомпьютера, "root\cimv2",
Пользователь, Пароль);
Computers = ServicesSet.ExecQuery("Select * from Win32_ComputerSystem");
Для каждого Computer Из Computers Цикл
Сообщить("Имя: " + Computer.Name);
Сообщить("Домен: " + Computer.Domain);
КонецЦикла;


Для определения домена так же можно использовать свойство DNSDomain
класса Win32_NetworkAdapterConfiguration.

Определение роли компьютера
Для определения роли компьютера, т. е. является ли компьютер сервером
или рабочей станцией, используется свойство DomainRoie класса
win32_computersystem. Данное свойство может возвращать одно из следую-
щих значений:
П о — самостоятельная рабочая станция (Standalone Workstation);
П 1 — член рабочей станции (Member Workstation);
П 2 — самостоятельный сервер (Standalone Server);
П з — рядовой сервер, т. е. сервер, не имеющий статуса контроллера в кон-
кретном домене (Member Server);
П 4 — резервный контроллер домена, т. е. компьютер в домене Windows
NT, который содержит копию политики безопасности домена и его базы
данных, а также служит резервом на случай, если главный контроллер
домена недоступен (Backup Domain Controller);
П 5 — главный контроллер домена, т. е. компьютер в домене, который хра-
нит главную копию базы данных учетных записей домена, проводит
аутентификацию пользователей, а также может работать как файл-сервер,
принт-сервер и сервер приложений (Primary Domain Controller).
Пример определения сетевой роли компьютера показан в листинге 2.24.




ServicesSet = Locator.ConnectServer(ИмяКомпьютера, "root\cimv2",
Пользователь, Пароль);
Computers = ServicesSet.ExecQuery("Select * from Win32_ComputerSystem");
Для каждого Computer Из Computers Цикл
80 Глава 2

Массив = Новый Массив();
Массив.Добавить("Standalone Workstation");
Массив.Добавить("Member Workstationn");
Массив.Добавить("Standalone Server");
Массив.Добавить("Member Server");
Массив.Добавить("Backup Domain Controller");
Массив.Добавить("Primary Domain Controller");


Сообщить("Роль компьютера: " + Массив[Computer.DomainRole]);
КонецЦикла;



Определение имени текущего пользователя
Для определения имени пользователя, который в настоящее время подключен
К компьютеру, используется СВОЙСТВО UserName класса Win32_ComputerSystem
(листинг 2.25).

j Листинг 2.25. Определение имени текущего пользователя

ServicesSet = Locator.ConnectServer(ИмяКомпьютера, "root\cimv2",
Пользователь, Пароль);
Computers = ServicesSet.ExecQuery("Select * from Win32_ComputerSystem");
Для каждого Computer Из Computers Цикл
Сообщить("Пользователь: " + Computer.UserName);
КонецЦикла;


Определение локальных групп компьютера
Для определения только локальных групп компьютера используется класс
Win32_Group С условием, ЧТО СВОЙСТВО LocalAccount равно True (Истина).
Пример определения локальных групп приведен в листинге 2.26.




ServicesSet = Locator.ConnectServer(ИмяКомпьютера, "root\cimv2",
Пользователь, Пароль);
Items = ServicesSet.ExecQueryt"Select * from Win32_Group
Where LocalAccount = True");
Для каждого Item Из Items Цикл
Сообщить("Локальная запись: " + Item.LocalAccount);
Администрирование Windows средствами WMI 81

Сообщить ("Имя группы: " + Item.Name) ;
Сообщить("Идентификатор: " + Item.SID);
Сообщить("Тип: " + Itera.SIDType);
Сообщить("Статус: " + Item.Status);
КонецЦикла;


Определение списка пользователей и групп
Для получения полного списка пользователей и групп используется класс
win32_Account. Данный класс имеет свойство зютуре, которое может при-
нимать следующие значения:
П 1 — если объект представляет свойства пользователя;
О 2 — группы пользователей;
П з — домена;
П 4 — псевдонима;
П 5 — общие группы;
П б — удаленной учетной записи;
П 7 — ошибочной учетной записи;
П 8 — неизвестной учетной записи;
П 9 — компьютера.
Ниже приведен пример вывода только пользователей и групп (листинг 2.27).




ServicesSet = Locator.ConnectServer(ИмяКомпьютера, "root\cimv2",
Пользователь, Пароль);
Items = ServicesSet.InstancesOf("Win32_Account");

Для каждого Item Из Items Цикл
Если Item.SIDType = 1 Тогда
Сообщить("Пользователь: " + Item.Caption);
ИначеЕсли (Item.SIDType = 2) или (Item.SIDType = 4)
или (Item.SIDType = 5) Тогда
Сообщить("Группа: " + Item.Caption);
КонецЕсли;
КонецЦикла;

Важно отметить, что объекты данного класса имеют разные наборы свойств
в зависимости от значения свойства зютуре.
82_ Глава 2

Работа с системной датой и временем
Для работы с датой и временем в WMI используется класс win32_LocaiTime.
Подробно останавливаться на нем не будем, т. к. он довольно простой.

Определение даты и времени
Приведем пример определения даты и времени, установленные на конкрет-
ном компьютере с помощью класса win32_LocaiTime (листинг 2.28).

! Листинг 2.28. Определение даты и времени
( „'^^__ _. ^ ^„„^^ iL— _„_„„—_— „—- . :_i.: .:_*_„

ServicesSet = Locator.ConnectServer(ИмяКомпьютера, "root\cimv2",
Пользователь, Пароль);
Items = ServicesSet.ExecQueryf"Select * from Win32_LocalTime");
Для каждого Item Из Items Цикл
Сообщить("День: " + Item.Day);
Сообщить("Месяц: " + Item.Month);
Сообщить("Год: " + Item.Year);
Сообщить("Час: " + Item. Hour);
Сообщить("Минута: " + Item.Minute);
Сообщить("Секунда: " + Item.Second);
КонецЦикла;



Определение временной зоны
Для определения временной зоны, установленной на компьютере, использу-
ется класс win32_TimeZone (листинг 2.29). В данном классе имеется два
свойства: для отображения имени временной зоны, соответствующей летне-
му Времени (DaylightName), И стандартное ИМЯ (standardName), которое СО-
ответствует временной зоне зимнего времени.
Класс win32_TimeZone имеет следующие свойства для определения данных
летнего времени:
П DaylightName — ИМЯ Временной ЗОНЫ;
П DayiightDayOfWeek — день недели (i — воскресенье, 2 — понедельник
и т. д., 7 — суббота);
П DaylightHour — час ДНЯ;
П DaylightMinute — Минута;
П DaylightSecond — секунда;
Администрирование Windows средствами WMI 83

CJ DaylightDay — день;
CD DaylightMonth — месяц;
П DaylightYear — ГОД.
Для временной зоны зимнего времени существует такой же набор свойств,
ТОЛЬКО префикс Daylight заменен на Standard.



ServicesSet = Locator.ConnectServer(ИмяКомпьютера, "root\cimv2",
Пользователь, Пароль);
Items = ServicesSet.ExecQueryf"Select * from Win32_TimeZone");
Для каждого Item Из Items Цикл
Сообщить("Временная зона (светлое время суток): " + Item.DaylightNaine);
Сообщить("Время: " + Item.DaylightHour + " " + Item.DaylightMinute +
:
" " + Item.DaylightSecond) ;
:
Сообщить("Временная зона (стандартное имя): " + Item.StandardName);
Сообщить("Время: " + Item.StandardHour + " " + Item.StandardMinute +
:
" " + Item.StandardSecond);
:
КонецЦикла;


Работа с журналами событий
Для работы с журналами событий в WMI существуют два класса:
О win32_NTEventLogFiie — работа с файлами журналов событий;
CJ win32_NTLogEvent — просмотр записей журналов.
Класс win32_NTEventLogFiie имеет следующие свойства:
П compressed — признак сжатия файла журнала событий;
П compressionMethod — метод сжатия файла;
П Description — описание объекта;
О Drive — имя логического диска, на котором располагается файл;
П Encrypted — признак криптования файла;
П EncryptionMethod — метод криптования файла;
П FiieName — имя файла;
О Fiiesize — размер файла в байтах;
П NumberOfRecords — количество записей в журнале.
Класс win32_NTEventLogFiie имеет следующие методы:
П Copy (FiieName) — копирует файл журнала в имя, указанное в параметре
FiieName;
84 Глава 2

О Rename (FiieName) — переименовывает файл журнала. Новое имя файла
задается в параметре FiieName;
О Delete ( ) — удаляет файл журнала;
П compress о — сжимает (архивирует) файл;
П Uncompress о — разархивирует файл журнала;
П ciearEventLog ( ) — очистка записей журнала.
Свойства класса win32_NTLogEvent рассматриваться не будет, т. к. их до-
вольно немного и все предназначены только для просмотра журнала собы-
тий. Пример просмотра журнала событий показан в листинге 2.32.

Получение информации о журнале событий
Приведем пример просмотра количества записей журнала "System", макси-
мально допустимого размера и имени файла (листинг 2.30).
7г т
-——
г" гт˜" ˜" ^1"1!Э1^г""˜˜˜" : ˜ ™ " ^ ---—-.- т :
ие информации о журнале событий

ServicesSet = Locator.ConnectServer(ИмяКомпьютера, "root\cimv2",
Пользователь, Пароль);
Items = ServicesSet.ExecQuery("Select * from Win32_NTEventLogFile where
LogFileName='System" 1 ) ;
Для каждого Item Из Items Цикл
Сообщить("Количество записей в журнале: " + Item.NumberOfRecords);
Сообщить("Максимальный размер файла: " + Item.MaxFileSize) ;
Сообщить("Имя файла журнала: " + Item.Name);
КонецЦикла;

В запросе данного кода происходит фильтрация объектов по условию — ме-
тод LogFiieName (имя журнала) равен строке 'system'.

Копирование и очистка журнала
Иногда бывает необходимо сделать копию журнала событий, после чего
очистить его. Для этих целей предназначены методы сору и ciearEventLog
класса Win32_NTEventLogFile (ЛИСТИНГ 2.31).

I Листинг 2.31. Копирование и очистка журнала событий

ServicesSet = Locator.ConnectServer(ИмяКомпьютера, "root\cimv2".
Пользователь, Пароль);
Items = ServicesSet.ExecQuery("Select * from Win32_NTEventLogFile where
Администрирование Windows средствами WMI 85

LogFileName='Application'");
Для каждого Item Из Items Цикл
Item.Copy("с:\application.evt"); // Копирование журнала
Item.ClearEventLogO; // Очистка журнала от записей
КонецЦикла;


Просмотр записей журнала
Для просмотра записей журнала используется класс win32_NTLogEvent.
Приведем пример просмотра записей журнала "System" (листинг 2.32).



ServicesSet - Locator.ConnectServer(ИмяКомпьютера, "root\cimv2",
Пользователь, Пароль);
Items = ServicesSet.ExecQuery("Select * from Win32_NTLogEvent where
Logfile='System"1 );
Для каждого Item Из Items Цикл
Сообщить("Category: " + Item.Category);
Сообщить("ComputerName: " + Item.ComputerName);
Сообщить("Message: " + Item.Message);
Сообщить("RecordNumber: " + Item.RecordNumber);
Сообщить("TimeWritten: " + Item.TimeWritten);
Сообщить("User: " + Item.User);
Сообщить (" ") ;
КонецЦикла;



Работа с файлами и папками
Для работы с файлами обычно применяется класс ciM_DataFiie. Основные
свойства класса:
П Name — полное имя файла;
П Path — путь к файлу;
П Archive — признак архивного файла;
П system — признак системного файла;
П compressed — признак сжатого файла;
П Drive — символ (идентификатор) логического диска, на котором записан
файл;
86 Глава 2

О Extension — расширение файла;
П FileSize — размер файла;
П EightDotThreeFiieName — DOS-совместимое имя файла (например, c:\progra˜l).
Основные методы класса:
О Compress о — сжимает файл;
П Copy(FileName) — копирует файл (новое имя файла определяется пара-
метром FileName);
П Delete о — удаляет файл;
О Rename (FileName) — переименовывает файл (новое имя файла определя-
ется параметром FileName).
В листингах 2.33 и 2.34 приведены примеры работы со свойствами и мето-
дами данного класса.

Переименование файлов
Приведем пример переименования файла ReadMe.txt, который находится
в папке c:\Program Files\lCv77 (листинг 2.33).

| Листинг 2.33. Переименование файлов

ServicesSet = ПолучитьСОМОбъект("winmgmts:!\\" + ИмяКомпьютера +
"\root\cimv2");
Items = ServicesSet.ExecQuery("Select * from Cim_Datafile where Name
'c:\\Program Files\\lCv77\\ReadNe.txt'");
Для каждого Item Из Items Цикл
Результат = Item.Rename("с:\\Program Files\\lCv77\\ReadMe.bak");
КонецЦикла;



Поиск всех файлов по расширению
Для того чтобы найти все файлы пользователя по расширению, использует-
ся запрос к классу ciM_DataFiie с условием по расширению (свойство
Extension). Пример поиска всех файлов с расширением МРЗ приведен
в листинге 2.34.
f____. , . „_ ____, . .„,,....» .„_.. _ „_|

| Листинг 2.34. Поиск всех файлов по расширению

ServicesSet = Locator.ConnectServer(ИмяКомпыотера, "root\cimv2",
Пользователь, Пароль);
Items = ServicesSet.ExecQuery("Select * from CIM_DataFile where Extension
= 'mp3'");
Администрирование Windows средствами WMI 87

Для каждого Item Из Items Цикл
Сообщить("Имя файла: " + Item.Name);
КонецЦикла;


Открытие общего доступа к папке
Для управления доступом к папкам в WMI используется класс win32_share.
Для создания доступа к папке предназначен метод Create, который имеет
следующие параметры:
П Path — путь к папке;
П Name — имя общего ресурса;
П туре — тип общего ресурса (о — папка или диск, i — принтер, 2 —
какое-либо устройство);
П махimumAilowed — максимальное количество подключений;
П Description — описание.
Для удаления доступа предназначен метод Delete без параметров.
Пример создания общего доступа к папке C:\Program Files приведен в лис-
тинге 2.35).

i Листинг 2.35. Открытие общего доступа к пап

FILE_SHARE = 0;
MAXIMUM_CONNECTIONS = 25;
ServicesSet =
ПолучитьСОМОбъект("winmgmts:{impersonationLevel=impersonate}!\\" +
ИмяКомпыотера + "\root\cimv2");
NewShare = ServicesSet.Get("Win32_Share");
Попытка
Результат = NewShare.Create("С:\Program Files", "Share4You",
FILE_SHARE, MAXIMUM_CONNECTIONS, "Общий доступ.");
Исключение
Сообщить("Ошибка. Невозможно открыть доступ.");
КонецПопытки;


Работа с принтерами
Для работы с принтерами используется класс win32_printer.
Рассмотрим основные свойства данного класса:
О Name — имя принтера;
О Comment — комментарий к принтеру;
Глава 2
88

П Default — признак принтера по умолчанию;
П Description — описание;
П DriverName — название драйвера принтера;
О Local — признак локального принтера;
П Network — признак сетевого принтера;
П shared — признак наличия общего доступа к принтеру;
О PortName — имя порта принтера;
П Printerstatus — текущий статус принтера (i — прочий, 2 — неизвест-
ный, з — ожидает, 4 — печатает, 5 — подготавливается, 6 — остановлен,
7 — выключен).
Класс win32_printer имеет следующие методы:
О AddPrinterConnection(Name) — добавить новый сетевой принтер с сете-
вым именем Name;
П setDefauitPrinter () — установить принтер по умолчанию;
П CancelAlUobs о — отменить все задания;
О Pause () — приостановить печать;
П Resume ( ) — возобновить печать;
О PrintTestPage о — распечатать тестовую страницу;
CJ RenamePrinter (NewPrinterName) — переименовать принтер (новое ИМЯ
принтера задается в параметре NewPrinterName).

Добавление нового сетевого принтера
Приведем пример добавления сетевого принтера с сетевым именем
"\\OfficeServer\MainOfficePrinter" (листинг 2.36).

инг 2.36. Добавление нового сетевого принтег

ServicesSet =
ПолучитьСОМОбъект("winmgmts:{impersonationLevel=impersonate}!\\" +
ИмяКомпьютера + "\root\cimv2");
NewPrinter = ServicesSet.Get("Win32_Printer");
Попытка
Результат = NewPrinter.AddPrinterConnection
("\\OfficeServer\MainOfficePrinter");
Исключение
Сообщить("Ошибка. Невозможно добавить принтер.");
КонецПопытки;
Администрирование Windows средствами WMI 89


Установка принтера по умолчанию
Пример установки принтера по умолчанию приведен в листинге 2.37.
Г " """""Г™ ."""•-——--- — -
---—-
i Листинг 2.37. Установка принтера по умолчанию

ИмяПринтера = "MainOfficePrinter";
ServicesSet = ПолучитьСОМОбъект("winmgmts:{impersonationLevel=
impersonate}!\\" + ИмяКомпыотера + "\root\cimv2");
Printers = ServicesSet.Get("Win32_Printer");
Items = ServicesSet.ExecQuery("Select * from Win32_Printer Where Name =
' + ИмяПринтера + " " ;
" ')'
Для каждого Item Из Items Цикл
Item.SetDefaultPrinter();
КонецЦикла;

В данном примере, в запросе, используется конструкция where для фильт-
рации объектов коллекции по имени (свойство Name).


Работа с заданиями планировщика
Для работы с заданиями планировщика используется класс win32_scheduledjob.
Основные свойства данного класса определены на примере просмотра зада-
ний (листинг 2.38).
Класс win32_scheduiedJob имеет два метода.
О create — добавить задание. Метод имеет следующие параметры:
• Command — путь к программе, которая будет запускаться;
• startTime — время запуска в UTC-формате (Universal Time
Coordinated — универсальное синхронизированное время), при этом
общее представление формата можно записать в виде —
"YYYYMMDDHHMMSS.MMMMMM(+-)OOO", где "YYYYMMDD"
можно заменить на "********•• (например, дата "******** 123000.000000-
420" означает запуск в 12:30 после полудня;
• RunRepeatedly — признак многократного выполнения;
• Daysofweek — день недели (1 — понедельник, 2 — вторник, 4 — среда,
8 — четверг, 16 — пятница, 32 — суббота, 64 — воскресенье);
• DaysOfMonth — число месяца;
• interactwithDesktop — признак взаимодействия с рабочим столом;
• Jobid — идентификационный номер задания.
О Delete () — удалить задание.
90 Глава 2

Просмотр заданий в планировщике
Рассмотрим пример просмотра всех заданий планировщика (листинг 2.38).

эосмотр задании в планировщике

ServicesSet = ПолучитьСОМОбъект("winmgmts:{impersonationLevel=
impersonate)!\\" + ИмяКомпьютера + "\root\cimv2");
Items = ServicesSet.ExecQuery("Select * from Win32_ScheduledJob");
Для каждого Item Из Items Цикл
Сообщить("Заголовок: " + Item.Caption);
Сообщить("Команда: " + Item. Command) ;
Сообщить("День месяца: " + Item.DaysOfMonth);
Сообщить("День недели: " + Item.DaysOfWeek);
Сообщить("Описание: " + Item.Description);
Сообщить("Продолжительность: " + Item.ElapsedTime);
Сообщить("Дата инсталляции: " + Item.InstallDate);
Сообщить("Имя: " + Item.Name);
Сообщить("Оповещение: " + Item.Notify);
Сообщить("Приоритет: " + Item.Priority);
Сообщить("Время старта: " + Item.StartTime);
Сообщить("Статус: " + Item.Status);
Сообщить("===================—=========");
КонецЦикла;


Создание заданий
Для создания задания используется метод create. Приведем пример ежеме-
сячного запуска программы "Блокнот" (notepad.exe) каждого второго числа
месяца в 23:30 (листинг 2.39).




Перем Номер;
ServicesSet = ПолучитьСОМОбъект("winmgmts:{impersonationLevel=
impersonate}!\\" + ИмяКомпьютера + "\root\cimv2");
ObjectSet = ПолучитьСОМОбъект("WinMgmts:Win32_ScheduledJob");
ObjectSet.Create("notepad.exe", "********123000.000000-
420",True,1,2,True,Номер);
Сообщить("Заданию присвоен номер: " + Номер);
Администрирование Windows средствами WMI 91

Работа с системным реестром
Для работы с системным реестром предназначен класс stdRegProv, принад-
лежащий пространству имен root\default. Данный класс совсем не имеет
свойств, все действия и значения ключей доступны только через методы.
П CreateKey(DefKey, SubKeyName) — создание нового ключа. Параметры
метода могут принимать значения:
• DefKey — идентификатор корневого имени раздела, определяется зна-
чениями:
О 2147483648-HKEY_CLASSES_ROOT;
О 2147483649-HKEY_CURRENT_USER;
О 2147483650 - HKEY_LOCAL_MACHINE;
О 2147483651- HKEYJJSERS;
О 2147483653- HKEY_CURRENT_CONFIG;
О 2 1 4 7 4 8 3 6 5 4 - HKEY_DYN_DATA;
• SubKeyName — имя создаваемого ключа (раздела).
О DeieteKey(DefKey, SubKeyName) — удаление раздела. Параметры метода
аналогичны Методу CreateKey.
П DeleteValue(DefKey, SubKeyName, ValueName) — удаление параметра.
Параметры DefKey и SubKeyName аналогичны параметрам метода create-
Кеу, параметр ValueName задает имя удаляемого параметра.
П GetDWORDValue(DefKey, SubKeyName, ValueName, Value) — Получение
значения параметра типа DWORD. Параметры DefKey, SubKeyName и ValueName
аналогичны параметрам метода DeleteValue. В параметр value возвраща-
ется значение ключа ValueName.
П GetStringValue(DefKey, SubKeyName, ValueName, Value) — Получение
строкового параметра. Все параметры аналогичны параметрам метода
GetDWORDValue.
О GetExpandedStringValue(DefKey, SubKeyName, ValueName, Value) -
получение значения расширяемого строкового параметра. Все параметры
аналогичны параметрам метода Getstringvaiue.
П SetDWORDValue(DefKey, SubKeyName, ValueName, V a l u e ) — создание
нового параметра типа DWORD. Здесь параметр value задает значение клю-
ча, остальные аналогичны параметрам метода Getstringvaiue.
П SetStringValue(DefKey, SubKeyName, ValueName, Value) — создание
строкового параметра. Все параметры аналогичны параметрам метода
SetDWORDValue.
Глава 2
92

П SetExpandedStringValue(DefKey, SubKeyName, ValueName, Value) —
создание параметра расширяемого строкового типа. Все параметры ана-
логичны параметрам метода setowoRovaiue.

Чтение значений ключей реестра
Для чтения значений ключей реестра используются методы GetstringValue,
GetExpandedStringValue И GetstringValue, В зависимости ОТ Типа значения
параметра.
Рассмотрим пример чтения значения параметра с именем "HistoryBuf fersize",
находящимся в разделе HKEY_CURRENT_USER\ Console (листинг 2.40).




Перем Значение;

HKEY_CURRENTJJSER = 2147483649;
ПутъККлючу = "Console";
ИмяПараметра = "HistoryBufferSize";


Reg = ПолучитьСОМОбъект("winmgmts:{impersonationLevel=impersonate}!\\" +
ИмяКомпьютера + "\root\default:StdRegProv");
Reg.GetDWORDValue(HKEY_CURRENT_USER, ПутьККлючу, ИмяПараметра, Значение);
Сообщить("Значение: " + Значение);


Создание нового раздела
Приведем пример создания нового раздела с помощью класса StdRegProv
(листинг 2.41).

а раздела

HKEY_LOCAL_MACHINE = 2147483650;
Reg = ПолучитьСОМОбъект("winmgmts:{impersonationLevel=impersonate}!\\" +
ИмяКомпьютера + "\root\default:StdRegProv");
ПутьККлючу = "SOFTWARE\NewKey";
Reg.CreateKey(HKEY_LOCAL_MACHINE, ПутьККлючу);

В приведенном примере создается раздел HKEY_LOCAL_MACHINE\
SOFTWARE\ NewKey.
Администрирование Windows средствами WMI 93


Создание нового параметра
Рассмотрим пример создания нового параметра реестра (листинг 2.42).
В примере создается параметр "Форум для вопросов" со значением
"http://forum.erpg.ru" в разделе HKEY_LOCAL_MACHINE\ SOFTWARE\
NewKey.


|
ние нового параметра реестра

HKEY_LOCAL_MACHINE = 2147483650;
ПутьККлючу = "SOFTWARE\NewKey";
Reg = ПолучитьСОМОбъект("winmgmts:{impersonationLevel=impersonate}!\\" +
ИмяКомпьютера + "\root\default:StdRegProv");
ИмяПараметра = "Форум для вопросов";
Значение = "http://forum.erpg.ru";
Reg.SetExpandedStringValue(HKEY_LOCAL_MACHINE, ПутьККлючу, ИмяПараметра,
Значение);


Работа с сетью
Для работы с сетью в WMI предназначены два основных класса:
Win32_NetworkAdapterConfiguration И Win32_NetworkAdapter. Перечислять все
свойства и методы не имеет смысла, т. к. их огромное количество. Назначение
многих очень специфичные и будут понятны только сетевым администраторам.
Рассмотрим только некоторые из них.


Отключение сетевого соединения
Если вы используете протокол динамической конфигурации хоста (DHCP,
Dynamic Host Configuration Protocol), то отключить сетевое соединение можно
методом ReleaseDHCPLease класса Win32_NetworkAdapterConfiguration
(листинг 2.43). Иначе, с помощью WMI, это выполнить невозможно. Для
возобновления соединения используется метод RenewDHCPLease.

4ёние сетевого соединения

ServicesSet = ПолучитьСОМОбъект("winmgmts:{impersonationLevel=
impersonate}!\\" + ИмяКомпьютера + "\root\ci_mv2");
Items = ServicesSet.ExecQuery("Select * From
Win32_NetworkAdapterConfiguration Where IPEnabled = True");
Для каждого Item Из Items Цикл
Item.ReleaseDHCPLease();
КонецЦикла;
94 Глава 2
^


Определение MAC- и IP-адресов
Для определения IP'^aflpeca, который назначен данному сетевому компьюте-
ру, необходимо сначала определить его МАС-адрес, используя класс
Win32_NetworkAdapter. А затем, ИСПОЛЬЗуя класс Win32_NetworkAdapterConfiguration,
найти IP-адрес, соответствующий данному МАС-адресу. Пример реализации
такого механизма поиска приведен в листинге 2.44.

Листинг 2.44. Определение MAC- и IP-адресов

MACAddress = " ;
"
ServicesSet = ПолучитьСОМОбъект("winmgmts:{impersonationLevel=
impersonate}!\\" + ИмяКомпьютера + "\root\cimv2");
Items = ServicesSet.ExecQuery("Select * From Win32_NetworkAdapter");
Для каждого Item Из Items Цикл
MACAddress = Item.MACAddress;
КонецЦикла;


Если MACAddress о " Тогда
"
Сообщить("MAC адрес: " + MACAddress);


Items = ServicesSet.ExecQuery("Select * From
Win32_NetworkAdapterConfiguration");
Для каждого Item Из Items Цикл
Если Item.MACAddress = MACAddress Тогда
Для каждого IPAddress Из Item.IPAddress Цикл
Сообщить("IP адрес: " + IPAddress);
КонецЦикла;
КонецЕсли;
КонецЦикла;
КонецЕсли;


Использование команды Ping
Для проверки доступности адресата путем передачи ему специального сиг-
нала можно использовать программу ping.exe. Средствами WMI это можно
сделать с помощью проверки значения свойства statusCode класса
Win32_PingStatus (ЛИСТИНГ 2.45).
В качестве значения свойства Address, в запросе, может использоваться как
имя компьютера (Hostname), так и IP-адрес.
Администрирование Windows средствами WMI 95


зание команды Ping

//IPAddress = "172.20.129.102"; // IP-адрес
IPAddress = "MAVCOMP"; // Hostname


ServicesSet = ПолучитьСОМОбъект("winmgmts:\\" + ИмяКомпьютера +
"\root\cimv2");
Items = ServicesSet.ExecQuery("Select * From Win32_PingStatus
where Address = ' + IPAddress + " " ;
" ')

Для каждого Item Из Items Цикл
Если (Item.StatusCode = NULL) или (Item. StatusCode <> 0) Тогда
Сообщить("Компьютер не отвечает.");
Иначе
Сообщить("Компьютер ответил.");
КонецЕсли;


КонецЦикла;
Глава 3


Использование скриптов WSH


Что такое WSH
Windows Script Host (WSH) — это стандартный компонент операционной
системы Windows, который позволяет без предварительной компиляции
непосредственно в операционной системе запускать сценарии, написанные
на любых языках, ибддерживающих технологию СОМ. Собственная объект-
ная модель WSH/ позволяет из сценариев работать с файловой системой,
системным реестром, специальными папками и ярлыками Windows, ресур-
сами локальной сети, а также запускать процессы и контролировать ход их
выполнения. Кроме этого, в самих сценариях WSH можно использовать лю-
бые серверы автоматизации (СОМ-объекты), зарегистрированные в системе.

^ Примечание
WSH встроена в операционные системы Microsoft Windows 98/ME/NT/2000/XP/
Server 2003. Для Windows 95 Windows Script Host можно загрузить с сайта
Microsoft — http://msdn.microsoft.com/scripting.



Объектная модель WSH
Для того чтобы воспользоваться всеми возможностями, которые представля-
ет эта технология, нужно разобраться в ее структуре. Windows Script Host
состоит из целого ряда объектов.
О wscript — это главный объект WSH, который содержит информацию
о сервере сценариев WSH и позволяет создавать СОМ-объекты, выдавать
сообщения в операционную систему, вводить данные с клавиатуры и т. п.
Так как данный объект позволяет выполнять все те базовые действия, ко-
торые без особых трудностей можно выполнить в среде "1С:Предприятие",
то рассматривать этот объект в контексте данной книги будет не уместно.

4 Зак. 722
98 Глава 3

П WshArguments, WshNamed И WshUnnamed — объекты, обеспечивающие ДОС-
туп к параметрам командной строки запущенного сценария Windows.
Данные объекты используются исключительно во время запуска скрип-
тов из операционной системы, поэтому их рассмотрение в рамках данной
книги бессмысленно.
П wshshell — объект, который позволяет запускать независимые процессы,
создавать ярлыки, работать с переменными среды, системным реестром и
специальными папками Windows.
П wshSpeciaiFolders — объект, обеспечивающий доступ к специальным
папкам Windows.
П wshshortout — объект, который обеспечивает работу с ярлыками
Windows.
О wshurishortout — объект, предназначенный для работы с ярлыками се-
тевых ресурсов.
П wshEnvironment — объект, предназначенный для работы с переменными
среды (для просмотра, изменения и удаления переменных среды).
О wshNetwork — объект, использующийся при работе с локальной сетью.
Он содержит сетевую информацию для локального компьютера, а также
позволяет подключать сетевые диски и принтеры.
П wshScriptExec — объект, позволяющий запускать консольные приложе-
ния в качестве дочерних процессов. Обеспечивает контроль этих прило-
жений и доступ к их стандартным входным и выходным потокам.
П wshController — объект, управляющий запуском сценариев на удален-
ных машинах.
О wshRemote — объект, позволяющий управлять сценарием, запущенным на
удаленной машине.
П wshRemoteError — объект, используемый для получения информации об
ошибке, возникшей в результате выполнения сценария, запущенного на
удаленной машине.
CJ FileSystemObject — дополнительный объект, обеспечивающий доступ
к файловой системе компьютера.


Запуск произвольного VB-скрипта (VBS)
В настоящее время очень распространены VB-скрипты, которые пришли
на замену пакетным файлам (bat). Очень часто возникает необходимость
в запуске того или иного скрипта из системы "1,С:Предприятие". Однако
времени, а зачастую и возможности переводить код из одного языка про-
граммирования в другой, нет. Как раз для такой ситуации и используется
Использование скриптов WSH дд

СОМ-объект — Msscriptcontroi, который позволяет запустить произвольный
скрипт из контекста "ЮПредприятия". Объект Msscriptcontroi не входит
в объектную модель WSH, но часто применяется в "скриптовых" языках.
Рассмотрим пример запуска VB-скрипта и вывода его результата в окно со-
общений системы "1С:Предприятие" (листинг 3.1).




// Произвольный скрипт
ТекстСкрипта = "Function VBSFunction(}
I GetDefaultPrinter = vbNullString
I Set objWMIService = GetObject(""winmgmts:"" & ""{impersonationLevel=
impersonate}!\\.\root\cimv2"")
I Set colInstalledPrinters = objWMIService.ExecQuery(""Select * from
Win32_Printer"")
I For Each objPrinter in colInstalledPrinters
I If objPrinter.Attributes and 4 Then
I VBSFunction=obj Printer.Name
I Exit For
I End If
I Next
I End Function";

// Создание объекта
scrptCtrl = Новый СОМОбъект("MSScriptControl.ScriptControl");
scrptCtrl.Language="vbscript"; // Указание языка
// Добавление исполняемого кода
scrptctrl.Addcode(ЭлементыФормы.ПолеТекстовогоДокумента.ПолучитьТекст());
// Запуск функции по имени и вывод результата
Сообщить(scrptCtrl.run("VBSFunction"));

На самом скрипте останавливаться не будем, т. к. это тема другой главы.
Здесь только следует отметить, что он возвращает имя принтера, используе-
мого в системе по умолчанию. Вообще в переменную ТекстСкрипта можно
записать любую функцию на VB-скрипте, а потом выполнить эту функцию,
выполнив метод run объекта Msscriptcontroi.ScriptControl с указанием
имени запускаемой функции.

Примечание
Рассмотренный выше код для версии 7.7 будет аналогичным, за исключением
создания СОМ-объекта.
100 Глава 3


Выполнение операций
с файловой системой
Для работы с файловой системой из сценариев WSH предназначен объект
FileSystemObject. С помощью этого объекта можно выполнить следующие
основные действия:
П создавать каталоги;
П создавать или открывать текстовые файлы;
П копировать или перемещать файлы и каталоги;
П удалять файлы и каталоги;
П создавать объекты Drive, Folder и File для доступа к конкретному дис-
ку, каталогу или файлу соответственно.
С помощью свойств объектов Drive, Folder и File можно получить деталь-
ную информацию о тех элементах файловой системы, с которыми они ассо-
циированы. Объекты Folder и File также предоставляют методы манипули-
рования файлами и каталогами (создание, удаление, копирование,
перемещение); эти методы в основном копируют соответствующие методы
объекта FileSystemObject.
Кроме того, имеются три объекта-коллекции: Drives, Folders и Files. Кол-
лекция Drives содержит объекты Drive для всех имеющихся в системе дис-
ков, Folders — объекты Folder для всех подкаталогов заданного каталога,
Files — объекты File для всех файлов, находящихся внутри определенного
каталога.
Наконец, из сценария можно читать информацию текстовых файлов и запи-
сывать в них данные. Методы для этого предоставляет объект Textstream.
С помощью объекта FileSystemObject можно очень просто написать некое
подобие файлового менеджера "Проводник". Рассмотрим основные опера-
ции с файловой системой.


Получение сведений о дисках
Для получения сведений об определенном диске предназначен объект
Drive. Данный объект позволяет получить информацию о типе файловой
системы, метки тома, общем объеме и количестве свободного места и т. д.
Сам объект Drive создается с помощью метода GetDrive объекта
FileSystemObject. Приведем пример вывода всех доступных свойств диска
(листинг 3.2).
Использование скриптов WSH 101




// Создаем массив типов дисков
ТипыДисков = Новый Массив();
ТипыДисков.Добавить("Неизвестно");
ТипыДисков.Добавить("Съемный");
ТипыДисков.Добавить("Постоянный");
ТипыДисков.Добавить("Сетевой");
ТипыДисков.Добавить("CD-ROM");
ТипыДисков.Добавить("RAM-диск");


// Создаем объект FileSystemObject
FS© = Новый СОМОбъект("Scripting.FileSystemObject");
// Получаем ссылку на объект
Drive = FSO.GetDriveC'C") ;


// Выводим свойства диска
Сообщить("Информация о диске С:");
Сообщить("Метка диска: " + Drive.VolumeName);
Сообщить("Размер диска: " + Drive.TotalSize/1024 + " Кбайт'
Сообщить("Свободно: " + Drive.FreeSpace/1024 + " Кбайт");
Сообщить("Буква диска: " + Drive.DriveLetter);
Сообщить("Тип: " + ТипыДисков[Drive.DriveType]);
Сообщить("Файловая система: " + Drive.FileSystem);
Сообщить("Готов к чтению: " + Drive.IsReady);
Сообщить("Путь: " + Drive.Path);
Сообщить("Начальная папка: " + Drive.RootFolder);
Сообщить("Серийный номер: " + Drive.SerialNumber);
Сообщить("Сетевое имя: " + Drive.ShareName);


// Изменяем метку диска
Drive.VolumeName = "www.erpg.ru";



Из всех используемых в коде свойств только VolumeName доступно как для
чтения, так и для записи, т. е. с помощью этого свойства можно изменять
метку диска.
102 Глава 3


Получение сведений о папках и файлах
Для получения сведений о папках и файлах используются объекты Folder.и
File. Данные объекты позволяют определить дату создания или последнего
обращения к папке или файлу, их размер, атрибуты и т. д. Сами объекты соз-
даются С ПОМОЩЬЮ методов GetFolder И GetFile объекта FileSystemObject.
Рассмотрим пример вывода всех доступных свойств папки (листинг 3.3).




// Функция возвращает строку с атрибутами файла File.
// Вызывается из основного кода при получении сведений о папке или файле
Функция ВернутьАтрибутыФайла(File)
Attr = ПереводИзЮ(File.Attributes, 2);
// Функция ПереводИзЮ переводит число из 10 системы счисления
// в произвольную, в данном случае - двоичную.


Если Attr = 0 Тогда
Возврат "Обычный";
КонецЕсли;
-
Стр = " ;
"
Если (Сред(Attr,СтрДлина(Attr}-4,1) = "1") и (СтрДлина(Attr) > 4)
Тогда Стр = Стр + "Папка " КонецЕсли;
Если (Сред(Attr,СтрДлина(Attr),1) = "1") и (СтрДлина(Attr) > 0)
Тогда Стр = Стр + "Только чтение " КонецЕсли;
Если (Сред(Attr,СтрДлина(Attr)-!,!) = "1") и (СтрДлина(Attr) > 1)
Тогда Стр = Стр + "Скрытый " КонецЕсли;
Если (Сред(Attr,СтрДлина(Attr)-2,1) = "1") и (СтрДлина(Attr) > 2)
Тогда Стр = Стр + "Системный " КонецЕсли;
Если (Сред(Attr,СтрДлина(Attr)-3,1) = "1") и (СтрДлина(Attr) > 3)
Тогда Стр = Стр + "Метка " КонецЕсли;
Если (Сред(Attr,СтрДлина(Attr)-5,1) = "1") и (СтрДлина(Attr) > 5)
Тогда Стр = Стр + "Архивный " КонецЕсли;
Если (Сред(Attr,СтрДлина(Attr)-10,1) = "1") и (СтрДлина(Attr) > 10)
Тогда Стр = Стр + "Синоним " КонецЕсли;
Если (Сред(Attr,СтрДлина(Attr)-11,1) = "1") и (СтрДлина(Attr) > 11)
Тогда Стр = Стр + "Сжатый " КонецЕсли;
Использование скриптов WSH 103
Возврат Стр;
КонецФункции


// Основная часть кода.
// Создаем объект FileSystemObject
FSO = Новый СОМОбъект("Scripting.FileSystemObject");


// Получаем ссылку на объект
Folder = FSO.GetFolder ("с: \Program FilesV) ;

// Выводим свойства папки
Сообщить("Информация о папке c:\Program FilesV1);
Сообщить("Атрибуты: " + ВернутьАттрибутыФайла(Folder));
Сообщить("Дата создания: " + Folder.DateCreated);
Сообщить("Дата последнего доступа: " + Folder.DateLastAccessed);
Сообщить("Дата последнего изменения: " + Folder.DateLastModifled);
Сообщить("Признак корневой папки: " + Folder.IsRootFolder);
Сообщить("Имя: " + Folder.Name); //!!
Сообщить("Родительская папка: " + Folder.ParentFolder);
Сообщить("Путь: " + Folder.Path);
Сообщить("Короткое имя: " + Folder.ShortName);
Сообщить("Короткий путь: " + Folder.ShortPath);
Сообщить("Размер: " + Folder.Size);
Сообщить("Доступ к дочерним папкам: " + Folder.SubFolders);
Сообщить("Туре: " + Folder.Type);

Объект File имеет подобный набор свойств.

Е^ Примечание
Свойство Name доступно для записи, т. е. с помощью его можно переименовать
файл или папку.

Отдельного внимания заслуживает свойство SubFolders, которое предостав-
ляет доступ к дочерним папкам. Данное свойство возвращает коллекцию
Folders, которая содержит объекты Folder. Элементы коллекции системы
"1С:Предприятие" в версии 8.0 можно получить с помощью конструкции
Для каждого...из...Цикл...конецЦикла. Для версии 7.7 это можно сделать только
с помощью внешней компоненты или СОМ-объекта (пример такого СОМ-
объекта был рассмотрен в главе 2).
Глава 3
104

Проверка существования определенного диска,
каталога или файла
Для проверки существования определенного диска, каталога или файла
предназначены методы DriveExists, FoiderExists и FileExists объекта
FileSystemObject.
Данные методы возвращают Истина (в версии 7.7 метод возвращает -1), если
диск, папка или файл, переданный в качестве параметров найден, иначе —
ложь (в версии 7.7 метод возвращает 0).
Обычно данные методы применяются перед какими-либо действиями над
дисками, файлами или папками, чтобы удостовериться, что они реально су-
ществуют и дальнейшая работа с ними не вызовет ошибок.
Приведем простой пример проверки наличия файла (листинг 3.4).

: Листинг 3.4. Проверка на наличие файла

ИмяФайла = "c:\Program Files\lcv8\bin\lcv8.exe";
FSO = Новый СОМОбъект("Scripting.FileSystemObject");
Если FSO.FileExists(ИмяФайла) Тогда
Сообщить("Файл существует!");
Иначе
Сообщить("Файл не найден!");
КонецЕсли;



Копирование файлов и папок
Для копирования файлов и папок предназначены методы copyFile и
CopyFolder объекта FileSystemOb]ect, а также методы File.Copy И
Folder.Copy.
Рассмотрим простой пример копирования файла и папки (листинг 3.5).

Листинг 3.5. Копирование <

FSO = Новый СОМОбъект{"Scripting.FileSystemObject");


// Копирование файла
FSO.CopyFile("с:\Program Files\lCv77\ReadMe.txt", "с:\");
// Копирование папки
FSO.CopyFolder("c:\lc", "c:\2c");
Использование скриптов WSH 105

Метод copyFiie имеет важную особенность — в качестве первого параметра
можно задавать маску копируемых файлов. Например, чтобы скопировать
все файлы с расширением doc, необходимо вызвать метод следующим обра-
зом: CopyFiie("с:\*.doc", " d : \ " ) .

Перемещение файлов и папок
Для перемещения файлов и папок предназначены методы Movefile и
MoveFolder объекта FileSystemObject, ИЛИ МСТОДЫ File.Move И
Folder.Move.
Рассмотрим пример перемещения файлов (листинг 3.6).

Листинг 3.6. Перемещение файлов

FSO = Новый СОМОбъект("Scripting.FileSystemObject");

// Перемещение файлов
FSO.MoveFile("c:\Program Files\lcv8\*.htm", "c:\");

В приведенном коде перемещаются все файлы с расширением htm.

Удаление файлов и папок
Для удаления файлов и папок применяются методы DeieteFile и
DeleteFolder объекта FileSystemObject, ИЛИ методы File.Delete И
Folder.Delete.
Рассмотрим пример удаления файлов (листинг 3.7).



FSO = Новый СОМОбъект("Scripting.FileSystemObject");

// Удаление файлов
FSO.DeleteFile("c:\*.htm");

Приведенный выше код осуществляет удаление всех файлов с расширением
htm.
"
Создание папок
Для создания папок предназначены методы FileSystemObject.CreateFolder
и Folders.Add. Перед созданием вложенной папки необходимо удостове-
106 Глава 3

риться, что существует папка верхнего уровня, иначе появится ошибка.
То есть данные методы не предназначены для создания группы вложенных
папок.
Ниже приведен пример последовательного создания группы вложенных па-
пок (листинг 3.8).




FSO = Новый СОМОбъект("Scripting.FileSystemObject");


Корень = "c:\test\";
FSO.CreateFolder(Корень);


// Создаем группу папок
Для Ном! = 1 По 5 Цикл
FSO.CreateFolder(Корень + "folder" + Ном!);
Для Ном2 = 1 По 5 Цикл
FSO.CreateFolder(Корень + "folder" + Ном! + "\subfolder" + Ном! + "_"
+ Ном2) ;
КонецЦикла;
КонецЦикла;



Работа с текстовыми файлами
С помощью WSH можно создавать текстовые файлы. Для этого предусмот-
рены методы FileSystemObj ect. CreateTextFile И Folders . CreateTextFile.
Данные методы возвращают ссылку на объект Text stream и имеют три па-
раметра:
П Filename — ИМЯ файла;
О overwrite — признак замены существующего файла (параметр является
не обязательным);
П Unicode — признак создания файла в формате Unicode, иначе создается
в формате ANSI (параметр является не обязательным).
С помощью методов writeLine и WriteBiankLines полученного объекта
Textstream можно добавлять строки в файл.
Рассмотрим пример создания файла в формате ANSI и записи в него несколь-
ких строк (листинг 3.9).
Использование скриптов WSH 107



FSO = Новый СОМОбъект("Scripting.FileSystemObject") ;

// Получаем объект TextStream
File = FSO.CreateTextFile("С:ХПример создания файла.txt", Истина, Ложь);
File.WriteLine("Дата создания: " + РабочаяДата);
File.WriteBlankLines(2); // Добавляем 2 пустые строки
File.WriteLine("Добро пожаловать на сайт автора: www.erpg.ru");
File.WriteLine("Copyright (С) Андрей Михайлов aka MAV 2004");
File.Close ();


В WSH нельзя создавать файлы, отличные от текстовых.
Для открытия текстового файла, с целью чтения, записи или добавления
НОВЫХ записей, Предназначены методы FileSystemObject.OpenTextFile И
File.openTextstream. Данные методы имеют ряд параметров.
П! Filename — ИМЯ файла.
П lomode — режим открытия файла. Параметр может принимать следующие
значения:
• 1 — только для чтения;
• 2 — для записи;
• 8 — открытие файла и добавления строк в конец.
П Create — признак создания нового файла.
П Format — формат открываемого файла. Параметр может принимать сле-
дующие значения:
• -2 — используется формат, принятый по умолчанию в системе;
• -1 — Unicode;
• о - ASCII.
Для чтения всего текста из файла используется метод ReadAiK). Для по-
строчного чтения— ReadLineO. Рассмотрим пример открытия и чтения
файла (листинг 3.10).




ИмяФайла = "С:ХПример создания файла.txt";
FSO = Новый COM06beKT("Scripting.FileSystemObject");


// Проверяем, существует ли необходимый файл на диске
108 Глава 3
Если FSO.FileExists(ИмяФайла) Тогда
File = FSO.OpenTextFile(ИмяФайла, 1, Ложь, 0);
Сообщить(File.ReadAll());
Иначе
Сообщить("Файл не найден!");
КонецЕсли;


Получение списка всех доступных дисков,
папок и файлов
Для получения списка всех доступных дисков у объекта FileSystemObject суще-
ствует коллекция Drives, содержащаяся В свойстве FileSystemObject. Drives.
Для папок, в этом случае, имеется коллекция Folders, содержащаяся
в свойстве Folder.SubFoiders. Для файлов— коллекция Files, содержа-
щаяся В свойстве Folder.Files.
Рассмотрим примеры вывода списка всех дисков (листинг 3.11) и списка
всех файлов и папок (листинг 3.12).




FSO = Новый СОМОбъект("Scripting.FileSystemObject"}

<<

стр. 3
(всего 10)

СОДЕРЖАНИЕ

>>