Підключаємо мережеві ресурси в автоматичному режимі

Підключаємо мережеві ресурси в автоматичному режимі

Вибір мови програмування

Зауваження: сценарії, створені вами раніше на VBScript, Jscript можуть бути легко переписані під KIXtart. Всі приклади в цій статті будуть наведені на мові KIXTart.

Джерело інформації - файл або база даних?

Щоб успішно підключити мережевий ресурс, користувачеві необхідно знати ім'я мережевого диска, з яким буде асоціюватися ресурс, і UNC-шлях мережевого підключається ресурсу. Бажано мати його опис, щоб скорегувати назву диска в папці «Мій комп'ютер». Постає закономірне питання - де ж найкраще зберігати цю інформацію? Можна в текстовому файлі, що лежить в каталозі Netlogon, або в якому-небудь сховище, наприклад, в Active Directory (далі AD). Мною використовувалися обидва варіанти, і в підсумку вибір припав на AD. Було досить багато причин перемістити дані з текстового файлу в AD, наприклад, зручність в обслуговуванні, зменшення програмного коду і т. Д.

Принцип роботи сценарію

Для зберігання інформації в AD про підключається ресурсі був використаний стандартний об'єкт SharedFolder, який включав в себе інформацію про букву, на яку підключається мережевий ресурс; UNC-шлях до мережного ресурсу; опис мережевого ресурсу, яке фігурує в папці «Мій Комп'ютер»; ім'я групи безпеки, членам якої буде підключений ресурс.

Опишемо механізм підключення одного з мережевих ресурсів, на прикладі загальної папки підрозділу «Otdel1». Нехай папка має наступний мережевий шлях - «EsmiraldaWork $ Otdel1», підключається до диску «К» і має опис «Службові файли» (див. Рис. 1). В AD в будь-який OU, наприклад «Shares», створіть об'єкт «Share Folder» (див. Рис. 2). У будь-який інший OU створіть групи безпеки, імена яких збігаються з URL мережевого ресурсу після останньої «точки». У наведеному прикладі група, відповідна підключається диску, повинна називатися «Otdel1». Членам цієї групи буде підключений мережевий ресурс за умови, що вона буде додана у вкладку безпеки папки «Otdel1» з відповідними правами на доступ до цієї папки. Якщо необхідно зробити кілька різних рівнів доступу, в назві групи можна використовувати префікс.

Малюнок 1. Приклад зміни опису мережевого диска в папці «Мій Комп'ютер»

Малюнок 2. Властивості об'єкта Shared Folder в Active Directory

Зауваження: в тому випадку, якщо ресурс повинен бути доступний всім користувачам мережі, то необхідно в відповідну ресурсу групу додати групу «domain users» з відповідними правами.

Сценарій підключення мережевих дисків

Сценарій можна умовно розбити на кілька логічних частин:

  • визначення переліку груп, в які входить поточний користувач;
  • підключення до АD і читання значень відповідних полів;
  • відключення всіх оброблюваних скриптом мережевих дисків;
  • підключення необхідних мережевих дисків;
  • коригування опису мережевих дисків в папці «Мій комп'ютер».

Визначення членства у відповідних групах безпеки

Визначення членства у відповідних групах безпеки здійснюється за допомогою вбудованої функції EnumGroup ():

Until Len ($ Group) = 0

Список груп, що повертається цією функцією (змінна $ Group), має наступний шаблон: DOMAINGROUP. Оскільки в AD групи зберігаються без префікса (в даному випадку префіксів є коротке ім'я домену), то отриманий список груп необхідно перетворити. Результат рекомендується записати в ту ж змінну, тобто GROUP:

Підключення до АD і читання значень відповідних полів

Підключення до АD реалізовано за допомогою ADODB-з'єднання:

$ StrADSQuery = "SELECT keywords, name, description, cn, uncname FROM '" + $ domain_ + "' WHERE objectClass = 'volume'"

$ ObjConnection.Open ( "Active Directory Provider")

Пошук необхідних об'єктів здійснюється за допомогою SQL-запиту. В якості фільтра вказується ObjectClass = 'volume':

"SELECT uname, keywords, description, cn FROM '" + $ domain + "' WHERE objectClass = 'volume'"

де $ domain - ім'я поточного домену, який визначається читанням глобального каталогу RootDSE. Для його читання досить прав звичайного користувача. Змінна $ domain має вигляд «DC = domain, DC = com»:

$ Domain = "LDAP: //" + $ rootDSE_.Get ( "defaultNamingContext")

Читання поля, відповідного типу даних «рядок», здійснюється наступним чином:

Якщо тип даних масив:

For Each $ Val_Element in $ Val_Array

В скрипті використовуються поля, опису і тип даних, які наведені в таблиці 1 (див. Рис. 2).

Таблиця 1. Опис використовуваних полів об'єкта Shared Folder

for each $ ds in $ dss

use $ ds_s + ":" / delete / persistent

де змінна $ ds_s містить значення поля, description - буква на яку монтується диск. Завдяки такому механізму, скрипт управляє тільки тими мережевими дисками, які використовуються системним адміністратором в AD.

Підключення необхідних мережевих дисків

Підключення дисків здійснюється за алгоритмом:

Спочатку визначається необхідна для підключення мережевого диска інформація, а саме буква, на яку монтується диск (поле description); UNC-шлях ресурсу (поле UNCName); група, членам якої буде підключений ресурс (поле cn).

У читача швидше за все виникне закономірне питання: навіщо використовувати поле cn, коли ім'я групи фігурує в UNC-шлях ресурсу? Читання поля CN життєво необхідно. Справа в тому, що мережевий ресурс може бути двох видів: загальний і індивідуальний. Наведемо два приклади. У першому випадку здійснюється підключення загальної папки обміну даними, назвемо її «Exchange». Виходячи з цього папка, до якої надано доступ, називається «Exchange», відповідна їй група безпеки - «Exchange» і оскільки в цю групу входять всі користувачі, то членом цієї групи є група «Domain Users». У другому випадку, нам необхідно підключити кожному користувачеві домашній каталог. Для цього необхідно створити папку, наприклад, «HomeDirs» і створити в ній підкаталоги, відповідні логінів користувачів. Ситуація змінилася - мережевий шлях до папки використовувати не можна, однак є поле CN - ім'я ресурсу, де можна записати всю необхідну інформацію: ім'я користувача і відповідну групу безпеки (див. Рис. 2).

Отже, після визначення трьох необхідних полів дізнатися, чи входить користувач в відповідну ресурсу групу безпеки і при позитивному результаті перевірки приступити до підключення ресурсу по одному з двох алгоритмів. Вибір алгоритму залежить від наявності логіна в ліченому значенні CN.

Підключення диска здійснюється за допомогою команди use:

; елементами масиву $ usergroup_name [] є групи, членами яких є поточний користувач

for $ t = 0 to ubound ($ usergroup_name)

; критерієм персоналізації є членство

; в перерахованих групах PersonalGroup1 ... 3

if instr (ucase ($ group_b), ucase ( "PersonalGroup1"))<>0 or instr (ucase ($ group_b), ucase ( "PersonalGroup2"))<>0 or instr (ucase ($ group_b), ucase ( "PersonalGroup3"))<>0

use $ ds_s + ":" $ uncname

if @ error = 5; помилка доступу до ресурсу

$ Error_message = $ error_message + "Неможливо підключити диск" + $ ds_s + "до ресурсу" + $ cn + chr (13)

use $ ds_s + ":" $ uncname

if @ error = 5; помилка доступу до ресурсу

$ Error_message = $ error_message + "Неможливо підключити диск" + $ ds_s + "до ресурсу" + $ cn + chr (13)

Коригування описів дисків в папці «Мій комп'ютер»

Механізм перейменування мережевих дисків в папці «Мій комп'ютер» найкраще запускати після завершення процесу підключення самих мережевих дисків. У читача може виникнути закономірне питання: «Навіщо це взагалі треба?». Існує кілька причин. Наведемо деякі з них: уявіть, що у вас довгий мережевий шлях - букви диска не видно. Погодьтеся, що це незручно. По-друге, в деяких ситуаціях користувач не повинен знати, де знаходиться ресурс. По-третє, нехай користувач читав не UNC-шляху до дисків, а нормальні їх назви: «Файли мого підрозділу» або «Мої проекти». Йому відразу стає ясно, для чого призначений диск. Повірте, не всі користувачі відповідають терміну «досвідчений користувач». Це пов'язано з тим, що на підключення диска потрібен час, яке залежить від місця розташування робочої станції, завантаженості сервера і інших чинників. Точно його розрахувати не представляється можливим, тому для прискорення роботи скрипта краще розділити блоки підключення дисків і зміни опису за допомогою функції-затримки. Дія функції засноване на обчисленні проміжку часу за допомогою нового макросу @Ticks, який повертає кількість мілісекунд з моменту завантаження комп'ютера, визначається різниця часу - при досягненні зазначеного інтервалу в часі, затримки, здійснюється вихід з циклу:

$ Q = @Ticks + $ delay_size * 1000; x - кількість секунд затримки

Until @Ticks> = $ Q

Розглянемо кожен механізм підключення мережевих дисків окремо. Почнемо з Windows XP, тому що там він найбільш зрозумілий і простий.

Перейменування описів мережевих дисків для Windows XP

Точки монтування мережевих дисків організовані за наступним принципом: в папці HKEY_CURRENT_USERSoftwareMicrosoftWindowsCurrentVersionExplorerMountPoints2 для мережевих дисків створюються підрозділи, імена яких організовані за принципом: «## ім'я сервера # ім'я папки, до якої надано доступ # подпапка1 #. # ПодпапкаX ». У кожній з цих підпапок присутні 3 обов'язкових параметра, четвертий - _LabelFromReg також повинен бути створений (див. Рис. 3).

Малюнок 3. Фрагмент реєстру, в якому описуються точки монтування мережевих дисків (Windows XP)

Для зміни імені мережевого диска в папці «Мій Комп'ютер» необхідно змінити значення строкової змінної _LabelFromReg.

Для визначення змінної $ key_path необхідно обчислити назви папок, UNC-шлях: необхідно замінити символ «» на «#»:

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

For $ c = 1 to Len ($ keyw_s)

У наведеному прикладі перехід від символу до символу здійснюється за допомогою циклу For ... Next і комбінації функцій Left і Right. В кінцевому рахунку змінна $ symbol є шістнадцятковим числом (HEX).

Тепер необхідно окремо отримати перший і другий символи кожного з HEX-числа і з першим символом в разі, якщо його код ASCII більше 128, виконати перетворення (див. Таблицю 3). Перший символ і другий символ визначаються наступним чином:

Приступимо до реалізації алгоритму перетворення першого символу шістнадцятирічного числа. У ньому доцільно використовувати систему прапорів та інструкцію select ... case.

Наведемо приклад перетворення першої літери вираження - «С». Як було визначено раніше, цього символу відповідає шістнадцяткове значення D1, виходячи з таблиці 2, D має перетворитися в 2, а саме число в 21:

В даному випадку використовується тільки інструкція select ... case. Флаговая система використовується для визначення алгоритму перетворення, в залежності від HEX-коду символу:

Визначення 2-го байта символу здійснюється по ASCII-коду символу:

Оскільки рядок опису може мати тільки 32 символу і оновлюється виключно записується частина, то щоб уникнути залишення «хвостів» необхідно всі інші символи обнулити:

For $ r = 1 to 32-len ($ keyw_s)

І, нарешті, останній штрих - запис відповідних значень до реєстру:

WriteValue ($ keyw_path + "" + $ ds_s + "\ _ LabelFromReg", "Cache", $ t, "REG_BINARY")

WriteValue ($ keyw_path + "" + $ ds_s + "\ _ LabelFromReg", "Version", $ r_w1 + 1, "REG_DWORD")

WriteValue ($ keyw_path + "" + $ ds_s + "\ _ GVI", "Version", $ r_w2 + 1, "REG_DWORD")

У наведеному прикладі здійснюється нарощування версії в розділах _LabelFromReg і _GVI.

Тепер залишилося навчити скрипт визначати на якій операційній системі він виконується і з описом підключення мережевих дисків буде покінчено.

Тип певної системи в KIXTart визначається за допомогою макросу @PRODUCTTYPE.

Таблиця 4. Список значень, що повертаються макросом @ProductType

Схожі статті