Небольшая история, как из пробного проекта вырастить приложение, которое охватывает большую часть деятельности ИТ отдела.
Сразу скажу, приложение выросло из любительского проекта, начатого для изучения новой технологии. Наверняка существуют похожие решения, которые делают все то же самое и гораздо лучше, а я зачем-то изобретаю велосипед. Наверняка такие "велосипеды" есть, более модные, красивые и с позолоченными спицами. Но этот "велосипед" мой и я на нем успешно и с комфортом еду.
С чего все началось? Давным-давно придя в организацию, в которой до сих пор работаю, я столкнулся с проблемой, что ИТ отдел совершенно не занимался учетом аппаратного обеспечения. Существовала база 1С бухгалтерии, в которой ставились на учет системные блоки, мониторы, принтеры и прочее оборудование. Кладовщик рисовал инвентарные номера и на этом все заканчивалось. Сотрудники отдела получали новую технику, настраивали, устанавливали и дальше о том где какая техника знал только кладовщик и то не всегда. Ситуация более чем странная, во всяком случае для меня.
Казалось бы простые вопросы: какие из рабочих мест нам нужно обновить в этом году или где принтер уже износился так, что его постоянный ремонт стоит больше, чем купить новый и множество мелких других вопросов, ответы на которые можно получить только имея более полную информацию.
Поговорив с начальством и получив "добро" на попытку создания системы учета компьютерного хозяйства - приступил к работе.
Готовых решений я не нашел, был 2005 год. Можно было бы копаться в 1С, пытаясь приспособить ее к моему представлению того, как должен выглядеть учет техники не для бухгалтера, а для администратора, но не хотелось. Ключи на 1С были только у бухгалтерии, для нас их бы никто не стал покупать.
По основной специальности я программист и мне хотелось изучить возможности SQL сервера от Microsoft. С нашей версией 1С поставлялся MS SQL 2000. По сравнению с версией MS SQL 7, это была уже довольно удобная база, с продуманным инструментом для управления. И конечно удобнее MS Access (от этого слова и продукта до сих пор мороз по коже, хотя и в нем есть приятные мелочи). До этого мне приходилось писать клиент-серверные приложения на C++ Builder в связке с базой Oracle. Так почему бы не попробовать свои силы в похожей связке, но в качестве базы использовать MS SQL 2000?
Итак, в свободное от основной работы время я приступил к созданию программы для учета компьютерной техники в организации.
Выдернув первоначальные данные, создал первое простенькое приложение (к сожалению, или к счастью, скриншотов с него не осталось). Это был простой список оборудования, с возможностью поиска, сортировки. Карточка оборудования содержала, помимо данных из 1С: вид оборудования (монитор, системный блок, принтер, копировальный аппарат и т.п.), расположение (кабинет), владелец (ФИО кто использует технику) и что-то еще по мелочи, за давностью лет, уже не помню.
Раскрасил табличку в разные цвета, чтобы каждый вид техники у меня выделялся отдельным цветом.
Сначала замахнулся на задание каждому виду отдельного цвета, но получилась такая мешанина, что глаз дергаться начинал. Поэтому в итоге осталось четыре основных цвета (системный блок, монитор, принтер и копир).
На первые грабли при проектировании я прыгнул, когда первичным ключом таблицы с оборудованием решил сделать инвентарный номер. Эх молодость... Это в дальнейшем я множество раз в разных умных книгах читал, что не стоит в качестве первичного ключа делать какую-либо сущность из тех данных, что у вас в таблице. В 99% случаев пользователь, даже для самых уникальных данных, найдет причину почему здесь должны быть одинаковые значения. Так и в моем случае - я очень быстро понял, что инвентарный номер это далеко не уникальная штука. Например, купило предприятие одинаковые мониторы, и ставит их на учет под одинаковыми номерами - скопом, поскольку по документам они идут одной строкой с количеством. Поэтому - переделываем.
Идем дальше. Первой идеей было взять наименование устройства из 1С, оно же было так куплено и в документах проходит... ну-ну. Чего я только не увидел в качестве названий: русские транскрипции или латиницу на одно и тоже оборудование, например могли написать "HP Laser Jet", или "Лазер Джет", или "HP LJ", да просто "Принтер" наконец. Синтаксические ошибки, орфографические... в наименовании могло быть написано что угодно, все зависело от фантазии бухгалтера, который забивал эту позицию в 1С, а также от его зрения, что он увидел, то написал. Если увидел нечетко, то и написал примерно.
Поэтому очень быстро появилась вторая строка с наименованием, которое было уже универсальное, а затем модель оборудования просто стала браться из справочника, который заполнялся администратором самостоятельно.
Исходя из того бардака (с моей точки зрения), который творился в 1С, от постоянной связки с ней пришлось отказаться. И моя база стала заполняться параллельно от 1С, для нужд ИТ отдела.
Немного забегая вперед хочу сказать, что сейчас зачастую уже кладовщики и бухгалтера иногда считают мою базу более верной чем свою, и в случаях каких-либо поисков оборудования или спорных ситуаций обращаются к ней.
Понемногу "скелет" базы начал обрастать "мясом" в виде данных об оборудовании, различных группировок для удобства поиска, отчетов. В карточку устройства записывалось не только у кого и где оно находится, но и была привязка к справочнику отделов и управлений организации, добавился год покупки, состояние оборудования (рабочее или сломанное). Можно было просматривать все оборудование в каком-нибудь кабинете, или все что располагается у какого-то отдела.
База заполнялась в ручном режиме, кое какая автоматизация придет позже, но об этом потом.
Главное в таких вещах, это актуальность и достоверность информации. Если обращаясь к данным, ты не уверен, что здесь отражено реальное положение дел, то весь ваш труд напрасен.
Видя очевидные преимущества от использования даже такой простой системы учета, руководство отдела обязало админов заполнять базу на регулярной основе. Переставил принтер от сотрудника к сотруднику - отметь! Теперь идя по вызову к работнику на другом конце здания, администратор мог не по памяти ориентироваться на то, с чем придется столкнуться, а просто заглянуть в базу.
Помимо основной функциональности добавились чисто эстетические составляющие, например логотипы фирм производящих оборудование, они появлялись в таблице рядом с названием техники. Была сделана связь с приложением отдела кадров, которое реализовывалось на Access, в карточку оборудования вставлялось ФИО человека. Также была сделана привязка к телефонному справочнику организации.
Но скажу сразу, эти нововведения долго не прожили. Логотипы стали бессмысленными, когда оборудования разных марок стало слишком много. Связь с отделом кадров и телефонным справочником тоже отпала, чтобы возродиться несколько в другом варианте.
Еще одной полезной штукой была реализация справочника видов оборудования с фотографией самого устройства. Зачастую очень полезно для различных моделей принтеров, которые отличаются одной буквой в названии, а функционал может быть очень различным. Когда моделей по зданию десятки, то на память полагаться сложно. А видя фотографию, сразу понятно, с чем имеешь дело.
Дополнительно возникла еще одна функция – история изменений этой базы. На самом SQL сервере это реализовывалось довольно топорно и просто – на update и insert в базу был добавлен триггер, который брал текущую строку таблицы и записывал ее в отдельную таблицу изменений. В итоге мы получили полную историю изменений по оборудованию. Например можно было увидеть, у кого за эти года побывал монитор или системный блок.
Собственно, с тех времен скриншот уже остался.
Один из первых вариантов внешнего вида приложения
Согласен, выглядит по нынешним временам (да и по тем тоже), не очень. Но она работала и очень облегчала жизнь.
Придумывать что-то новое я не стал и решил просто расширить существующую базу. Первоначально сделал справочник видов программного обеспечения по группам: коммерческое ПО, собственные разработки, бесплатное ПО. Внутри уже шло деление по типам ПО: антивирусное ПО, CAD системы, офисное ПО, среды программирования и т.п.
Карточка определенного программного обеспечения уже включала в себя информацию о наименовании, производителе и детальную информацию о лицензии: количество, у кого приобретено, каков срок действия, регистрационные и серийные номера.
Далее возник следующий вопрос: список лицензий, это замечательно – но нужна понимать куда они установлены. Решено было сделать карточки рабочих мест. В них должен быть отражен состав программного и аппаратного обеспечения.
Здесь возник еще один вопрос. Что считать рабочим местом? Создавать какую-то отдельную сущность? Или привязывать к чему-то реальному? Покрутив и так и эдак, я решил сделать привязку опосредованно к системному блоку, как к некоему основополагающему признаку. Ведь к нему подключаются все остальные устройства и на него устанавливаются все лицензии. В итоге родилось вот какое решение: есть некая сущность названная по определенному шаблону, здесь мы коллегиально решили называть компьютеры в сети как "PC_%%%%", где на местах % указываются последние 4 цифры инвентарного номера системного блока (например PC_0134, где полный инвентарный номер выглядел как 0001360134). Начало инвентарных номеров было одинаковое, отличие было только в последних четырех знаках.
Пока не ушел дальше, сразу скажу о плюсах и минусах такого решения:
Помимо удлинения номера машины, за счет не уникальности номера возникала еще проблема получения этого номера от бухгалтерии, то они неправильно выдадут, то слишком долго не оприходуют, то еще какая-нибудь "беда". В итоге мы пришли к следующему стандарту "PC-%%%%", где % просто порядковый номер. Еще для удобства иногда к буквам добавляем дополнительные символы для обозначения подразделений, чтобы их машины группировались при обзоре сети. Например подразделение "Централизованная бухгалтерия" имена машин "PCCB-%%%%" и т.д.
Но что-то уже много текста, давайте покажу как это выглядит на текущий момент.
Главное окно приложения
Давайте заглянем внутрь какой-нибудь карточки рабочего места.
Учетная карточка рабочего места
Мы можем присоединить к рабочему месту любое устройство из общего списка оборудования или программного обеспечения. Естественно учитывается, что нельзя одно устройство добавить на разные рабочие места (с этим можно поспорить, но мы считаем так), так же автоматически уменьшается количество доступных лицензий на программное обеспечение, если они ограничены. И лишнее вы просто не установите.
Здесь вы можете увидеть две кнопки "Обращение" и "Информация" по ним я расскажу чуть позже, тут нужна предыстория.
Заглянем еще глубже, например посмотрим на принтер из карточки рабочего места.
Учетная карточка оборудования
Типичная карточка любого оборудования. Инвентарный номер, наименование, принадлежность какому-либо подразделению, информация о продавце с данными о гарантии.
Если переключиться на вкладку обслуживание, то увидим следующее:
Вкладка "обслуживание" в карточке оборудования
Заправка картриджей и технический ремонт осуществляется по контракту проведенного с помощью конкурсных процедур. Чтобы контролировать подрядчика, к контракту я добавил в обязательное требование - заполнение обходного листа для исполнителя, т.е. если происходит заправка картриджа, то подрядчик должен в карточке написать вид работ, на каком оборудовании, в каком количестве и взять подпись того лица, которое обратилось с заявкой на работу. Потом в конце месяца эти листы сдаются мне, я сверяю список работ по выставленному счету с этим листом. С него же, данные вносятся с базу.
Также, помимо контроля за исполнением работ, я уже вижу износ и нагрузку каждого принтера. И конечно, при такой системе, подрядчику сложнее пытаться нас обмануть (а они пытаются) вставляя лишние заправки или не заказанные работы.
Итоговую сводку работ по всей организации я могу увидеть в другом отчете:
Отчет по заправкам и ремонтам
Но давайте я пройду еще дальше и нажму на кнопку "Описание". Не обращайте внимание на поля "сайт производителя" и "драйвер", это уже атавизм и надо удалять.
Справочник моделей устройств
Здесь уже видим более детальную информацию об устройстве и о том что оно умеет, а также какие расходные материалы ему нужны и их количестве на складе.
Щелкаем по картриджу из списка и проваливаемся еще глубже:
Справочник расходных материалов
Здесь уже видим информацию о самом картридже, к какому оборудованию он подходит и примерному ресурсу.
Справочники заполняются руками.
И еще немного о картриджах. Чтобы знать, сколько остатков есть на складе, нужно знать, что у тебя на складе, и вовремя учитывать приход и расход материалов.
Учет картриджей
На момент моего трудоустройства, организацию обслуживала фирма, в обязанности которой входили функции по заправке картриджей, техническому обслуживанию и ремонту техники, они же составляли потребность в картриджах, которые затем покупались. Но постепенно финансовых средств становилось все меньше, нас заставили уменьшить размер контракта по обслуживанию офисной техники, а соответственно и обязанности подрядчика.
Когда уже я был назначен на должность начальника ИТ отдела, вся эта головная боль досталась мне. Пришлось самому разобраться во всех тонкостях прогнозирования потребностей в запчастях и картриджах, для этого и была создана довольно примитивная система учета, которая позволяла учитывать сколько и какого оборудования у меня есть, какие картриджи подходят для этого оборудования и сколько их осталось. Можно было задавать остатки на складе, осуществлять приход и расход по факту установки новых картриджей со склада пользователям.
В результате получилась довольно удобная система: если в мой отдел звонит пользователь и просит новый картридж, я открываю карточку рабочего места человека, смотрю модель принтера и сразу вижу остаток на складе. Если человеку действительно нужно установить новый картридж (а это далеко не всегда, да и картриджи оригинальные и дорогие), то прямо из карточки создается запись расхода, которая уменьшает остатки на складе. Ну и в качестве приятного бонуса, я подсвечиваю таблицу разными цветами, когда у меня кончились картриджи, или наоборот оборудования больше нет, а картридж остался. Сразу визуально понятно, где нехватка, а где излишки.
Еще о работе начальника отдела. Так уж вышло, что руководство моей организации время от времени меняется, и каждый новый руководитель начинает свой трудовой путь с оптимизации и сокращения расходов. Начинаются проверки эффективности сотрудников, отчеты о проделанной работе, планы о предстоящих задачах и прочее, прочее. Ну вы и сами знаете.
На моем веку, отдел ИТ реорганизовывали уже раз 5. Сокращали, заново создавали, переформировывали и даже хотели вообще от него отказаться и использовать аутсорс. Вся эта чехарда изрядно портит нервы и заставляет кучу времени тратить на бесполезные отчеты. И здесь наступает...
Вот пример того, как это выглядит:
Учет обращений в отдел
Администратор вносит в таблицу полученную заявку и она везде идет с его фамилией. Сейчас у нас пытаются внедрять систему с показателями эффективности каждого сотрудника, если прижмёт, то из этой системы я также это легко получу. Но пока не смотрю на то, кто обработал заявку, главное чтобы она была исполнена. Еще одно преимущество - это коллективная память отдела. Узнать, что мы делали в этот день 5 лет назад - легко. Что произошло пока меня не было в отпуске - открывай и смотри.
Для начала рассмотрим рабочие станции. Мне хотелось бы знать, сколько установлено оперативной памяти на компьютере, какая версия операционной системы (хотя версия указана в карточке рабочего места, но бывают ситуации «даунгрейда», когда покупалась одна версия, но пришлось официально установить более раннюю), сколько свободного места на дисках, скорость сетевого адаптера. Подобная информация просто необходима для планов модернизации техники.
В обычной карточке учета оборудования на рабочем месте пользователя ничего этого нет. Заполнять руками совсем не вариант. Нужно чтобы станции как-то эту информацию отдали самостоятельно.
Сперва был сделан скрипт на PowerShell, который собирал информацию из реестра Windows и записывал ее в текстовый файл в сетевой папке, другой скрипт потом объединял эти файлики сформированные компьютерами и автоматически грузил в мою базу. Решение работало, но было очень медленным. Поскольку скрипт был вставлен в стартовую процедуру подключения к домену, то пользователи начали жаловаться, на медленное включение компьютера по утру. Уж не знаю почему PowerShell повел себя именно так, но пришлось от него отказаться и переписать все на встроенный в Windows jscript, он отрабатывал практически мгновенно.
Получился вот такой скрипт (пользуйтесь, если пригодится):
/*---------------------------------------------------------------------------------------------------------------
Сбор статистической информации о компьютере.
Формируется накопительный текстовый файл, один запуск - одна строка.
---------------------------------------------------------------------------------------------------------------*/
// Переменные, в которых сохраняется итоговая информация для записи в файл отчета.
var StartTime,
Machine,
TotalRam = 0,
OS,
LocalDrives,
FIO,
Processor,
Socket,
MaxSpeed,
MemoryBank,
NetCard;
// Формируем текущую дату. --------------------------------------------------------------------------------------
var d = new Date, mon, day;
mon = "" + (d.getMonth()+1);
day = "" + d.getDate();
if(mon.length == 1) { // Дополняем месяц и дату до двух цифр, если нет ведущего нуля.
mon = "0" + mon;
}
if(day.length == 1) {
day = "0" + day;
}
StartTime = day + "." + mon + "."+d.getFullYear()+";"+d.getHours()+":"+d.getMinutes()+":"+d.getSeconds();
var root = GetObject("winmgmts:\\\\.\\root\\cimv2"); //Подключились к WMI локального компьютера (".")
// Получаем информацию об оперативной памяти. -------------------------------------------------------------------
var querry = root.ExecQuery("Select * from Win32_PhysicalMemory"); // Запрос данных об оперативной памяти.
var accitem;
MemoryBank = "";
for(var acc = new Enumerator(querry); !acc.atEnd(); acc.moveNext()) {
accitem = acc.item();
TotalRam += accitem.Capacity / 1024 / 1024 / 1024; // В гигабайтах.
MemoryBank += accitem.BankLabel + "[" + (accitem.Capacity / 1024/ 1024/ 1024) + "] ";
}
// Получаем информацию об операционной системе. -----------------------------------------------------------------
querry = root.ExecQuery("SELECT * FROM Win32_OperatingSystem"); // Запрос об операционной системе.
for(var acc = new Enumerator(querry); !acc.atEnd(); acc.moveNext()) {
accitem = acc.item();
}
OS = accitem.Caption;
FIO = accitem.Description;
Machine = accitem.CSName;
// Получаем информацию об процессоре. ---------------------------------------------------------------------------
querry = root.ExecQuery("SELECT * FROM Win32_Processor"); // Запрос о процессоре.
for(var acc = new Enumerator(querry); !acc.atEnd(); acc.moveNext()) {
accitem = acc.item();
}
Processor = accitem.Name;
Socket = accitem.SocketDesignation;
// Получаем информацию о сетевой карте. -------------------------------------------------------------------------
querry = root.ExecQuery("SELECT * FROM Win32_NetworkAdapter WHERE AdapterType = 'Ethernet 802.3'"); // Запрос об адаптере.
MaxSpeed = "";
for(var acc = new Enumerator(querry); !acc.atEnd(); acc.moveNext()) {
accitem = acc.item();
MaxSpeed += "[" + accitem.Speed / 1000000 + "] ";
}
querry = root.ExecQuery("SELECT * FROM Win32_NetworkAdapterConfiguration WHERE IPEnabled = TRUE"); // Запрос о конфигурации адаптера.
NetCard = "";
for(var acc = new Enumerator(querry); !acc.atEnd(); acc.moveNext()) {
accitem = acc.item();
NetCard += "[" + accitem.MACAddress + " " + accitem.IPAddress(0) + "] ";
}
// Получаем информацию о дисковой системе. ----------------------------------------------------------------------
querry = root.ExecQuery("SELECT * FROM Win32_LogicalDisk WHERE DriveType = 3 and Size != NULL"); // Запрос о логических дисках.
LocalDrives = "";
for(var acc = new Enumerator(querry); !acc.atEnd(); acc.moveNext()) {
accitem = acc.item();
LocalDrives += accitem.Caption;
var temp = "" + accitem.Size/1024/1024/1024; // Полное пространство в Гигабайтах.
LocalDrives += "[" + temp.substr(0,temp.indexOf(".")+3) + "]"
temp = "" + accitem.FreeSpace/1024/1024/1024; // Свободное пространство в Гигабайтах.
LocalDrives += " " + temp.substr(0,temp.indexOf(".")+3) + " ";
}
// Пишем в файл итоговую строку. -------------------------------------------------------------------------------------
var FSO = WScript.CreateObject("Scripting.FileSystemObject");
var ts = FSO.OpenTextFile("\\\\Server\\stat\\" + Machine + ".INFO.LOG", 8, true);
var f = FSO.getfile("\\\\Server\\stat\\" + Machine + ".INFO.LOG");
ts.WriteLine(StartTime + ";" +
Machine + ";" +
TotalRam + ";" +
OS + ";" +
LocalDrives + ";" +
FIO + ";" +
NetCard + ";" +
Processor + ";" +
Socket + ";" +
MaxSpeed + ";" +
MemoryBank);
ts.Close();
В итоге получаем ежедневную информацию о состоянии оборудования, на основе которой опять же можно принимать решение об апгрейде того или иного компонента. Если еще помните, то я при рассказе о карточке рабочего места обещал рассказать о кнопках «Информация» и «Обращения»? Вот как раз кнопка «Информация» показывает, что насобирал скрипт:
Информация о системном блоке
По итогу на основании такого сбора информации я могу получать следующее:
То что система делалась для себя и ее можно менять как угодно, открывает большие горизонты для «творчества», и для аналитики происходящего. Помимо технической информации о рабочих станциях, мне удалось создать небольшие скрипты, которые автоматизируют еще вот какую работу:
Отчет для руководителя - общая информация
Отчет для руководителя - некоторые сводные графики о работе отдела
Отчет для руководителя - графики обслуживания техники и количества печати
Отчет для руководителя - печать на локальных принтерах и резервное копирование
Это как раз информация из отчета для руководства, специально сделано в виде графиков и картинок для наглядности.
Недавно программный комплекс расширился за счет еще одного модуля, это ведение телефонного справочника организации. Во время очередной оптимизации внутри организации (рифма здесь случайна), на отдел были переданы все контракты по обслуживанию всех видов связи: обслуживание мини АТС, сотовая связь, межгород, местная и т.д. Когда первый шок прошел, нужно было что-то с этим делать. Начал с самого простейшего: инвентаризация. Прошерстил все контракты, выявил всех поставщиков связи и все услуги, которые они предоставляют. Попытался сопоставить все предоставляемые номера телефонов с реальным положением дел. Был удивлен, сколько мы не используем.
Телефонный справочник организации и раньше был в ведении моего отдела. Разработано специальное приложение, с быстрым поиском телефона и владельца. В этот же справочник внесена структура организации в виде древовидного списка, где узлы располагаются в зависимости от подчиненности подразделений друг другу. Еще добавлены планы здания, и когда вы наводите мышью на кабинет, вам показывается кто в этом кабинете располагается и их телефоны, или фотографию этого места.
Общий вид телефонного справочника
Планы здания
Кстати, в этот же справочник мы до кучи, сделали функцию бронирования актовых залов под мероприятия. Теперь любой человек может посмотреть какой зал свободен или занят, с фотографией зала, характеристиками (посадочные места, наличие оборудования и т.п.). Запись в зал могут осуществлять только секретари руководителей, во избежание хаоса в этом вопросе. Первоначально такую функцию мы сделали в SharePoint, но слишком тяжелое получилось решение для простой функции и всё запрограммировали нативно. Из этого справочника данные попадают в наше приложение по учету всего и вся. На вкладке обращений в отдел высвечиваются намеченные на сегодняшний день мероприятия и заявки на оборудование. Что нам очень облегчило жизнь.
Расписание актовых залов
Если уж до конца рассказывать о справочнике, то здесь скрываются еще пара полезных функций. Раньше нас отвлекали звонками о том, что хорошо бы сделать то или иное объявление по зданию. Мы пользовались обычной командой net send, после чего на включенных компьютерах выдавалось сообщение. Пользователи сами такую команду выучить были не в состоянии, поэтому чтобы снять с себя эту рутину сделали такую функцию внутри справочника, поскольку он установлен у всех.
Правда когда внедрялась Windows 7, мы нежданно узнали, что такой функции больше в системе нет. Пришлось искать альтернативные варианты и остановились на маленьком бесплатном приложении "winsent messenger". В составе него есть консольное приложение, которое можно использовать для отправки сообщений, а прием осуществляется его клиентом с GUI.
И последняя функция этого "мультитула" - "Помощник". Для обмена не конфиденциальными документами между пользователями сделан отдельный ресурс. Чтобы он не превратился в помойку, каждую ночь происходит его очистка, предварительно сняв с данных копию. Так вот, если пользователь не успел забрать днем, что ему накидали, то он звонит нам и мы восстанавливаем из копии. Но почему бы не сделать механизм, который бы отслеживал появление файлов на таком ресурсе. Для этого и сделан помощник - он заглядывает в указанную ему папку через определенные интервалы времени и сообщает человеку, если там что-то появилось, при желании помощник может эти файлы забрать и положить куда настроено.
Так вот, данные о телефонном справочнике у меня уже были, для их редактирования была написана простая программка, в виде отдельного приложения. Теперь же мне нужно было быть в курсе, сколько у меня есть телефонных номеров, какие из них заняты, какие свободны, на каких есть межгород, кто к ним подключен и т.п. Пришлось автоматизировать.
Все доступные телефоны были заведены в таблицу "телефонный пул", где каждому номеру был указан провайдер (а у нас их несколько), наличие межгорода, автоматически номер сопоставлялся с телефонным справочником. Так я увидел какие номера не задействованы, на основании чего довольно сильно проредил контракты, уменьшив количество номеров и сократив стоимость контрактов.
Чтобы не держать отдельное приложение для ведения телефонного справочника, все функции были переданы в мое общее приложение.
Вот так из любительского тестового проекта выросло уже довольно большое приложение наполненное функциональностью на все случаи админской жизни. Я далеко не про все вам рассказал, там еще есть многое. Написано оно так, что не требует никаких телодвижений по сопровождению. Лезть в исходники приходится только для изменения функциональности, иногда между изменениями может пройти больше года.
Программа всё также функционирует на базе MS SQL, но уже конечно не 2000. Она благополучно переносилась между версиями, практически без проблем.
Приложение первоначально создавалось с помощью Borland Builder C++ 6 версии, сейчас это версия XE2, использовались компоненты Ehlib и FastReport.
Всё на чем это сделано - честным образом куплено, без иронии.
Я понимаю, что такие разработки завязаны на людей, которые их создают и при смене человека, все может пойти прахом. Но в отделе опыт передается и исходники содержат достаточное количество комментариев и документации.
Я понимаю, что многие скажут, что писать на таком "г.... мамонта" в наше время уже не модно, почему не C#, Java или _______ можете сами вписать что-то свое. Но эта среда разработки довольно удобна и наглядна, опять же на мой взгляд. Генератор отчетов FastReport очень функционален и прост в освоении. Я пробовал когда-то Crystal Report - не зашло.
В планах попробовать перевести это все в браузер, чтобы сделать платформо-независимое приложение.
Хотелось поделиться своим опытом систематизировать работу системных администраторов. Как ограниченными силами попытаться охватить как можно больший круг своих обязанностей и не свихнуться при этом.
Всем добра!
Сразу скажу, приложение выросло из любительского проекта, начатого для изучения новой технологии. Наверняка существуют похожие решения, которые делают все то же самое и гораздо лучше, а я зачем-то изобретаю велосипед. Наверняка такие "велосипеды" есть, более модные, красивые и с позолоченными спицами. Но этот "велосипед" мой и я на нем успешно и с комфортом еду.
С чего все началось? Давным-давно придя в организацию, в которой до сих пор работаю, я столкнулся с проблемой, что ИТ отдел совершенно не занимался учетом аппаратного обеспечения. Существовала база 1С бухгалтерии, в которой ставились на учет системные блоки, мониторы, принтеры и прочее оборудование. Кладовщик рисовал инвентарные номера и на этом все заканчивалось. Сотрудники отдела получали новую технику, настраивали, устанавливали и дальше о том где какая техника знал только кладовщик и то не всегда. Ситуация более чем странная, во всяком случае для меня.
Казалось бы простые вопросы: какие из рабочих мест нам нужно обновить в этом году или где принтер уже износился так, что его постоянный ремонт стоит больше, чем купить новый и множество мелких других вопросов, ответы на которые можно получить только имея более полную информацию.
Поговорив с начальством и получив "добро" на попытку создания системы учета компьютерного хозяйства - приступил к работе.
Готовых решений я не нашел, был 2005 год. Можно было бы копаться в 1С, пытаясь приспособить ее к моему представлению того, как должен выглядеть учет техники не для бухгалтера, а для администратора, но не хотелось. Ключи на 1С были только у бухгалтерии, для нас их бы никто не стал покупать.
По основной специальности я программист и мне хотелось изучить возможности SQL сервера от Microsoft. С нашей версией 1С поставлялся MS SQL 2000. По сравнению с версией MS SQL 7, это была уже довольно удобная база, с продуманным инструментом для управления. И конечно удобнее MS Access (от этого слова и продукта до сих пор мороз по коже, хотя и в нем есть приятные мелочи). До этого мне приходилось писать клиент-серверные приложения на C++ Builder в связке с базой Oracle. Так почему бы не попробовать свои силы в похожей связке, но в качестве базы использовать MS SQL 2000?
Итак, в свободное от основной работы время я приступил к созданию программы для учета компьютерной техники в организации.
Первая итерация.
Сперва я заглянул в 1С, для поиска в ней информации об оборудовании на балансе. Покопавшись в таблицах нашел где притаились сведения об инвентарных и серийных номерах, наименованиях, годах покупки. Больше ничего особо интересного я там не увидел.Выдернув первоначальные данные, создал первое простенькое приложение (к сожалению, или к счастью, скриншотов с него не осталось). Это был простой список оборудования, с возможностью поиска, сортировки. Карточка оборудования содержала, помимо данных из 1С: вид оборудования (монитор, системный блок, принтер, копировальный аппарат и т.п.), расположение (кабинет), владелец (ФИО кто использует технику) и что-то еще по мелочи, за давностью лет, уже не помню.
Раскрасил табличку в разные цвета, чтобы каждый вид техники у меня выделялся отдельным цветом.
Сначала замахнулся на задание каждому виду отдельного цвета, но получилась такая мешанина, что глаз дергаться начинал. Поэтому в итоге осталось четыре основных цвета (системный блок, монитор, принтер и копир).
На первые грабли при проектировании я прыгнул, когда первичным ключом таблицы с оборудованием решил сделать инвентарный номер. Эх молодость... Это в дальнейшем я множество раз в разных умных книгах читал, что не стоит в качестве первичного ключа делать какую-либо сущность из тех данных, что у вас в таблице. В 99% случаев пользователь, даже для самых уникальных данных, найдет причину почему здесь должны быть одинаковые значения. Так и в моем случае - я очень быстро понял, что инвентарный номер это далеко не уникальная штука. Например, купило предприятие одинаковые мониторы, и ставит их на учет под одинаковыми номерами - скопом, поскольку по документам они идут одной строкой с количеством. Поэтому - переделываем.
Идем дальше. Первой идеей было взять наименование устройства из 1С, оно же было так куплено и в документах проходит... ну-ну. Чего я только не увидел в качестве названий: русские транскрипции или латиницу на одно и тоже оборудование, например могли написать "HP Laser Jet", или "Лазер Джет", или "HP LJ", да просто "Принтер" наконец. Синтаксические ошибки, орфографические... в наименовании могло быть написано что угодно, все зависело от фантазии бухгалтера, который забивал эту позицию в 1С, а также от его зрения, что он увидел, то написал. Если увидел нечетко, то и написал примерно.
Поэтому очень быстро появилась вторая строка с наименованием, которое было уже универсальное, а затем модель оборудования просто стала браться из справочника, который заполнялся администратором самостоятельно.
Исходя из того бардака (с моей точки зрения), который творился в 1С, от постоянной связки с ней пришлось отказаться. И моя база стала заполняться параллельно от 1С, для нужд ИТ отдела.
Немного забегая вперед хочу сказать, что сейчас зачастую уже кладовщики и бухгалтера иногда считают мою базу более верной чем свою, и в случаях каких-либо поисков оборудования или спорных ситуаций обращаются к ней.
Понемногу "скелет" базы начал обрастать "мясом" в виде данных об оборудовании, различных группировок для удобства поиска, отчетов. В карточку устройства записывалось не только у кого и где оно находится, но и была привязка к справочнику отделов и управлений организации, добавился год покупки, состояние оборудования (рабочее или сломанное). Можно было просматривать все оборудование в каком-нибудь кабинете, или все что располагается у какого-то отдела.
База заполнялась в ручном режиме, кое какая автоматизация придет позже, но об этом потом.
Главное в таких вещах, это актуальность и достоверность информации. Если обращаясь к данным, ты не уверен, что здесь отражено реальное положение дел, то весь ваш труд напрасен.
Видя очевидные преимущества от использования даже такой простой системы учета, руководство отдела обязало админов заполнять базу на регулярной основе. Переставил принтер от сотрудника к сотруднику - отметь! Теперь идя по вызову к работнику на другом конце здания, администратор мог не по памяти ориентироваться на то, с чем придется столкнуться, а просто заглянуть в базу.
Помимо основной функциональности добавились чисто эстетические составляющие, например логотипы фирм производящих оборудование, они появлялись в таблице рядом с названием техники. Была сделана связь с приложением отдела кадров, которое реализовывалось на Access, в карточку оборудования вставлялось ФИО человека. Также была сделана привязка к телефонному справочнику организации.
Но скажу сразу, эти нововведения долго не прожили. Логотипы стали бессмысленными, когда оборудования разных марок стало слишком много. Связь с отделом кадров и телефонным справочником тоже отпала, чтобы возродиться несколько в другом варианте.
Еще одной полезной штукой была реализация справочника видов оборудования с фотографией самого устройства. Зачастую очень полезно для различных моделей принтеров, которые отличаются одной буквой в названии, а функционал может быть очень различным. Когда моделей по зданию десятки, то на память полагаться сложно. А видя фотографию, сразу понятно, с чем имеешь дело.
Дополнительно возникла еще одна функция – история изменений этой базы. На самом SQL сервере это реализовывалось довольно топорно и просто – на update и insert в базу был добавлен триггер, который брал текущую строку таблицы и записывал ее в отдельную таблицу изменений. В итоге мы получили полную историю изменений по оборудованию. Например можно было увидеть, у кого за эти года побывал монитор или системный блок.
Собственно, с тех времен скриншот уже остался.
Согласен, выглядит по нынешним временам (да и по тем тоже), не очень. Но она работала и очень облегчала жизнь.
Вторая итерация.
Пришло время и государство решило всерьез взяться за борьбу с компьютерным пиратством. Мы закон чтили, но вот с отчетностью и учетом было также очень плохо. Опять же где-то в недрах 1С были платежки за программное обеспечение, но никакого учета по серийным номерам, срокам действия, местам установки не существовало. Время от времени из МВД или Microsoft приходили грозные письма, с требованиями отчитаться о наличии и использовании лицензионного программного обеспечения. Причем Microsoft действовало хитро, естественно они от нас не имела права требовать отчета, но в письме писали, что если мы не предоставим никакой информации об их продуктах, то они будут уже действовать по линии МВД, т.е. писать запросы туда. Приходилось отчитываться. Примерно так же действовали и Autodesk и IBM.Придумывать что-то новое я не стал и решил просто расширить существующую базу. Первоначально сделал справочник видов программного обеспечения по группам: коммерческое ПО, собственные разработки, бесплатное ПО. Внутри уже шло деление по типам ПО: антивирусное ПО, CAD системы, офисное ПО, среды программирования и т.п.
Карточка определенного программного обеспечения уже включала в себя информацию о наименовании, производителе и детальную информацию о лицензии: количество, у кого приобретено, каков срок действия, регистрационные и серийные номера.
Далее возник следующий вопрос: список лицензий, это замечательно – но нужна понимать куда они установлены. Решено было сделать карточки рабочих мест. В них должен быть отражен состав программного и аппаратного обеспечения.
Здесь возник еще один вопрос. Что считать рабочим местом? Создавать какую-то отдельную сущность? Или привязывать к чему-то реальному? Покрутив и так и эдак, я решил сделать привязку опосредованно к системному блоку, как к некоему основополагающему признаку. Ведь к нему подключаются все остальные устройства и на него устанавливаются все лицензии. В итоге родилось вот какое решение: есть некая сущность названная по определенному шаблону, здесь мы коллегиально решили называть компьютеры в сети как "PC_%%%%", где на местах % указываются последние 4 цифры инвентарного номера системного блока (например PC_0134, где полный инвентарный номер выглядел как 0001360134). Начало инвентарных номеров было одинаковое, отличие было только в последних четырех знаках.
Пока не ушел дальше, сразу скажу о плюсах и минусах такого решения:
- плюсы: когда системный блок назван с участием инвентарного номера, то при стирании того же номера с корпуса, всегда его можно было восстановить, просто включив компьютер и посмотрев сетевое имя.
- минусы: не уникальность номеров, т.е. у нас стали появляться рабочие места PC_0135-1, PC_0135-2 и т.п.
Помимо удлинения номера машины, за счет не уникальности номера возникала еще проблема получения этого номера от бухгалтерии, то они неправильно выдадут, то слишком долго не оприходуют, то еще какая-нибудь "беда". В итоге мы пришли к следующему стандарту "PC-%%%%", где % просто порядковый номер. Еще для удобства иногда к буквам добавляем дополнительные символы для обозначения подразделений, чтобы их машины группировались при обзоре сети. Например подразделение "Централизованная бухгалтерия" имена машин "PCCB-%%%%" и т.д.
Но что-то уже много текста, давайте покажу как это выглядит на текущий момент.
Давайте заглянем внутрь какой-нибудь карточки рабочего места.
Мы можем присоединить к рабочему месту любое устройство из общего списка оборудования или программного обеспечения. Естественно учитывается, что нельзя одно устройство добавить на разные рабочие места (с этим можно поспорить, но мы считаем так), так же автоматически уменьшается количество доступных лицензий на программное обеспечение, если они ограничены. И лишнее вы просто не установите.
Здесь вы можете увидеть две кнопки "Обращение" и "Информация" по ним я расскажу чуть позже, тут нужна предыстория.
Заглянем еще глубже, например посмотрим на принтер из карточки рабочего места.
Типичная карточка любого оборудования. Инвентарный номер, наименование, принадлежность какому-либо подразделению, информация о продавце с данными о гарантии.
Если переключиться на вкладку обслуживание, то увидим следующее:
Заправка картриджей и технический ремонт осуществляется по контракту проведенного с помощью конкурсных процедур. Чтобы контролировать подрядчика, к контракту я добавил в обязательное требование - заполнение обходного листа для исполнителя, т.е. если происходит заправка картриджа, то подрядчик должен в карточке написать вид работ, на каком оборудовании, в каком количестве и взять подпись того лица, которое обратилось с заявкой на работу. Потом в конце месяца эти листы сдаются мне, я сверяю список работ по выставленному счету с этим листом. С него же, данные вносятся с базу.
Также, помимо контроля за исполнением работ, я уже вижу износ и нагрузку каждого принтера. И конечно, при такой системе, подрядчику сложнее пытаться нас обмануть (а они пытаются) вставляя лишние заправки или не заказанные работы.
Итоговую сводку работ по всей организации я могу увидеть в другом отчете:
Но давайте я пройду еще дальше и нажму на кнопку "Описание". Не обращайте внимание на поля "сайт производителя" и "драйвер", это уже атавизм и надо удалять.
Здесь уже видим более детальную информацию об устройстве и о том что оно умеет, а также какие расходные материалы ему нужны и их количестве на складе.
Щелкаем по картриджу из списка и проваливаемся еще глубже:
Здесь уже видим информацию о самом картридже, к какому оборудованию он подходит и примерному ресурсу.
Справочники заполняются руками.
И еще немного о картриджах. Чтобы знать, сколько остатков есть на складе, нужно знать, что у тебя на складе, и вовремя учитывать приход и расход материалов.
На момент моего трудоустройства, организацию обслуживала фирма, в обязанности которой входили функции по заправке картриджей, техническому обслуживанию и ремонту техники, они же составляли потребность в картриджах, которые затем покупались. Но постепенно финансовых средств становилось все меньше, нас заставили уменьшить размер контракта по обслуживанию офисной техники, а соответственно и обязанности подрядчика.
Когда уже я был назначен на должность начальника ИТ отдела, вся эта головная боль досталась мне. Пришлось самому разобраться во всех тонкостях прогнозирования потребностей в запчастях и картриджах, для этого и была создана довольно примитивная система учета, которая позволяла учитывать сколько и какого оборудования у меня есть, какие картриджи подходят для этого оборудования и сколько их осталось. Можно было задавать остатки на складе, осуществлять приход и расход по факту установки новых картриджей со склада пользователям.
В результате получилась довольно удобная система: если в мой отдел звонит пользователь и просит новый картридж, я открываю карточку рабочего места человека, смотрю модель принтера и сразу вижу остаток на складе. Если человеку действительно нужно установить новый картридж (а это далеко не всегда, да и картриджи оригинальные и дорогие), то прямо из карточки создается запись расхода, которая уменьшает остатки на складе. Ну и в качестве приятного бонуса, я подсвечиваю таблицу разными цветами, когда у меня кончились картриджи, или наоборот оборудования больше нет, а картридж остался. Сразу визуально понятно, где нехватка, а где излишки.
Еще о работе начальника отдела. Так уж вышло, что руководство моей организации время от времени меняется, и каждый новый руководитель начинает свой трудовой путь с оптимизации и сокращения расходов. Начинаются проверки эффективности сотрудников, отчеты о проделанной работе, планы о предстоящих задачах и прочее, прочее. Ну вы и сами знаете.
На моем веку, отдел ИТ реорганизовывали уже раз 5. Сокращали, заново создавали, переформировывали и даже хотели вообще от него отказаться и использовать аутсорс. Вся эта чехарда изрядно портит нервы и заставляет кучу времени тратить на бесполезные отчеты. И здесь наступает...
Третья итерация
Чтобы автоматизировать создание отчетов о работе, было решено немного формализовать работу внутри отдела. В этот уже разросшийся программный комплекс был добавлен модуль с неожиданным названием "Работа отдела". Я не стал бюрократизировать процесс обращения в отдел для пользователей, заставлять их писать заявки в какую-нибудь Jira. Организация не такая большая и мне бы этого сделать не дали. Просто я обязал своих сотрудников все заявки в отдел записывать в базу. Учитывалась тематика заявки, краткое содержание, кто обратился, время. Ну и такие вещи как: выполнялось ли это во вне рабочее время, пришлось ли куда-либо выезжать, возможно иногородние поездки. Времени такая запись занимает минимум, но это кардинально изменило "баланс сил". Теперь на придирки руководства, а чем это у нас занимаются системные администраторы, если их вдруг не видно бегающими по зданию, ответ генерировался мгновенно. Я мог продемонстрировать занятость по часам, дням, месяцам. Такой отчет я стал делать с периодичностью раз в месяц, полгода, год и рассылать непосредственным руководителям. Тем более они еще до этого, внесли в мою должностную инструкцию обязанность предоставления таких отчетов. И всё... наступила тишина, больше никаких вопросов чем мы тут занимается просто не было.Вот пример того, как это выглядит:
Администратор вносит в таблицу полученную заявку и она везде идет с его фамилией. Сейчас у нас пытаются внедрять систему с показателями эффективности каждого сотрудника, если прижмёт, то из этой системы я также это легко получу. Но пока не смотрю на то, кто обработал заявку, главное чтобы она была исполнена. Еще одно преимущество - это коллективная память отдела. Узнать, что мы делали в этот день 5 лет назад - легко. Что произошло пока меня не было в отпуске - открывай и смотри.
Четвертая итерация – накопление информации.
Дальнейшим шагом по контролю за состоянием рабочих станций и принтеров стала автоматизация сбора информации.Для начала рассмотрим рабочие станции. Мне хотелось бы знать, сколько установлено оперативной памяти на компьютере, какая версия операционной системы (хотя версия указана в карточке рабочего места, но бывают ситуации «даунгрейда», когда покупалась одна версия, но пришлось официально установить более раннюю), сколько свободного места на дисках, скорость сетевого адаптера. Подобная информация просто необходима для планов модернизации техники.
В обычной карточке учета оборудования на рабочем месте пользователя ничего этого нет. Заполнять руками совсем не вариант. Нужно чтобы станции как-то эту информацию отдали самостоятельно.
Сперва был сделан скрипт на PowerShell, который собирал информацию из реестра Windows и записывал ее в текстовый файл в сетевой папке, другой скрипт потом объединял эти файлики сформированные компьютерами и автоматически грузил в мою базу. Решение работало, но было очень медленным. Поскольку скрипт был вставлен в стартовую процедуру подключения к домену, то пользователи начали жаловаться, на медленное включение компьютера по утру. Уж не знаю почему PowerShell повел себя именно так, но пришлось от него отказаться и переписать все на встроенный в Windows jscript, он отрабатывал практически мгновенно.
Получился вот такой скрипт (пользуйтесь, если пригодится):
/*---------------------------------------------------------------------------------------------------------------
Сбор статистической информации о компьютере.
Формируется накопительный текстовый файл, один запуск - одна строка.
---------------------------------------------------------------------------------------------------------------*/
// Переменные, в которых сохраняется итоговая информация для записи в файл отчета.
var StartTime,
Machine,
TotalRam = 0,
OS,
LocalDrives,
FIO,
Processor,
Socket,
MaxSpeed,
MemoryBank,
NetCard;
// Формируем текущую дату. --------------------------------------------------------------------------------------
var d = new Date, mon, day;
mon = "" + (d.getMonth()+1);
day = "" + d.getDate();
if(mon.length == 1) { // Дополняем месяц и дату до двух цифр, если нет ведущего нуля.
mon = "0" + mon;
}
if(day.length == 1) {
day = "0" + day;
}
StartTime = day + "." + mon + "."+d.getFullYear()+";"+d.getHours()+":"+d.getMinutes()+":"+d.getSeconds();
var root = GetObject("winmgmts:\\\\.\\root\\cimv2"); //Подключились к WMI локального компьютера (".")
// Получаем информацию об оперативной памяти. -------------------------------------------------------------------
var querry = root.ExecQuery("Select * from Win32_PhysicalMemory"); // Запрос данных об оперативной памяти.
var accitem;
MemoryBank = "";
for(var acc = new Enumerator(querry); !acc.atEnd(); acc.moveNext()) {
accitem = acc.item();
TotalRam += accitem.Capacity / 1024 / 1024 / 1024; // В гигабайтах.
MemoryBank += accitem.BankLabel + "[" + (accitem.Capacity / 1024/ 1024/ 1024) + "] ";
}
// Получаем информацию об операционной системе. -----------------------------------------------------------------
querry = root.ExecQuery("SELECT * FROM Win32_OperatingSystem"); // Запрос об операционной системе.
for(var acc = new Enumerator(querry); !acc.atEnd(); acc.moveNext()) {
accitem = acc.item();
}
OS = accitem.Caption;
FIO = accitem.Description;
Machine = accitem.CSName;
// Получаем информацию об процессоре. ---------------------------------------------------------------------------
querry = root.ExecQuery("SELECT * FROM Win32_Processor"); // Запрос о процессоре.
for(var acc = new Enumerator(querry); !acc.atEnd(); acc.moveNext()) {
accitem = acc.item();
}
Processor = accitem.Name;
Socket = accitem.SocketDesignation;
// Получаем информацию о сетевой карте. -------------------------------------------------------------------------
querry = root.ExecQuery("SELECT * FROM Win32_NetworkAdapter WHERE AdapterType = 'Ethernet 802.3'"); // Запрос об адаптере.
MaxSpeed = "";
for(var acc = new Enumerator(querry); !acc.atEnd(); acc.moveNext()) {
accitem = acc.item();
MaxSpeed += "[" + accitem.Speed / 1000000 + "] ";
}
querry = root.ExecQuery("SELECT * FROM Win32_NetworkAdapterConfiguration WHERE IPEnabled = TRUE"); // Запрос о конфигурации адаптера.
NetCard = "";
for(var acc = new Enumerator(querry); !acc.atEnd(); acc.moveNext()) {
accitem = acc.item();
NetCard += "[" + accitem.MACAddress + " " + accitem.IPAddress(0) + "] ";
}
// Получаем информацию о дисковой системе. ----------------------------------------------------------------------
querry = root.ExecQuery("SELECT * FROM Win32_LogicalDisk WHERE DriveType = 3 and Size != NULL"); // Запрос о логических дисках.
LocalDrives = "";
for(var acc = new Enumerator(querry); !acc.atEnd(); acc.moveNext()) {
accitem = acc.item();
LocalDrives += accitem.Caption;
var temp = "" + accitem.Size/1024/1024/1024; // Полное пространство в Гигабайтах.
LocalDrives += "[" + temp.substr(0,temp.indexOf(".")+3) + "]"
temp = "" + accitem.FreeSpace/1024/1024/1024; // Свободное пространство в Гигабайтах.
LocalDrives += " " + temp.substr(0,temp.indexOf(".")+3) + " ";
}
// Пишем в файл итоговую строку. -------------------------------------------------------------------------------------
var FSO = WScript.CreateObject("Scripting.FileSystemObject");
var ts = FSO.OpenTextFile("\\\\Server\\stat\\" + Machine + ".INFO.LOG", 8, true);
var f = FSO.getfile("\\\\Server\\stat\\" + Machine + ".INFO.LOG");
ts.WriteLine(StartTime + ";" +
Machine + ";" +
TotalRam + ";" +
OS + ";" +
LocalDrives + ";" +
FIO + ";" +
NetCard + ";" +
Processor + ";" +
Socket + ";" +
MaxSpeed + ";" +
MemoryBank);
ts.Close();
В итоге получаем ежедневную информацию о состоянии оборудования, на основе которой опять же можно принимать решение об апгрейде того или иного компонента. Если еще помните, то я при рассказе о карточке рабочего места обещал рассказать о кнопках «Информация» и «Обращения»? Вот как раз кнопка «Информация» показывает, что насобирал скрипт:
По итогу на основании такого сбора информации я могу получать следующее:
- распределение оперативной памяти – может быть нужно увеличить;
- процентное соотношение операционных систем - для понимания как все плохо или хорошо;
- где можно ускорить компьютерную сеть - или почему вдруг упала скорость, может кабель перебили;
- так как скрипт срабатывает каждый раз при авторизации в сети, то можно отлавливать аномальное количество перезагрузок, что свидетельствует о странном поведении системного блока. Пользователь не всегда бежит жаловаться, если у него все зависло и пришлось перезагружать;
- так же можно отследить факты несанкционированного изменения оборудования. Если вдруг изменился состав оперативной памяти, а в карточку никто ничего из моего отдела не занес, то можно предположить, что кто-то решил плашку памяти себе забрать. Но таких случаев у нас не было.
То что система делалась для себя и ее можно менять как угодно, открывает большие горизонты для «творчества», и для аналитики происходящего. Помимо технической информации о рабочих станциях, мне удалось создать небольшие скрипты, которые автоматизируют еще вот какую работу:
- Каждый день с серверов забираются логи с ошибками и предупреждениями и также помещаются в базу. Таким образом, утром включив компьютер, администратор видит происходящее на серверах внутри нашего программного комплекса, при чем данные об ошибках сравниваются с предыдущими днями, сигнализируя админу, происходит снижение или возрастание ошибок. Результат вы видели на экране с обращениями в отдел.
- С помощью доменных политик настроены специальные журналы на серверах, в которые попадают события о печати документов на локальных принтерах и сетевых принтерах, которые заведены на принт-сервер. Ежедневно эти логи копируются в мой комплекс и я могу видеть название распечатанного документа, количество листов и страниц в документе. Для чего мне это?
Ну во первых для некоторых разбирательств с пользователями, когда у человека вдруг заканчивается только что заправленный картридж, и он утверждает, что ничего такого не печатал, кроме рабочих документов, я могу поверить на слово, но можно ведь и проверить. Заправка картриджа это деньги, бумага это деньги - их всегда мало.
Когда я только внедрил эту систему и просто наблюдал за печатью, был очень неприятно удивлен, сколько печатают в личных целях. Я все понимаю, все мы можем что-то распечатать в личных целях, но не художественную литературу же, в 300-400 листов… Ругаться с каждым не хотелось и я сделал очень простую вещь, каждый понедельник всем руководителям управлений и отделов в автоматическом режиме присылается письмо с выборкой по его сотрудникам, но не по всем подряд, а так называемый топ 10, десять самых больших распечатанных документов за неделю – количество листов и название. Хотите верьте, хотите нет, но мои расходы на заправку реально сократились. Разбираться с сотрудниками уже пришлось их непосредственным руководителям.
Во вторых я получил некую оценку загруженности принтера уже не по количествам заправок, а по количеству распечатанных документов. Что позволило мне перераспределить принтера по учреждению. Где высокая нагрузка поставить аппараты мощнее, что опять же привело к экономии на заправках и ремонте.
В третьих, это оказало пользу уже не мне, а нашему завхозу, который отвечает за закупку офисной бумаги на все учреждение. С помощью этой статистики можно было увидеть расход бумаги по подразделениям и по организации в целом для планирования дальнейших закупок. - Настроенные процедуры резервного копирования из различных комплексов также отправляют некую статистику в этот программный комплекс. Я вижу изменения размеров резервных копий, а также соотношение объемов данных по комплексам.
- Еще одна маленькая функция позволяет учитывать то, что учесть автоматизированным способом нельзя. Это поступление и выдачу каких-то материалов, например компакт дисков, флэшек, мышей, клавиатур. Сначала такой учет возник из-за требований бухгалтерии в отчете о расходовании закупаемых "расходников" (например вы купили 100 CD-R дисков и бухгалтерия просит отчет о каждом из них... такое бывает), но потом он пригодился при анализе потребности в том или ином материале при ежегодных закупках. Мы записываем в специальную форму приход таких материалов, потом их расход, кому и что отдали.
- Также на мой отдел возложена функция работы с электронными подписями пользователей, генерация, учет, отслеживание сроков действия. Для этого был сделан маленький модуль, в котором хранятся все сроки подписей и он сигнализирует, когда подходит срок окончания той или иной подписи, а поскольку их уже под сотню, то без автоматизации просто не обойтись.
Это как раз информация из отчета для руководства, специально сделано в виде графиков и картинок для наглядности.
Недавно программный комплекс расширился за счет еще одного модуля, это ведение телефонного справочника организации. Во время очередной оптимизации внутри организации (рифма здесь случайна), на отдел были переданы все контракты по обслуживанию всех видов связи: обслуживание мини АТС, сотовая связь, межгород, местная и т.д. Когда первый шок прошел, нужно было что-то с этим делать. Начал с самого простейшего: инвентаризация. Прошерстил все контракты, выявил всех поставщиков связи и все услуги, которые они предоставляют. Попытался сопоставить все предоставляемые номера телефонов с реальным положением дел. Был удивлен, сколько мы не используем.
Телефонный справочник организации и раньше был в ведении моего отдела. Разработано специальное приложение, с быстрым поиском телефона и владельца. В этот же справочник внесена структура организации в виде древовидного списка, где узлы располагаются в зависимости от подчиненности подразделений друг другу. Еще добавлены планы здания, и когда вы наводите мышью на кабинет, вам показывается кто в этом кабинете располагается и их телефоны, или фотографию этого места.
Кстати, в этот же справочник мы до кучи, сделали функцию бронирования актовых залов под мероприятия. Теперь любой человек может посмотреть какой зал свободен или занят, с фотографией зала, характеристиками (посадочные места, наличие оборудования и т.п.). Запись в зал могут осуществлять только секретари руководителей, во избежание хаоса в этом вопросе. Первоначально такую функцию мы сделали в SharePoint, но слишком тяжелое получилось решение для простой функции и всё запрограммировали нативно. Из этого справочника данные попадают в наше приложение по учету всего и вся. На вкладке обращений в отдел высвечиваются намеченные на сегодняшний день мероприятия и заявки на оборудование. Что нам очень облегчило жизнь.
Если уж до конца рассказывать о справочнике, то здесь скрываются еще пара полезных функций. Раньше нас отвлекали звонками о том, что хорошо бы сделать то или иное объявление по зданию. Мы пользовались обычной командой net send, после чего на включенных компьютерах выдавалось сообщение. Пользователи сами такую команду выучить были не в состоянии, поэтому чтобы снять с себя эту рутину сделали такую функцию внутри справочника, поскольку он установлен у всех.
Правда когда внедрялась Windows 7, мы нежданно узнали, что такой функции больше в системе нет. Пришлось искать альтернативные варианты и остановились на маленьком бесплатном приложении "winsent messenger". В составе него есть консольное приложение, которое можно использовать для отправки сообщений, а прием осуществляется его клиентом с GUI.
И последняя функция этого "мультитула" - "Помощник". Для обмена не конфиденциальными документами между пользователями сделан отдельный ресурс. Чтобы он не превратился в помойку, каждую ночь происходит его очистка, предварительно сняв с данных копию. Так вот, если пользователь не успел забрать днем, что ему накидали, то он звонит нам и мы восстанавливаем из копии. Но почему бы не сделать механизм, который бы отслеживал появление файлов на таком ресурсе. Для этого и сделан помощник - он заглядывает в указанную ему папку через определенные интервалы времени и сообщает человеку, если там что-то появилось, при желании помощник может эти файлы забрать и положить куда настроено.
Так вот, данные о телефонном справочнике у меня уже были, для их редактирования была написана простая программка, в виде отдельного приложения. Теперь же мне нужно было быть в курсе, сколько у меня есть телефонных номеров, какие из них заняты, какие свободны, на каких есть межгород, кто к ним подключен и т.п. Пришлось автоматизировать.
Все доступные телефоны были заведены в таблицу "телефонный пул", где каждому номеру был указан провайдер (а у нас их несколько), наличие межгорода, автоматически номер сопоставлялся с телефонным справочником. Так я увидел какие номера не задействованы, на основании чего довольно сильно проредил контракты, уменьшив количество номеров и сократив стоимость контрактов.
Чтобы не держать отдельное приложение для ведения телефонного справочника, все функции были переданы в мое общее приложение.
Вот так из любительского тестового проекта выросло уже довольно большое приложение наполненное функциональностью на все случаи админской жизни. Я далеко не про все вам рассказал, там еще есть многое. Написано оно так, что не требует никаких телодвижений по сопровождению. Лезть в исходники приходится только для изменения функциональности, иногда между изменениями может пройти больше года.
Программа всё также функционирует на базе MS SQL, но уже конечно не 2000. Она благополучно переносилась между версиями, практически без проблем.
Приложение первоначально создавалось с помощью Borland Builder C++ 6 версии, сейчас это версия XE2, использовались компоненты Ehlib и FastReport.
Всё на чем это сделано - честным образом куплено, без иронии.
Я понимаю, что такие разработки завязаны на людей, которые их создают и при смене человека, все может пойти прахом. Но в отделе опыт передается и исходники содержат достаточное количество комментариев и документации.
Я понимаю, что многие скажут, что писать на таком "г.... мамонта" в наше время уже не модно, почему не C#, Java или _______ можете сами вписать что-то свое. Но эта среда разработки довольно удобна и наглядна, опять же на мой взгляд. Генератор отчетов FastReport очень функционален и прост в освоении. Я пробовал когда-то Crystal Report - не зашло.
В планах попробовать перевести это все в браузер, чтобы сделать платформо-независимое приложение.
Хотелось поделиться своим опытом систематизировать работу системных администраторов. Как ограниченными силами попытаться охватить как можно больший круг своих обязанностей и не свихнуться при этом.
Всем добра!
Я сделаю свое приложение, с блэкджеком и таблицами! Или как вырастить и кормить доброго монстра
Небольшая история, как из пробного проекта вырастить приложение, которое охватывает большую часть деятельности ИТ отдела. Сразу скажу, приложение выросло из любительского проекта, начатого для...
habr.com