Будь умным!


У вас вопросы?
У нас ответы:) SamZan.net

Лабораторна робота 9

Работа добавлена на сайт samzan.net: 2016-06-20

Поможем написать учебную работу

Если у вас возникли сложности с курсовой, контрольной, дипломной, рефератом, отчетом по практике, научно-исследовательской и любой другой работой - мы готовы помочь.

Предоплата всего

от 25%

Подписываем

договор

Выберите тип работы:

Скидка 25% при заказе до 20.5.2024

          21

Лабораторна робота 9.

Використання засобів адміністрування систем. WMI.

Теоретична частина

  1.  Знайомство з WMI. Архітектура WMI

WMI (Windows Management Instrumentarium) - це реалізація Microsoft ініціативи WBEM (Web - BasedEnterprise Management), оголошеної консорціумом фірм і спрямованої на зниження загальної вартості володіння мережею. WMI використовується для створення скриптів для повного управління Windows, у тому числі:

  •  самою операційною системою;
  •  системними пристроями;
  •  AD;
  •  реєстром;
  •  лічильниками продуктивності;
  •  файловою системою і тому подібне

WMI поставляється у складі Windows 2000, Windows XP і Windows Server 2003, на Windows 98, ME і NT його треба заздалегідь встановлювати (дистрибутиви - на Web -сайте Microsoft).

Архітектура WMI складається з 4 головних компонентів.

Перший компонент - застосування, що управляють. Як правило, це застосування або служби Windows, які отримують дані від WMI. Зазвичай вони забезпечують можливість взаємодії користувача сWMI. У нашій ситуації роль застосувань, що управляють, гратимуть скрипти. Стандартні застосування, що управляють, - SMS, MOM, Tivoli, набір інструментів, що входять до складу WMI SDK і тому подібне

Другий компонент - керовані об'єкти, тобто ті об'єкти, доступ до яких можна отримати за допомогою WMI. Різноманітність керованих об'єктів дуже велика - від вентилятора, встановленого в системного корпусі, до, наприклад, SQL Server з усіма встановленими базами даних.

Третій компонент - провайдери WMI, тобто драйвери WMI, які дозволяють дістати доступ до якого-небудь класу об'єктів. Наприклад, в стандартному постачанні Windows присутні драйвери WMI для роботи з реєстром, журналом подій, апаратними пристроями і тому подібне

Четвертий компонент - програмне забезпечення WMI (WMI software, winmgmt.exe) і репозитарийCIM (Common Information Model). Обидва ці компоненти відповідають за надання запрошуваній засобами WMI інформації і реакцію на виклик методів, проте у них існує розподіл обов'язків : WMI software відповідає за динамічну інформацію WMI (те, що безпосередньо береться від операційної системи, устаткування і тому подібне), а репозитарий CIM - за статичну інформацію (грубо кажучи, налаштування WMI на цьому комп'ютері). Фізично цей репозитарий розташований у файлі CIM.REP в каталозі C :\WINNT\system32\wbem\Repository.

  1.  Утиліти і засоби для роботи з WMI

Основний набір стандартних засобів для роботи з WMI поставляється разом з WMI SDK. До складу SDKвходят:

  •  WMI CIM Studio - основна графічна утиліта, призначена для перегляду просторів імен WMI, класів, їх властивостей і методів. Можна використовувати також для виконання WQL -запросов;
  •  WMI Event Registration і WMI Event Viewer - ці засоби можна використовувати для реєстрації событийWMI і перегляду подій (аналогічно тому, як це реалізовано, наприклад, в PerformanceMonitor), що сталися;
  •  WMI Object Browser - виділена в окремий засіб частина WMI CIM Studio. Використовується для перегляду класів WMI, їх властивостей і методів. Працювати необхідно обережно - якщо звернутися до великого набору екземплярів якого-небудь класу (наприклад, інформації про служби), такий запит виконуватиметься дуже довго, а переривати виконання аварійно важко.
  •  Утиліта mofcomp - вона дозволяє компілювати файли MOF (Managed Object Format) з текстового в двійковий формат, а також додавати їх в репозитарий CIM. Використовується, наприклад, для того, щоб забезпечити можливість звернення засобами WMI до вашого застосування.

Ще один засіб для роботи з WMI - консоль WMI Control. Вона доступна, наприклад, з ComputerManagement і призначена в основному для адміністрування служби WMI (резервне копіювання і відновлення репозитария, налаштування системи безпеки і тому подібне)

Просте, але в деяких ситуаціях дуже зручний засіб - Scriptomatic, яке можна викачати з Web -сайта Microsoft. Цей засіб реалізований у вигляді застосування HTML (HTA) і призначений для автоматичного створення скрипта, що виводить інформацію про значення усіх властивостей усіх екземплярів якого-небудь класу WMI. Може використовуватися як швидкий броузер по класах WMI.

Дуже зручна можливість - встановити ODBC -драйвер для WMI і дістати можливість працювати з WMI як з великою базою даних зі значною кількістю таблиць. Драйвер ODBC лежить на дистрибутиві Windows 2000 Advanced Server в каталозі D :\VALUEADD\MSFT\MGMT\WBEMODBC. Після установки у вас з'явиться системне джерело даних під назвою WBEM Source і довідка по ньому у вигляді файлу Wbemdr32.chm. Головне - не заповнювати ім'я користувача і пароль для підключення, тому що при підключенні виникне помилка. Якщо ви хочете підключитися до локального комп'ютера, екран властивостей підключення з Access повинен виглядати так, як вказано на малюнку 1:

Мал. 1

Потім треба натиснути на кнопку OK і у вікні Namespace Selection вибрати потрібний простір імен (як правило, CIMV2).

Незважаючи на усі перераховані вище можливості, все-таки головний інструмент для роботи з WMI (як записано в документації по WMI) - це скрипти.

  1.  Підключення до WMI

Перше, що необхідно зробити в скрипті - підключитися до служби WMI на локальному або видаленому комп'ютері. Підключення можна виконувати двома різними способами: за допомогою объектаSwbemLocator або (більш стандартний спосіб) за допомогою так званого моникера.

Перший спосіб виглядає так:

1) спочатку отримуємо об'єкт SwbemLocator :

Dim oLocator

Set oLocator = CreateObject("wbemScripting.Swbemlocator")

У об'єкту SwbemLocator - усього лише одна властивість і один метод - властивість security_ використовується для отримання посилання на однойменний вкладений об'єкт, і як можна здогадатися, використовується для налаштування безпеки при підключенні (якщо вона відрізняється від параметрів за умовчанням), а метод ConnectServer використовується для підключення до служби WMI на локальному або видаленому комп'ютері. Якщо ви підключаєтеся до служби WMI на локальному комп'ютері, скористатися правами іншого користувача (відмінного від поточного) вам не вдасться - такі обмеження служби DCOM.

2) далі викликаємо метод ConnectServer, який повертає нам об'єкт SWbemServices, :

Dim oServices

Set oServices = oLocator.ConnectServer("LONDON", "CIMV2")

Якщо ми збираємося підключитися до простору імен за умовчанням (настроюється з консолі ComputerManagement, за умовчанням CIMV2) на локальному комп'ютері, то виклик методу може виглядати так:

Set oServices = oLocator.ConnectServer()

3) отриманий об'єкт SWbemServices можна використовувати для виконання запитів WQL, отримання посилань на об'єкти WMI і тому подібне

Другий спосіб підключення до WMI (практично стандартний) - використання моникера. Моникер - це спеціальна мітка, яка використовується для підключення до COM -объектам. При використанні моникера синтаксис виходить коротшим і гнучкішим (хоча, можливо, менш зрозумілим).

Найпростіший спосіб використання моникера - застосування синтаксису виду

Dim oSvc

Set oSvc = GetObject("WinMgmts:")

В цьому випадку ми отримуємо той же об'єкт SWbemServices з параметрами за умовчанням: тобто підключаємося до простору імен Root\CIMV2 на локальному комп'ютері з правами користувача, від імені якого був запущений скрипт.

На жаль, в PrimalScript підказок за властивостями і методами ми позбавляємося. Якщо вони дуже потрібні, то можна використовувати редактор VBA з синтаксисом виду

Dim oSvc As SWbemServices

Set oSvc = GetObject("WinMgmts:")

Як додаткові параметри при визначенні моникера можна вказати рівень имперсонации (за умовчанням -

GetObject("WinMgmts:{impersonationLevel=impersonate}"),

означає роботу з правами поточного користувача і регіональні налаштування підключення. Наприклад, щоб підключитися з англійськими регіональними налаштуваннями, можна використовувати синтаксис виду GetObject("WinMgmts:[Locale = ms_409]").

Далі моникеру можна передати інформацію про те, до чого ми підключаємося:

1) імені комп'ютера

2) простору імен в нім

3) об'єкту в цьому просторі імен

Наприклад, щоб підключитися до комп'ютера Vancouver, можна використовувати синтаксис

Set oSvc = GetObject("WinMgmts://Vancouver")

Щоб підключитися на нім до простору імен ROOT\CIMV2 (зазвичай робота виконується тільки з ним, це ж простір імен вибирається за умовчанням, тому звичайний простір імен не вказується), синтаксис може виглядати так:

Set oSvc = GetObject(“WinMgmts://Vancouver/root/cimv2”)

А щоб підключитися на нім до об'єкту, що представляє систему логічних дисків, синтаксис може бути таким:

Set oSvc = GetObject(“WinMgmts://Vancouver/root/cimv2:Win32_LogicalDisk”)

В принципі, можна підключитися і безпосередньо до об'єкту логічного диска, наприклад, C :. Синтаксис при цьому може виглядати так:

Set oSWbemObject = _ GetObject(“WinMgmts://Vancouver/root/cimv2:Win32_LogicalDisk.DeviceID=’C:’”)

Але це вже виходить запит WQL, про яких буде розказано нижче. Крім того, повертається не объектSWbemServices, як в попередніх випадках, а об'єкт SWbemObject.

Не дивуйтеся, якщо де-небудь в коді побачите слэши у зворотний бік: синтаксис WMI допускає і те, і інше. Наприклад, код виду

Set oSvc = GetObject(“WinMgmts:\\Vancouver”)

також цілком допустимо.

Який же метод з двох вибирати?

Microsoft рекомендує використовувати тільки моникер, аргументуючи це тим, що :

1) синтаксис простіший;

2 можна повертати не лише об'єкт SWbemServices, але і відразу об'єкт SWbemObject.

Усі приклади у Microsoft побудовані тільки на використанні моникера.

Проте при використанні об'єкту SWbemLocator у нас - свої переваги:

1) тільки при використанні цього методу можна підключатися до комп'ютера з правами іншого користувача. Вимагається це не часто, але іноді все-таки вимагається;

2) можливість роботи з підказками в PrimalScript у нас зберігається.

Ну а об'єкт SWbemObject можна отримати за допомогою усього лише одного додаткового кроку - виклику методу Get об'єкту SWbemServices.

Ще раз відмітимо, що підключатися з правами іншого користувача можна тільки до видаленого комп'ютера. Якщо ви спробуєте підключитися з новими правами до служби WMI на локальному комп'ютері, виникне помилка.

  1.  Робота з об'єктами SWbemServices і SWbemObject

Після того, як ви успішно підключилися до служби WMI на локальному або видаленому комп'ютері (за допомогою SWbemLocator або моникера), вам повертається посилання на об'єкт SWbemServices :

Dim oLocator

Set oLocator = CreateObject("wbemScripting.Swbemlocator")

Dim oSvc

Set oSvc = oLocator.ConnectServer()

MsgBox TypeName(oSvc)

Цей об'єкт - основна "робоча конячка" WMI. Для нього передбачена всього одна властивість (вже знайоме нам Security_) і 18 методів. Нижче приведені тільки найчастіше використовувані, по інших можна отримати інформацію за допомогою WMI SDK.

  •  AssociatorsOf - цей метод дозволяє отримати колекцію об'єктів, що асоціюються з вказаним вами. Замість нього можна скористатися командою WQL ASSOCIATORS OF
  •  ExecMethod - виконати метод об'єкту WMI
  •  ExecNotificationQuery - виконати запит для отримання подій
  •  ExecQuery - виконати запит WQL (зазвичай для отримання колекції об'єктів)
  •  Get - отримати посилання на вказаний вами об'єкт WMI
  •  InstancesOf - отримати колекцію усіх екземплярів вказаного вами класу
  •  SubclassesOf - отримати колекцію підкласів вказаного вами класу.

Для багатьох методів передбачений також варіант Async - асинхронне виконання цього методу.

У практичній роботі найчастіше нам потрібно буде отримати посилання на потрібний об'єкт WMI за допомогою методу Get або скористатися одним з методів Exec.. Про ці методи буде розказано нижче, а доки скажемо, що метод Get повертає посилання на об'єкт SWbemObject, представляючий вказаний вами объектWMI. Синтаксис може бути таким:

Dim oWbemObj

Set oWbemObj = oSvc.Get("Win32_LogicalDisk.DeviceID='C:'")

Відразу скажемо, що SWbemObject - це не сам об'єкт WMI, що пролягає нижче, а усього лише оболонка, в яку одягнений цей об'єкт. Наприклад, у отриманого нами об'єкту SWbemObject немає ні властивості FreeSpace, ні властивості FileSystem, ні властивості VolumeName. Зате за допомогою властивості Properties_ цього об'єкту ми може отримати інформацію про усі властивості об'єкту, що пролягає нижче, а за допомогою властивості Methods_ - про усі методи. Щоб випадково не переплутати властивості SWbemObject і об'єкту, що пролягає нижче, назви усіх властивостей і методів SWbemObject закінчуються на підкреслення.

Система WMI спочатку побудована так, щоб вона була певною мірою самодокументируемой- наприклад, щоб інформацію про усі властивості і методи об'єктах WMI можна було отримати не за допомогою переглядача об'єктів, а просто з коду скрипта. Наприклад, щоб отримати інформацію про усі властивості об'єкту WMI, що представляє диск "C:", можна використовувати код виду

For Each item In oWbemObj.Properties_

WScript.Echo item.Name & vbTab & item.Value

Next

а для отримання інформації про методи - таку ж конструкцію.

For Each item In oWbemObj.Methods_

WScript.Echo item.Name

Next

У першому випадку властивість Properties повертає нам стандартну колекцію SWbemPropertySet із звичайними властивостями і методами типу Add, Remove, Item, Count, яка складається з объектовSWbemProperty. Найважливіші властивості SWbemProperty такі:

  •  Value - значення реальної властивості. Ця властивість використовується за умовчанням;
  •  Name - коментарів не вимагає;
  •  IsArray - чи працює ця властивість з масивом значень або ні;
  •  Qualifiers - дозволяє копнути на рівень глибше і отримати посилання на колекцію SWbemQualifierSet, колекцію допустимих значень для цієї властивості (якщо для нього такий набір передбачений).

Для методів усе влаштовано точно також: властивість Methods_повертає колекцію SWbemMethodSet, що складається з об'єктів SWbemMethod. Найважливіші властивості цього об'єкту - Name, Qualifiers, InParameters, OutParameters.

Творці WMI настійно рекомендують працювати з об'єктами WMI через їх оболонку - SWbemObject. Наприклад, щоб отримати інформацію про значення властивості Freespace для нашого диска C :, можна використовувати синтаксис виду

For Each item In oWbemObj.Properties_

If item.Name = "FreeSpace" Then MsgBox item.value/1024/1024

Next

а щоб поміняти значення властивості, можна скористатися кодом виду :

For Each item In oWbemObj.Properties_

If item.name = "VolumeName" Then item.value = "System"

Next

oWbemObj.put_

Виклик методу put_ тут обов'язковий, інакше значення зміниться тільки в оперативній пам'яті, а не на комп'ютері.

Для виклику методу об'єкту WMI рекомендується скористатися методом ExecMethod_:

   Set process = GetObject("winmgmts:{impersonationLevel=impersonate}!Win32_Process")

   Set method = process.Methods_("Create")

   Set inParam = method.inParameters.SpawnInstance_()

   inParam.CommandLine = "calc.exe"

   Set outParam = process.ExecMethod_("Create", inParam)

Тут ми викликаємо метод Create об'єкту process (типу SWbemObject) і передаємо йому параметрCommandLine. Параметр - той же самий об'єкт SWbemObject, який створюється небагато химерним способом, - через колекцію inParameters.

Незважаючи на рекомендації Microsoft, більшість розробників звертаються до властивостей і методів об'єктів WMI не через колекції Properиties_ і Methods_ об'єкту SWbemObject, а безпосередньо. Для цього використовується той же самий SWbemObject. Синтаксис звернення до властивості при цьому може виглядати так:

MsgBox oWbemObj.VolumeName  

а синтаксис виклику методу :

Dim oLocator

Set oLocator = CreateObject("wbemScripting.Swbemlocator")

Dim oSvc

Set oSvc = oLocator.ConnectServer()

Dim oWbemObj

Set oWbemObj = oSvc.Get("Win 32_Process")

oWbemObj.Create ("calc.exe")

Не дивлячись на те, що властивості і методи методу, що пролягає нижче, не видно з переглядача, вони цілком доступні.

  1.  Як дістатися до конкретного об'єкту: мова запитів WQL

Основна функціональність WMI знаходиться у властивостях і методах об'єктів цієї бібліотеки. Як працювати з властивостями і методами цих об'єктів, ми вже поговорили, тепер - про те, як можна знайти потрібний об'єкт.

Найпростіший варіант - отримати колекцію усіх об'єктів певного класу. Для цієї мети можна використовувати метод InstancesOf об'єкту SWbemServices. Цей метод завжди повертає колекцію, навіть якщо вона складається тільки з одного об'єкту. Для того, щоб дістати доступ до елементів цієї колекції, найпростіше використовувати давно знайому нам конструкцію For .. Each :

Dim oLocator

Set oLocator = CreateObject("wbemScripting.Swbemlocator")

Dim oSvc

Set oSvc = oLocator.ConnectServer()

Dim oCol

Set oCol = oSvc.InstancesOf("win 32_product")

For Each item In oCol

           WScript.Echo item.Name

Next

Відфільтрувати потрібний об'єкт можна, наприклад, так:

Dim oCol

Dim oProductOffice

Set oCol = oSvc.InstancesOf("win 32_product")

For Each item In oCol

           If (InStr(item.name, "Microsoft Office")<> 0) Then

           Set oProductOffice = Item

           End If

Next

MsgBox oProductOffice.Name

Проте, звичайно, з точки зору продуктивності такий підхід важко визнати найправильнішим. Нам доводиться поміщати посилання на усі встановлені продукти в колекцію і перебирати її, щоб знайти потрібний. Набагато зручніше скористатися вбудованим в WMI мовою запитів - WQL (WMI QueryLanguage, інша назва - SQL for WMI). Ця мова позиціонується як ANSI SQL -совместимый, хоча обмежень у нього дуже багато (наприклад, за допомогою його не можна змінювати дані - операторів INSERT, UPDATE, DELETE в нім не передбачено).

У WQL передбачено три типи запитів :

1) запити до даних - вони будуть розглянуті нижче

2) запити до подій - вони будуть розглянуті в наступному розділі

3) запити до структури WMI - вони дозволяють інформацію про структуру класів WMI. У практичній роботі використовуються нечасто і тому розглядатися тут не будуть.

Загальний синтаксис запиту WQL виглядає так:

SELECT властивості FROM ім'я_класу WHERE властивість оператор значення

Якщо використовувати запит WQL в нашому прикладі для отримання інформації про встановлені продукти, то в найпростішому варіанті він може виглядати так:

Dim oCol

Set oCol = oSvc.ExecQuery("select * from Win32_Product")

For Each item In oCol

           WScript.Echo item.Name

Next

Якщо ми, як в звичайному SQL, вкажемо тільки потрібні нам стовпці, повернеться та ж колекція вже знайомих нам об'єктів SWbemObject, але тільки з вказаними нами властивостями плюс властивість, яка визначена як ключове. У прикладі нижче повернеться явно вказана нами властивість Version і ключова властивість Name. Якщо спробуємо звернутися ще і до властивості InstallState, виникне помилка:

Dim oCol

Set oCol = oSvc.ExecQuery("select version from Win32_Product")

For Each item In oCol

           Wscript.Echo item.Version

           WScript.Echo item.Name

           WScript.Echo TypeName(item)

Next

Вираження FROM в WQL -запросе - це, звичайно, ім'я класу, колекцію екземплярів якого ми хочемо отримати. Про доступних в WMI класах буде розказано нижче.

Вираження WHERE визначає фільтр в запиті - таким чином ми залишаємо в колекції тільки ті об'єкти, які нам потрібні, :

Dim oCol

Set oCol = oSvc.ExecQuery("select * from Win32_Product WHERE description = _

'' Microsoft Office - професійний випуск версії 2003'")

For Each item In oCol

           WScript.Echo item.Name

Next

Із застосуванням фільтру WHERE пов'язані деякі особливості, які необхідно враховувати, :

  •  за умовчанням в колекцію-результат запиту потрапляють усі екземпляри вказаного вами класу разом з їх підкласами. Якщо підкласи вам не потрібні, то фільтр WHERE може виглядати так:

SELECT * FROM CIM_MediaAccessDevice WHERE __CLASS = _ 'Win32_CDROMDrive'

Зверніть увагу, що перед словом __CLASS коштує подвійне підкреслення.

  •  у фільтрі WHERE використовуються стандартні оператори SQL : =, <, >, <>, <=, >=. У операторів IS і IS NOT - спеціальне призначення: вони використовуються тільки для порівняння значення властивості з NULL:

SELECT * FROM Win32_Fan WHERE Description IS Null

Є ще спеціальний оператор ISA, який використовується для перевірки значень властивостей вкладених класів. На жаль, оператор LIKE в WQL не використовується.

Запити WQL дуже зручно тестувати з CIM Studio з постачання WMI SDK.

  1.  Робота з подіями

6.1 Архітектура роботи з подіями в WMI

Усередині служби WMI реалізована служба роботи з подіями - WMI Event Service. Ця служба підтримує фільтрацію подій і забезпечення реакції на них.

Скрипт, застосування або просто адміністратор (за допомогою утиліти CIM Event Registration) можуть зареєструвати підписку на події, виступивши в ролі будівника підписки - Subscriber Builder. Події представляються у вигляді системного класу _Event, на появу яких реагує підписка.

Підписка (subscription) - визначення події, що представляє інтерес для будівника події. Фактично підписка - це вимога для служби WMI виконати певні дії, якщо станеться подія, що підпадає під умову підписки. Підписка створюється за допомогою специальногоWQL -запроса (SELECT). Настійно рекомендується визначити в цьому запиті максимально строгі умови - щоб уникнути обробки непотрібних вам подій.

Ще один компонент архітектури роботи з подіями - одержувач події, Event Consumer. Цей той блок коду в скрипті (чи застосуванні), який отримує повідомлення про настання події і реагує на нього. Одержувачі можуть бути тимчасовими і постійними.

Тимчасові одержувачі - це одержувачі, яким передаватимуться сповіщення про події тільки тоді, коли цей скрипт/застосування запущений. Тимчасові одержувачі зазвичай реєструють свої події за допомогою виклику методу ExecNotificationQuery.

Інформація про постійних одержувачів зберігається в репозитарии CIM. При настанні події службаWMI перевіряє, чи запущено необхідне застосування/скрипт, яке має бути одержувачем. Якщо воно запущене, то воно оповіщається, а якщо немає - те спочатку служба WMI проводить запуск цього застосування. ВWMI SDK поставляється такий постійний одержувач - WMI Event Viewer Tool. Наприклад, щоб зареєструвати постійного одержувача подій WMI (наприклад, для появи нових повідомлень в журналі застосувань), треба виконати наступні дії:

  •  записати інформацію про застосування Event Viewer в репозитарий CIM. Для цього необхідно виконати в командному рядку команду

mofcomp c:\winnt\system32\wbem\eviewer.mof

((файл eviewer.mof встановлюється разом з WMI SDK)

  •  зареєструвати нового Event Consumer для служби WMI. Для цього необхідно відкрити WMI EventRegistration, підключитися до пропонованого за умовчанням простору імен root\cimv2 і в спадаючому списку ліворуч вибрати Consumers. Далі розкрити контейнер _EventConsumer -> EventViewerConsumer, клацнути правою кнопкою миші по EventViewerConsumer і в контекстному меню вибрати New Instance. Для створюваного екземпляра досить заповнити тільки поле Name. Після натиснення OK створений одержувач з'явиться в дереві Event Registration.
  •  потім створити фільтр для події, що цікавить нас. Для цього в спадаючому списку треба вибрати Filters, клацнути правою кнопкою миші по рядку _EventFilter і так само в контекстному меню вибрати NewInstance. Для створюваного об'єкту фільтру треба заповнити наступні поля:
  •  Name (наприклад, TestFilter)
  •  Query (наприклад, для перехоплення подій журналу застосувань - Select * from __InstanceCreationEvent Where TargetInstance ISA 'Win32_NTLogEvent') QueryLanguage - WQL
  •  останнє, що залишилося зробити - зареєструвати для цього фільтру приймач події. Для цього в правій частині екрану клацніть правою кнопкою миші по створеному вами об'єкту одержувача і в контекстному меню виберіть Register. У стовпці Reg повинен з'явитися зелений прапорець: одержувач і фільтр налагоджені для прийоми подій.

Для перевірки створеної вами конфігурації досить виконати короткий скрипт, який згенерує повідомлень в журнал подій застосувань, наприклад:

Dim oShell

Set oShell = CreateObject("Wscript.Shell")

oShell.LogEvent 0, "TestMessage"

Якщо усе зроблено правильно, то з'явиться вікно WMI Event Viewer з інформацією про подію, що сталася.

6.2 Типи подій

Будь-яка подія в WMI представляється у вигляді екземпляра класу _Event, проте усі події розділяються на три основні категорії:

  •  intrisinc events - події, які вбудовані в модель CIM і до них можна звертатися відразу ж (ніяких драйверів встановлювати не потрібно). Систему таких подій змінювати не можна - вони заздалегідь зумовлені і вбудовані в WMI;
  •  extrinsic events - зовнішні події, для відстежування яких потрібні спеціальні драйвери - extrinsicevent providers. Для роботи з ними необхідно, окрім установки таких драйверів, ще і помістити класи таких подій в репозитарий WMI. Разом з WMI поставляються два зовнішні провайдери - для реакції на події SNMP і для відстежування подій реєстру
  •  timer events - події таймера, найпростіші події для перехоплення. Можна використовувати як події абсолютного часу (спрацює у вказаний вами час), так і відносні (через півгодини після запуску скрипта).

6.3 Запит, реєструючий подію

Для того, щоб зареєструвати подію і мати можливість на нього реагувати, необхідно за допомогою методу ExecNotificationQuery() об'єкту SWbemServices виконати запит WQL по спеціальній формі, наприклад:

Dim oE

Set oE = oSvc.ExecNotificationQuery_

("SELECT * FROM __InstanceModificationEvent  " & _

"WITHIN 10 WHERE TargetInstance ISA 'Win32_Account'")

oE в даному випадку - об'єкт SWbemEventSource, про можливості якого ми поговоримо нижче.

__InstanceModificationEvent (з двома підкресленнями) - одна з дев'яти подій, на які можна настроїти реакцію, :

  •  __ClassCreationEvent, __ClassDeletionEvent, __ClassModificationEvent - відповідно, створення, видалення і зміна класу;
  •  __InstanceCreationEvent, __InstanceDeletionEvent, __InstanceModificationEvent – створення, видалення і зміна об'єкту;
  •  __NamespaceCreationEvent, __NamespaceDeletionEvent, __NamespaceModificationEvent – те  ж саме для простору імен (використовується рідко).

В даному випадку ми відстежуємо зміни, які вносяться до вже існуючих об'єктів облікових записів Windows 2000, тому використовується подія __InstanceModificationEvent.

Оператор WITHIN 10 говорить про те, що опитування проводитиметься кожні 10 секунд (щоб не витрачати зайві системні ресурси). До цього оператора можна додавати вираження GROUP BY : згруповані за якоюсь ознакою події за період розглядаються як одна подія і HAVING - поріг на кількість подій. Якщо кількість подій нижча за цей поріг, то подія вважається таким, що не наступило. Повний синтаксис запиту з використанням усіх цих операторів може виглядати, наприклад, так:

SELECT * FROM __InstanceModificationEvent _

WITHIN 10 WHERE TargetInstance ISA 'Win32_PrintJob' _

GROUP WITHIN 30 BY TargetInstance.Owner _

HAVING NumberOfEvents > 5

Остання частина запиту - WHERE TargetInstance ISA 'Win32_Account' дозволяє відфільтрувати джерело подій. Настійно рекомендується визначати його як можна точніше. В даному випадку операторISA використовується, щоб вказати, що нас цікавлять усі вкладені класи класу Win32_Account (це будуть класи Win32_SystemAccount, Win32_Group і Win32_UserAccount).

Якщо треба включити в запит додаткові умови, вони включаються через AND:

SELECT * FROM __InstanceModificationEvent _

WHERE TargetInstance ISA 'Win32_PrintJob' _

AND TargetInstance.Owner = 'IvanIvanov'

TargetInstance - єдина властивість об'єкту SWbemEventSource. Воно дозволяє отримати посилання на об'єкт, який послужив джерелом події і, отже, звернутися до будь-якої з його властивостей.

Ми виконали запит і отримали об'єкт SWbemSource. Але що з ним робити далі? Зазвичай - викликати його єдиний метод NextEvent. Цей метод чекає появи події і при її появі повертає стандартний об'єкт SWbemObject, який представляє спійману подію. А щоб дістатися до об'єкту, який і викликав цю подію, як завжди для SWbemObject, використовується одна з його невидимих властивостей - TargetInstance. Щоб опитування відбувалося постійно, є сенс помістити цей код в нескінченний цикл :

Dim oLocator, oSvc, oEventSource, i, oWbemObject

Set oLocator = CreateObject("wbemScripting.Swbemlocator")

Set oSvc = oLocator.ConnectServer()

Set oEventSource = oSvc.ExecNotificationQuery _

("SELECT * FROM __InstanceModificationEvent" & _

" WITHIN 1 WHERE TargetInstance ISA 'Win32_Account'")

i = 0

Do While i = 0

Set oWbemObject = oEventSource.NextEvent

Wscript.Echo oWbemObject.TargetInstance.Name

Loop

В цьому випадку при будь-якому внесенні змін до облікових записів на комп'ютері, до якого ми підключилися (якщо цей комп'ютер - контроллер домена, то при будь-якому внесенні змін до домена) у нас в стандартну консоль виводу виводитиметься ім'я цього облікового запису.

  1.  Класи WMI

Ми розібралися в прийомах роботи з WMI, проте залишилася ще одна важлива тема - а що фізично можна зробити за допомогою WMI, які в WMI передбачені класи, а для класів - які властивості і методи.

Класів в WMI передбачені сотні. Ми розглянемо тільки найважливіші. Усі класи поділені на три великі групи:

  •  класи, що відносяться до устаткування;
  •  класи, що відносяться до операційної системи;
  •  класи, що відносяться до встановлених застосувань.

Ми акцентуватимемо увагу на тих можливостях, які дозволяють нам не лише отримувати пасивну інформацію, але і управляти комп'ютером.

7.1 Класи WMI для роботи з устаткуванням

Класи WMI для роботи з устаткуванням можна розділити на дев'ять великих категорій:

  •  класи для роботи з пристроями охолодження (Win32_Fan, Win32_TemperatureProbe і тому подібне)
  •  для роботи з пристроями введення (Win32_Keyboard, Win32_PointingDevice)
  •  з дисками (Win32_CDROMDrive, Win32_DiskDrive, Win32_FloppyDisk)
  •  з материнською платою/контроллерами/портами (Win32_MotherboardDevice, Win32_BIOS, Win32_PhysicalMemory, Win32_Processor і тому подібне)
  •  з мережею (головний - Win32_NetworkAdapter)
  •  з живленням (Win32_Battery, Win32_PowerManagementEvent)
  •  з друком (Win32_Printer, Win32_PrintJob)
  •  з модемами (Win32_POTSModem)
  •  з відеопідсистемою (Win32_DesktopMonitor, Win32_DisplayConfiguration, Win32_VideoController, Win32_VideoSettings).

Практично усі ці класи призначені для можливості тільки отримання інформації на читання, без можливості внесення змін. Виняток становлять тільки:

  •  клас Win32_Fan - можливість програмним чином встановлювати швидкість обертання вентилятора (якщо така можливість підтримується материнською платою);
  •  клас Win32_LogicalDisk - за допомогою його можна міняти ім'я тому (властивість Volume Name)
  •  клас Win32_NetworkAdapterConfiguration. У цього класу - десятки методів, які дозволяють міняти мережеві налаштування для адаптера програмним чином.

Наприклад, щоб настроїти комп'ютер на використання DHCP, можна використовувати код виду :

Set colNetAdapters = objWMIService.ExecQuery _

    ("Select * from Win32_NetworkAdapterConfiguration where IPEnabled=TRUE")

For Each objNetAdapter In colNetAdapters

    errEnable = objNetAdapter.EnableDHCP()

     If errEnable = 0 Then

        Wscript.Echo "DHCP has been enabled."

    Else

        Wscript.Echo "DHCP could not be enabled."

    End If

Next

Щоб навпаки, настроїти потрібну нам статичну IP-адресу, можна використати код

Set colNetAdapters = objWMIService.ExecQuery _

    ("Select * from Win32_NetworkAdapterConfiguration where IPEnabled=TRUE")

strIPAddress = Array("192.168.1.141")

strSubnetMask = Array("255.255.255.0")

strGateway = Array("192.168.1.100")

strGatewayMetric = Array(1)

For Each objNetAdapter in colNetAdapters

    errEnable = objNetAdapter.EnableStatic(strIPAddress, strSubnetMask)

    errGateways = objNetAdapter.SetGateways(strGateway, strGatewaymetric)

    If errEnable = 0 Then

        WScript.Echo "The IP address has been changed."

    Else

        WScript.Echo "The IP address could not be changed."

    End If

Next

За допомогою інших методів цього класу ви можете настроювати домен DNS, параметри роботи з серверами DNS і WINS, IPSec і фільтрацію пакетів TCP/IP, додавати додаткові мережеві протоколи, служби і клієнти - загалом, усе, що доступно на графічному екрані або через реєстр.

7.2 Класи для роботи з операційною системою

Оскільки одна з цілей WMI - забезпечити повний контроль над операційною системою, набір класів в цьому розділі дуже великий (декілька сотень). Велика частина цих класів (як і класів для роботи з устаткуванням) призначена для отримання інформації і їх властивості доступні тільки на читання. Ми розглянемо тільки ті класи, у яких існують методи, за допомогою яких можна програмно управляти комп'ютером.

Робота із службами

Класи Win32_BaseService, Win32_Service і Win32_SystemDriver представляють служби Windows : Win32_Services - звичайні, Win32_SystemDriver - драйвери (насправді великої різниці між службами і драйверами для Windows немає і інформація про них зберігається в одній гілці реєстру), Win32_BaseServices - і те, і інше разом. У ці класів є важливі методи:

  •  Change - можливість змінити будь-які параметри служби : режим запуску, ім'я, що відображується, ім'я користувача/пароль, від імені якого запускатиметься ця служба, навіть замінити виконуваний файл служби (вказати новий шлях до нього). Оскільки найчастіше міняється режим запуску (наприклад, InternetConnection Sharing на усіх комп'ютерах можна перевести в режим Disabled), то для нього передбачений окремий метод ChangeStartMode.
  •  Create - можливість із скрипта створити нову службу на комп'ютері, Delete - відповідно, її видалити (те ж саме можна зробити за допомогою утиліт Resource Kit);
  •  PauseService, ResumeService, StopService, StartService - змінити стан служби. Перевірити, чи можна службу зупинити або припинити, можна за допомогою властивостей AcceptStop і AcceptPause.

Найбільш ситуації, що часто зустрічаються, для роботи із службами:

  •  потрібний централізований змінити пароль для усіх служб, що працюють від імені певного облікового запису
  •  перевести яку-небудь службу (частіше усього ICS і Server) в режим Disabled
  •  відстежити стан служби і у разі потреби її запустити
  •  запустити скриптом ті служби, для яких стоїть автозапуск, але нині з якихось причин вони не працюють.

Для усіх цих ситуацій використовуються класи Win32_BaseService. У багатьох ситуаціях їх застосування дозволить адміністраторові заощадити безліч часу.

Робота з файлами і каталогами

Можливості роботи з файлами і каталогами в WMI є взаємодоповнюючими по відношенню до об'єктної моделі WSH/FSO. З одного боку, за допомогою WMI не можна, наприклад, записати інформацію в текстовий файл, з іншої - в WMI реалізовані додаткові можливості, яких немає в WSH, наприклад, можливість змінити дозволи на файл/каталог, поміняти власника, настроїти аудит, дізнатися, скільки процесів  теперішній час відкрили цей файл і тому подібне. Головний клас для роботи з файловою системою в WMI - Win32_Directory, який може бути використаний для роботи як з каталогом, так і з окремим файлом. Його головні методи:

  •  Copy і CopyEx (розширена версія, відрізняється можливістю включити/відключити рекурсію і точніше визначити місце виникнення помилки) - копіювання каталогу/файлу;
  •  Delete/DeleteEx, TakeOwnerShip/TakeOwnershipEx, Compress/CompressEx, Uncompress/UncompressEx, Rename - коментарів не вимагають;
  •  ChangeSecurityPermissions і ChangeSecurityPermissions - можливість поміняти дозволи для файлу.

Робота з журналом подій Windows

Дуже часто в практичній роботі необхідно виконувати які-небудь дії, що повторюються, з журналом подій Windows : архівувати його, завантажувати в базу даних, централізований здійснювати пошук на різних серверах на предмет виявлення специфічних подій, міняти властивості журналів, просто записувати свої події в журнал, проводити безперервний моніторинг журналів і тому подібне. Для цієї мети в WMI призначені класи Win32_NTLogEventFile (представляє журнал подій Windows) иWin32_NTLogEvent (представляє окрема подія в цьому журналі). З класом NTLogEvent усе просто - кожна його властивість відповідає окремому атрибуту події в журналі. Наприклад, отримати усі повідомлення можна так:

Dim oColEvents

Set oColEvents = oSvc.ExecQuery("Select * from Win32_NTLogEvent")

For Each Item In oColEvents

            WScript.Echo Item.Message

Next

Якщо вам потрібні повідомлення тільки з конкретного журналу, або тільки помилки, або тільки від якогось джерела - фільтруємо їх засобами WQL. У Script repository можна знайти готові приклади по перекачуванню повідомлень з журналів в бази даних.

Якщо ж вам треба виконати якісь операції з самим журналом подій, у вашому розпорядженні - об'єкт Win32_EventLogFile з такими методами, як BackupEventLog, CopyEventLog, ClearEventLog і тому подібне

Об'єкт операційної системи - Win32_OperatingSystem

Для цього об'єкту передбачена безліч цікавих властивостей, таких, як CSDVersion – останній встановлений сервіс-пак, Locale – мовна версія операційної системи, LastBootTime – останнім часом завантаження, тип і версія операційної системи і тому подібне. Крім того, для нього передбачено три методи із зрозумілими назвами: Reboot, Shutdown, Win32Shutdown (з'являються додаткові можливості виключення).

До цього класу примикає по своїх можливостях клас Win32_OperationSystemQFE, за допомогою якого можна отримати колекцію об'єктів, що представляють усі встановлені патчи операційної системи з великою кількістю атрибутів.

Робота з Win32_Process : запуск, завершення роботи, моніторинг процесів на комп'ютері

Один з найчастіше використовуваних класів WMI - клас Win32_Process. За допомогою цього класу можна дістати ті можливості, яких часто не вистачає в реальній роботі, : можливість централізований запустити програми на багатьох комп'ютерах з вказаними вами параметрами, відстежити запуск/завершення програм, з'ясувати, які програми "поїдають" ресурси процесора/пам'яті/мережі і тому подібне. Особливо зручне те, що для виконання таких операцій немає необхідності ставити на комп'ютер якого-небудь клієнта видаленого доступу - служби WMI, що досить працює за умовчанням.

Щоб запустити на видаленому комп'ютері процес, треба підключитися до служби WMI на цьому комп'ютері і скористатися методом Create для Win32_Process :

Dim oLocator

Set oLocator = CreateObject("wbemScripting.Swbemlocator")

Dim oSvc

Set oSvc = oLocator.ConnectServer("Vancouver")

Dim oProc

Set oProc = oSvc.Get("Win32_Process")

oProc.Create "calc.exe"

Калькулятор буде вже запущений, але він буде запущений з параметрами за умовчанням - в невидимому вікні (буде видний тільки через Task Manager). Щоб змінити параметри запуску застосування (пріоритет, змінні оточення і тому подібне), можна скористатися об'єктом Win32_ProcessStartup. Проте запустити процес в інтерактивному режимі не вийде - ця можливість була прибрана починаючи з Windows 2000 SP3. Аргумент - скрипти WMI зазвичай запускаються з адміністративними правами і не можна давати користувачеві можливість використовувати вікно застосування з такими правами.

Для того, щоб примусово завершити процес, використовується метод Terminate :

Set colProcessList = osvc.ExecQuery _

    ("Select * from Win32_Process Where Name = 'Notepad.exe'")

For Each objProcess in colProcessList

    objProcess.Terminate()

Next

А відстежити створення нового процесу можна так:

Set colMonitoredProcesses = oSvc. _       

    ExecNotificationQuery("select * from __instancecreationevent " _

        & " within 1 where TargetInstance isa 'Win32_Process'")

i = 0

Do While i = 0

    Set objLatestProcess = colMonitoredProcesses.NextEvent

    Wscript.Echo objLatestProcess.TargetInstance.Name

Loop

Відстежити завершення роботи процесу можна так само, тільки замість події __instancecreationevent використовується подія __instancedeletionevent.

Якщо спільно використовувати моніторинг створення процесів і метод Terminate, можна взагалі заборонити користувачеві запускати певну програму на комп'ютері:

Set colMonitoredProcesses = oSvc. _       

    ExecNotificationQuery("select * from __instancecreationevent " _

        & " within 1 where TargetInstance isa 'Win32_Process'")

i = 0

Do While i = 0

    Set objLatestProcess = colMonitoredProcesses.NextEvent

    If objLatestProcess.TargetInstance.Name = "notepad.exe" Then

    objLatestProcess.TargetInstance.Terminate

    End If

Loop

Довше за секунду блокнот на комп'ютері користувача відкритий не буде.

Інші класи для роботи з операційною системою

Нижче перераховані деякі інші класи для роботи з операційною системою:

  •  Win32_Share - дозволяє створювати, видаляти і настроювати параметри загальних каталогів на комп'ютері. Налаштування дозволів проводиться за допомогою класу Win32_LogicalShareSecuritySetting;
  •  Win32_StartupCommand - можливість подивитися, які команди виконуються при запуску Windows з інформацією про те, з якої гілки реєстру проводиться їх запуск;
  •  Win32_Account, Win32_UserAccount, Win32_Group - можливість дістати доступ до облікових записів - локальним, якщо звернення йде до звичайного комп'ютера, або доменним, якщо звернення йде до контроллера домена. На відміну від ADSI, за допомогою цих об'єктів ви не зможете вносити зміни облікові записи - вони призначені тільки для читання інформації і моніторингу;
  •  Win32_BootConfiguration - можливість отримати інформацію про параметри завантаження Windows (усе доступно тільки на читання).

 

7.3 Класи для роботи зі встановленими продуктами

Остання велика категорія класів WMI - класи, призначені для роботи зі встановленими продуктами. Більшість таких класів призначені для використання в настановних скриптах розробниками програмних продуктів. Проте можливості класу Win32_Product можуть зробити дуже корисними і для звичайних адміністраторів. За допомогою цього класу можна отримати колекцію, що представляють усі встановлені продукти в Windows. Для виконання з ними різних операцій передбачений набір методів цього класу :

  •  Install – можливість встановити застосування (потрібно буде вказати повний шлях до пакету MSI). Admin - провести адміністративну установку.
  •  Advertise – вивести пакет в списку доступних для установки застосувань в консолі Add/Remove Programs;
  •  Reinstall, Upgrade, Configure, Uninstall – те, що роблять ці методи, зрозуміло з назви.

Наприклад для установки програми на видалений комп'ютер необхідно виконати скрипт наступного виду :

Set oSoftware = oSvc.Get("Win 32_Product")

errReturn = oSoftware.Install("\\FS1\Distrib\myApp.msi",,True)

Wscript.Echo errReturn

Відмітимо деякі моменти, пов'язані із застосуванням об'єкту Win32_Product, :

  •  у Windows 2003 Server цей об'єкт за умовчанням не встановлений. Доустановити його можна, вибравши в Add/Remove Programs -> Add/Remove Windows Components -> Management and Monitoring Tools компонент WMI Installer Provider;
  •  працювати цей компонент уміє тільки через Windows Installer. Відповідно, він зможе побачити тільки програми, встановлені за допомогою Windows Installer (зазвичай за допомогою пакетів MSI);
  •  при автоматизованій установці програмного забезпечення WMI Installer Provider за умовчанням звертатиметься до мережевого каталогу з дистрибутивом від імені локального системного облікового запису (яка аутентифицировать на інших комп'ютерах не може). Тому чи треба відкривати до мережевого каталогу з дистрибутивом гостьовий доступ (від імені облікового запису Guest), або копіювати заздалегідь файли дистрибутива на локальний диск, або використовувати спеціальний синтаксис для вказівки імені користувачі і пароля.

Практичне завдання:

  1.  Набрати та відлагодити всі наведені в теоретичних відомостях лістинги.
  2.  Робота з журналом подій Windows

1) скопіюйте до себе з каталогу Templates на компакт-диску базу даних EventLog.mdb в кореневий каталог диска C : і зніміть з неї прапорець "Тільки для читання"

2) проглянете єдину таблицю в цій базі - Events

3) напишіть скрипт EventLogProcessing.vbs, який би :

  •  переносив би записи з журналу подій System на вашому локальному  комп'ютері в цю базу даних (треба тільки поля ComputerName, EventType, EventCode, Message і TimeWritten);
  •  після закінчення перенесення очищав би журнал подій System.

Відповідь до вправи 1. Робота з журналом подій Windows

Код скрипта EventLogProcessing.vbs може бути таким:

Option Explicit

Dim cn, rs, oLocator, oSvc, oColEvents, oColEventLog, Item, oLogFile

Set cn = CreateObject("ADODB.Connection")

cn.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\EventLog.mdb"

cn.Open

Set rs = CreateObject("ADODB.Recordset")

rs.CursorType = 3

rs.LockType = 3

rs.Open "Events", cn

Set oLocator = CreateObject("wbemScripting.Swbemlocator")

Set oSvc = oLocator.ConnectServer()

Set oColEvents = oSvc.ExecQuery _

("Select * from Win32_NTLogEvent WHERE Logfile = 'System'")

For Each Item In oColEvents

            rs.AddNew

            rs("ComputerName") = Item.ComputerName

            rs("EventType") = Item.Type

            rs("EventCode") = Item.EventCode

            rs("Message") = Item.Message

            rs("TimeWritten") = Item.TimeWritten

            rs.Update

Next

Set oColEventLog = oSvc.ExecQuery _

("Select * from Win32_NTEventLogFile WHERE LogFileName = 'System'")

For Each oLogFile In oColEventLog

            oLogFile.ClearEventLog

Next

WScript.Echo "Done"

  1.  Напишіть скрипт ServiceMonitoring.vbs, який би раз в десять секнуд відстежував би зміни в стані служб Windows на вашому комп'ютері і у разі зміни статусу служб (наприклад, яка-небудь служба була зупинена), виводив би в стандартну консоль виводу інформацію про ім'я цієї служби і її поточний стан.

Відповідь до вправи 2. Робота з подіями операційної системи

Код скрипта ServiceMonitoring.vbs може виглядати так:

Dim oLocator, oSvc, oColServices, oService

Set oLocator = CreateObject("wbemScripting.Swbemlocator")

Set oSvc = oLocator.ConnectServer()

Set oColServices = oSvc.ExecNotificationQuery _

("Select * from __instancemodificationevent " _

        & "within 10 where TargetInstance isa 'Win32_Service'")

Do

Set oService = oColServices.NextEvent

            WScript.Echo oService.TargetInstance.Name & vbTab & vbTab & _ oService.TargetInstance.State

Loop




1. Первомайская средняя общеобразовательная школа Работа на Х Всероссийский фестиваль художеств
2. На берегах реки Пьяны
3. Достижение Узбекистаном государственной независимости
4. рого равномерно по сечению вводят инертный ожижающий агент газ или жидкость
5. Нижегородский государственный университет им.1
6. Тема- твое хобби
7.  Общая характеристика государственной измены и шпионажа
8. На тему- Социологические исследования Рецензент- Студе
9. К центральным органам кроветворения у человека относятся красный костный мозг и тимус
10. История менеджмента Понятие менеджмент и особенности профессии менеджера
11. m- I~m gonn try to go for long run tomorrow to rise money for Rndom cts in new event we~re gonn lunch this yer nd hope to do I think nnully which is E4K Endure 4 Kindness
12.  Коррупционно опасное поведение руководителя является злостным видом аморального поведения дискредитирую
13. реферат диссертации на соискание ученой степени кандидата экономических наук Ростов.
14. 1. Инвестиции ~ это долгосроч вложен капитала с целью получен прибыли Инвестиця деятть ~ это деятть физ ю.html
15. биография супруга семья дом друзья кредитные карты И на эту ненадёжную и изменчивую опору мы полагаемс
16. Анализ и структура оборотных активов
17. Реферат- Животный мир гор
18. Задачи по земельному праву
19. Коммерческая, политическая и социальная реклама- сотрудничество или конкуренция
20. ОТЧЕТ ПО ПРОИЗВОДСТВЕННОЙ ПРАКТИКЕ Выполнил- студент группы ФГК09 Фёдоров А