We rise up for the things we believe in over and over again

В продолжение записи, опубликованной ранее.
Как известно, при блокировании учетной записи сотрудника, в почтовый ящик этого человека почта продолжать поступать будет. Это не by design, такая логика работы в Exchange 2003 была включена в одном из обновлений, а в версиях 2007 и выше - уже по-умолчанию. И вроде как это даже разумно. Потому что далеко не всегда после увольнения сотрудника известно, кто будет его замещать, а переписку терять нельзя.
Но буквально недавно было поставлено условие - почтовые ящики уволенных сотрудников (которые не удаляются, равно как и учетные записи), не должны принимать никаких сообщений. Ведь на то эти учетные записи и заблокированы. Что ж, принимая во внимание тот факт, что такая мера хоть в некоторой степени остановит рост баз, всецело за. И в общем-то, оно и было сделано ранее - путем подставновки минимального и максимального разрешенного размера письма. Ага, равного нулю. И во время проверки выяснилась любопытная вещь: письма при такой настройке как проходили, так и проходят.
Неладно что-то в датском королевстве. Начинаем играть с параметрами и приходим к выводу, что если вместо нуля подставить любое целое число - ограничение работает. Ставим ноль - письма проходят как сквозь масло.
Что ж, можно, конечно, поставить в качестве ограничения 1 килобайт, но это как-то претит. Что можно еще сделать? А можно, например, сделать так, что почтовый ящик будет способен принимать письма только от себя самого. И поскольку учетная запись заблокирована, никто письмо послать не сможет. Точнее, сможет, но отправителю придет отбойник, что и требуется. Как реализовать?

$userDN = (get-qaduser $user).directoryEntry.DistinguishedName;set-qaduser -identity $user -oa @{authOrig = "$userDN"}
где в переменной $user хранится, например, логин увольняющегося человека (в моем случае он берется из заранее заготовленного расстрельного списка), а переменная $userDN получает значение атрибута DistinguishedName нужной нам учетной записи. Атрибут authOrig (разрешенный отправитель) в качестве значения хранит именно DN какой либо-либо учетной записи.
Ну а что же делать, если надо обработать пару сотен таких учетных записей? Как вариант - использование цикла foreach:

foreach ($user in (get-qaduser -disabled) {$userDN = (get-qaduser $user).directoryEntry.DistinguishedName;set-qaduser -identity $user -oa @{authOrig = "$userDN"}}
Буквально: для каждого элемента коллекции, полученной из выборки всех заблокированных учетных записей домена выполнить указанную выше команду.

@музыка: DA - Forest Runners

@темы: PowerShell, Scripting, MS Exchange

We rise up for the things we believe in over and over again
Вздумалось мне посмотреть, что же из себя представляет тестовая лаборатория от Microsoft с развернутым в ней Forefron Endpoint Protection. Давно хотел оценить, что предлагает МС на рынке защиты конечных компьютеров. Результаты, надо сказать, просто удивительные:

Для тех, кто не в курсе - копия операционной системы, установленная в развернутой виртуальной машине, не прошла проверку подлинности. Причины остаются за кадром, важен сам факт. Напоминаю, это скриншот официальной виртуальной лаборатории.

Ну а второе - лишнее подтверждение тому, что Windows 2008 Server Computer Manager, написанный на .NET - все же очень сильно проигрывает по отзывчивости старому доброму ММС образца 2003 версии.


@музыка: Lifescapes - Awakening (да, Хокть, оно все еще крутится на автоповторе)

@темы: Этот безумный мир, Этот веселый мир

We rise up for the things we believe in over and over again
Если кратко, то первый - это анахронизм уже во времена Windows XP. Абсолютно неинформативен и даже вреден. В 2008, Windows 7 уже появился вменяемый Resource Monitor.
А полностью история выглядит так. Есть корпоративный антивирус, имя которому Trend Micro Office Scan 10.5. Да, да, кто "в теме" - тому уже все ясно. Есть система наблюдения за состоянием серверов, которая исправно докладывает в контрольной панели о том, что на каком-либо хосте нештатная ситуация. Как и сегодня - на одном из серверов зарегистрировано расходование огромного количества памяти. Свободной осталось пара процентов, а это RODC, который таким никогда не страдал. Открываем Task Manager - тишь и благодать. Но ведь свободной памяти нет... Открываем любимый Process Explorer и видим прекрасное:

Особое внимание на процесс TmListen.exe. Это мелкая служба, задача которой принимать команды от сервера Trend Micro. Второй столбец - это объем памяти, который данная служба сейчас действительно занимает в RAM. Первый же - сколько эта служба подгребла под себя за все время своей работы. Тут и RAM, и Page File. Полтора гигабайта. Служба, которая просто принимает собщение от центра контроля, и больше ничего. У меня просто нет слов.
А самое противное, эта утечка памяти проявляется не только на одном сервере, а практически на всех компьютерах, где стоит клиент TM, а стоит он, по понятным причинам, везде. Рабочие станции спасает тот факт, что они все же перезагружаются. Постоянно работающие же серверы - под ударом. Лечение простое - Unload Client, Run Client. И до следующего раза, который будет где-то месяца через два.

@музыка: Lifescapes - Awakening

@темы: Этот безумный мир

We rise up for the things we believe in over and over again
В мире линуксов эта вещь не нуждается в описании - о ней в курсе все. В мире Windows то же самое известно под именем Event Collector. Было настроено ранее, но результат откровенно разочаровал. Вот пример сообщения, которое можно увидеть:

Log Name: Application
Source: Windows Server Update Services
Date: 16.11.2011 14:13:17
Event ID: 13001
Task Category: (6)
Level: Warning
Keywords: Classic
User: N/A
Computer: XXXXXXXXXXXXXXXXXXXXXX
Description:
The description for Event ID 13001 from source Windows Server Update Services cannot be found. Either the component that raises this event is not installed on your local computer or the installation is corrupted. You can install or repair the component on the local computer.
If the event originated on another computer, the display information had to be saved with the event.
The following information was included with the event:
Client computers are installing updates with a higher than 10 percent failure rate. This should be monitored.

И это - самое безобидное, последняя строка хоть какую-то информацию дает о том, что происходит со службой на удаленном сервере. В большинстве же случаев будем довольстоваться именно вот этим: The description for Event ID XXX from source XXXXXXXXXXXX cannot be found.

А централизованное хранилище логов все же хочется. И решили с коллегой-никсоидом попробовать связку syslog-ng + Snare Agent for Windows.
Скажу сразу - именно то, что нужно. Полный текст сообщения преобразовывается именно в текст, после чего уже в таком виде пересылается в базу данных на syslog-ng. Настройка агента весьма подробно описана в официальной инструкции, так что проблем быть не должно. За одним исключением. В последней на данный момент версии агента на странице настройки сетевых параметров через web-интерфейс присутствует занятный баг: при попытке выставить приоритет отсылаемых событий в DYMANIC, после сохранения настроек приоритет выставляется в Emergency, что доставит немало головной боли тем, кто уже наблюдает за событиями на syslog-ng. Как побороть - очень просто, нужно зайти в редактор реестра и в следующем ключе - HKEY_LOCAL_MACHINE\SOFTWARE\InterSect Alliance\AuditService\Network сменить значение параметра SyslogDynamicCritic на единицу. После чего перезапустить службу Snare. В результате приоритет в окне настроек выставится в DYNAMIC, что нам и нужно.
Если кого-то это заинтересовало - официальная страница Snare Agent for Windows: InterSect Alliance.

We rise up for the things we believe in over and over again
Запись скорее для себя, чтобы помнить: как найти все динамические группы рассылки в домене. Обычный однострочник с использованием Quest AD, единственный затык - это незнание того, что динамические группы это объект AD, принадлежащий классу msExchDynamicDistributionList. Ну а с этим знанием все становится до безобразия просто:
get-qadobject -ldapfilter '(objectClass=msExchDynamicDistributionList)'

@музыка: Heather Dale - Call the name

@темы: PowerShell, Scripting

12:58

Time Zones

We rise up for the things we believe in over and over again

Как всем известно, благодаря инициативе нашего президента IT персонал обрел немного головной боли с отменой перехода на зимнее время. Обновление для операционной системы Windows, которое правит часовые пояса, вышло еще в августе этого года, и времени для его установки вроде бы достаточно. Но аврал в нашей стране - любимый метод работы. Кроме того, возможна ситуация с унаследованной системой, когда ничего не было сделано, а сделать надо.
Итак, самый простой вариант - развернуть WSUS, одобрить там все пакеты обновлений и спокойно сидеть и ждать, пока клиентские системы сами все съедят. Проблемы возникают тогда, когда по каким-то причинам компьютер не хочет ставить этот самый пакет: support.microsoft.com/kb/2570791/ru
В этом случае все просто - нужно смотреть на номер Service Pack, установленного в системе. Если он меньше третьего - придется ставить сначала его.
А что делать, если таких машин много, да еще и сам по себе SP3 ставиться в упор не желает, ссылаясь на ошибку Access Denied? Времени на решение этой проблемы может уйти порядочно, поэтому придется прибегнуть к костылю - нужно будет сменить часовой пояс на каждой такой проблемной машине, после чего через реестр заблокировать переход на зимнее или летнее время.
Инструментарий следующий:
1. Собственно, команда смены часового пояса (согласно выручившей меня странице - Клац!):
Control.exe TIMEDATE.CPL,,/Z XXXX,
где ХХХХ - имя зоны, которую нужно подставить. Посмотреть имя зоны можно в реестре по следующему пути:
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Time Zones
В нашем случае нужно будет подставлять Caucasus Standard Time
Блокирование перехода на зимнее/летнее время выглядит еще тривиальнее:
reg add "HKLM\SYSTEM\CurrentControlSet\Control\TimeZoneInformation" /v DisableAutoDaylightTimeSet /t REG_DWORD /d "1" /f
Собираем все это в единый cmd-файл и выкладываем его в общую папку:

Control.exe TIMEDATE.CPL,,/Z Caucasus Standard Time
reg add "HKLM\SYSTEM\CurrentControlSet\Control\TimeZoneInformation" /v DisableAutoDaylightTimeSet /t REG_DWORD /d "1" /f


2. Средство запуска команд на удаленных системах - старый добрый PsExec отрабатывает на ура.
3. Выборка компьютеров, где патч не применился. В моем случае такие системы собраны в группу Active Directory, назовем ее "DST"
4. Набор Quest AD Management. Все же остался пока на нем.
Суммируя все это получаем:
foreach ($comp in (get-qadcomputer -memberof "DST")) {$target=$comp.name;psexec \\$target -u LOGIN -p PASSWORD "path-to-cmd-file"}

Этот однострочник составит массив из имен компьютеров в группе DST, после чего к каждому через psexec будет выполнен cmd-файл, написанный на шаге 1. Результатом этого будет установка часового пояса в Caucasus Standard Time (Кавказское время (Зима) для русской версии ОС). Перезагрузка компьютера не потребуется.
После этого, уже имея запас времени, можно разбираться с причинами неудачи установки апдейтов.

@темы: PowerShell, Scripting

We rise up for the things we believe in over and over again

Когда-то доводилось мне писать о весьма удручающем баге в Android-телефонах - отсылка СМС не тому получателю. Ради интереса залез в этот тред посмотреть, чего нового написано. В самом конце оставлена пара записей от куратора этого сайта (судя по всему). Вот они, что называется, без купюр:
Comment 1820 by [email protected], Jun 23, 2011
I'm going to block further comments on this issue because it is suspected of placing excessive load on one part of our server-side software for Google Project Hosting.


И вторая (видать с правами что-то не то было):
Comment 1821 by [email protected], Jun 28, 2011
Corrected permissions to just block additional comments because of server load.


Мир должен знать своих героев!
Читаем статус этого треда:
Status: Released
Owner: [email protected]
Closed: Jan 2011
Type-Defect
Priority-Critical
Version-2.2
ReportedBy-User
Restrict-AddIssueComment-Commit

Google, огромное спасибо за такую дезу, но факт остается фактом, в прошивке 2.3.3 этот баг сохранен и так же хорошо воспроизводится, как и раньше.
Печально. Очень печально, что такая крупная, и вроде как уважаемая компания не удосуживается дать хоть какую-то обратную связь.

@музыка: Galaxion - Sleeping Beauty

@темы: Этот безумный мир, Android

We rise up for the things we believe in over and over again

А началось все с того, что стукнуло мне в голову посмотреть, не вышло ли новых прошивок для моего Ведроида. Сказано - сделано, LG Mobile Support Tool на старт, внимание, марш. Да, он запустился, попросил соединение с телефоном и... не нашел оного. Как так? Устройство на столе, USB хвост подключен и к нему, и к системнику. Порт заведомо рабочий, пару часов назад в нем жила флешка. Нет, нету у тебя устройства, дорогуша, вынь да положь.
Чем черт не шутит, переключаем хвост в другой порт. Та же история. Так, если устройство в ОС не видно, стало быть дело может быть в драйверах, ибо устройство как USB хард-диск видно и работает, но оно же "Composite USB device". Не беда, драйверы все в наличии. Сносим текущие, ставим посвежее. Как уже можно догадаться - результат тот же. Ну черт с тобой, VMWare на старт, внимание, марш. Свежая VM, подключаем устройство туда. Неа, нету у тебя устройства, дорогуша, вынь да положь. Ну что за напасть...
К слову сказать, LG PC Suite отличился ровно тем же, устройства просто нет. Ладно, перезагрузка трубки, попытка подключения... тот же эффект.
Начинаем прикидывать. Вся информация дублирована в облаке (контакты, фото). Все программы, которые там стоят, можно и переставить, и довольно быстро. Устройству делается Factory Reset.
После этой весьма и весьма жесткой процедуры робот весело мигает сообщением о том, что он у нас базируется на Android 2.3.3. Это уже хорошо, потому что изначально LGP500 работает на версии 2.2, прошивку 2.3 ждали очень долго и мучительно. Подключаем к USB хвосту, и о, чудо! Девайс прекрасно обнаруживается! Ладно, отставляем это дело, проводим первоначальную настройку телефона. Добавить Google-аккаунт, вычистить все от ненавистных ярлычков на контакт, одноклассники, янедкс- и гуглопоиск и тому подобного барахла. Поставить все необходимые мне ярлыки, настройки... После всей этой косметической оттделки можно и софт докидывать. Вход в Маркет, выбор первого из нужных приложений, установка. Все отлично. Докидываем половину из оставшихся и вспоминаем, что через веб-сайт на ПК это делать несколько удобнее. Заход в Android Market на компьютере, выбор нужного приложения... а дальше челюсть пробивает пол до фундамента: "У вас нет подходящего Android-устройства для установки данного приложения". Это уже за гранью понимания. Проверяем список устройств и понимаем, что там пусто. Простите, а где все? Где все ранее (в марте месяце) установленное? Ну хорошо, даже если был сделан хард-ресет, и после оного информация с аккаунта Google удаляется, уже сейчас как минимум три программы должно светиться, и сам телефон - тоже. Нет, нифига, говорит нам гугл, нет у вас телефонов. Идите в магазин, купите, активируйте, тогда я может быть чего-нибудь и покажу. Ах ты ж зараза.
Лезем в справку, читаем - для того, чтобы телефон появился в списке устройств на сайте, необходимо зайти в Маркет с этого телефона, авторизоваться в нем, а затем уже зайти на сайт на ПК, введя тот же логин и пароль, под которым авторизовался в Маркете на телефоне. Проклятие и еще раз проклятие, все это было сделано!
Ладно, нам не привыкать! Второй Hard-reset. Только на этот раз учетку Google подключаем уже после того, как об этом попросит Маркет. Ввели, авторизовались. Даже поставили одно из нужных приложений. Лезем на сайт, в списке устройств ноль. Да твою ж... материнскую плату! Обновить страницу и с удивлением обнаружить, что телефон наконец-то опознан сайтом, но без этого самого приложения. Да и фиг с тобой. Уже через сайт добавить все необходимые программки, удостовериться, что они появились в списке установленных и со спокойной душой закрыть Маркет.
Можно приступать к обновлению самого ПО телефона (да, я знаю, что вообще-то делается наоборот). В этот раз LG Mobile Support Tool отрабатывает на ура, прошивка меняет свою букву в идентификаторе на актуальную. Для успокоения души прогоняется поиск обновлений еще раз, после чего эта самая душа офигевает, ибо найдено еще одно обновление. Ну что ж, как работает, например, WSUS, известно, некоторые обновки ставятся сугубо последовательно, так что ставь. LG Mobile Support Tool проверяет соединение с телефоном, после чего говорит, что данное обновление этим телефоном НЕ ПОДДЕРЖИВАЕТСЯ! Да твою ж... материнскую плату дважды!!! А хотя бы написать, что это за обновление, бывает? Нее, не бывает, вот вам ссылка на сайт LG - разбирайтесь сами. Сволочь. На это у меня уже сил не хватило.
В течение всех этих разборок рядом сидел товарищ, любитель яблочных огрызков, подкалывали друг друга, чтоб не так уж паршиво было. "А вот у нас в Секте...", "Да ну вас, у нас, робототехников, веселее". И все в таком духе.

Какие выводы можно сделать из всей этой истории? За всю свою жизнь у меня было два телефона, способные общаться с ПК. Это Benq-Siemens S68 (он лежит до сих пор, как резервный), и я считаю его идеальным для себя аппаратом; и Ведроид, который был взят из-за функционала. Я не жалею о том, что связался с Android, но вот такие казусы все же портят впечатлений от платформы. И тут уже даже не знаешь, это вина платформы или производителя самого устройства, в данном случае LG. Но по крайней мере я знал, что на Google-платформе такое возможно. А ведь есть еще огромное количество людей, которые берут андроидов только из-за того, что это массово, по принципу - у Васи есть, стало быть он крут, а я чем хуже. Люди, перед покупкой все же читайте материалы о том, что именно вы покупаете. Или все же порасспрашивайте знакомых знающих людей о плюсах и минусах такой покупки.
И еще одна претензия - это ПО для связи мобильника и ПК. Почти ни один из известных мне производителей (известных мне - читать как марки, прошедшие через мои руки) так и не смог написать вменяемое программное обеспечение для связи этих устройств в Windows. Почти. Единственный, кому это удалось (да, я знаю, что сейчас полетят помидоры) - это Microsoft. ActiveSync, конечно, тоже не без нареканий, но все они сводятся лишь к тому, что в случае возникновения ошибки по ее коду мало, что скажешь. Зато в процессе работы и настройки все просто супер. Лаконично, просто, понятно. Остальные же... куча мастеров, которые не нужны вовсе. Интерфейсы явно были написаны в состоянии измененного сознания (ну а как же без выпендрежа в наши-то дни, когда всем правит маркетинг). Да дьявол с ними, с интерфейсами, даже свою прямую обязанность: связь двух устройств, это самое ПО далеко не всегда выполняет так, как надо. Чего уж говорить обо всем остальном...

@музыка: Galaxion - Aftershock

@темы: Этот безумный мир, Android

We rise up for the things we believe in over and over again

Подкинули намедни интересную задачку. Есть папка. В папке кучка wav файлов, требуется узнать их общую длину. Да не ту длину, под которой в powershell понимают размер файлов на диске, а количество секунд. Немного блужданий по TechNet, и сценарий готов:

Add-Type -AssemblyName presentationCore
$mediaPlayer = New-Object system.windows.media.mediaplayer
$files = Get-ChildItem "e:\media\music\*.mp3"
$size = 0
foreach($file in $files) {
$mediaPlayer.open($file.fullname)
start-sleep -m 500
$size = $size + $mediaplayer.naturalduration.timespan.totalseconds
}
$size

Можно задать вопрос - а зачем введена команда start-sleep -m 500, ведь попахивает индийским кодом. Ответ не менее забавен, чем задачка - без этой задержки объект $mediaplayer просто не успевает прочитать свойства файла, и в итоге общая длина будет равна нулю, что нам абсолютно не нужно.
Обработка напильником в этом скрипте стандартная - в строке $files = Get-ChildItem "e:\media\music\*.mp3" нужно указать свой путь и маску файлов.

@музыка: Deus Ex: Human Revolution OST - Final Boss Theme

@темы: PowerShell, Scripting

We rise up for the things we believe in over and over again
Вот задумайтесь, какой самый большой почтовый ящик (электронная почта) вам приходилось в вашей жизни видеть? Вот что довелось узреть мне:

При условии, что число в третьем столбце - это не байты, а килобайты, становится страшно. А потом сотрудники удивляются, почему это Outlook начинает периодически показывать сообщение о том, что программа "пытается получить данные с сервера", и зависать.
Ах, да, мы же клиенто-ориентированная компания (просто клиентами для IT-отдела являются сами же сотрудники). Все для них, все ради них, все для их удобства. Если меня сейчас читает кто-то из руководящего состава какой-либо компании - мой вам совет: когда ваш системный администратор положит на стол проект по введению квот на почтовые ящики (если их еще нет), прислушайтесь к его словам. Это только по неопытности кажется, что предельные размеры ящиков - зло, на самом деле пользы от них намного больше, чем неудобства. Это не прихоть IT отдела, это суровая необходимость.
К слову сказать, после очистки от всего шлака, объем того ящика резко уменьшился до 1.2 Гб. Только вот на размер почтовой базы данных это не повлияет, к сожалению. Для уменьшения базы ее нужно дефрагментировать в offline-mode, а это полноее ее отключение где-то на полдня.

@музыка: Frank Borell - Wake Up in Paradise (Dream Spirit Mix)

@темы: Этот безумный мир, MS Exchange

We rise up for the things we believe in over and over again

Перепись всего серверного хозяйства. Эта процедура не давала мне покоя все то время, что я работаю. До текущего момента это был стандартный Excel-файл с кучкой листов. И конечно же, обновлялся он из рук вон плохо. В конце концов, это порядком поднадоело.
Составные части автоматической инвентаризации:
- MS Access в качестве базы данных. База будет довольно мелкой, а потому поднимать что-то большое для этих целей кажется пошлым.
- Powershell как исполняемый процесс.
- WMI как средство сбора данных.
- Группа серверов в AD.

Требования к системе:
1. Наличие провайдеров доступа к базе MS Access 2007. Проще всего выполняется путем установки самого MS Access 2007 на 32-разрядную машину. На 64-разрядной системе получим ошибку "Провайдер незарегистрирован, пожалуйста, переустановите его".
2. Наличие Powershell v.2 и набора Quest AD Management. Если используется Windows 2008 Server R2 - можно обойтись и без него, но в скрипте придется изменить одну строку.

Особо. В работе сценария сбора информации используются функции для работы с базой MS Access 2007, написанные Richard Siddaway - ссылка на его блог - Клац!.

О самом сценарии. Практически целиком он основан на командлете Get-WMIObject. Указав нужный класс и обратившись к определенному объекту внутри этого класса мы можем получить практически всю интересующую нас информацию о системе. В качестве примера можно привести вот такую часть самого скрипта:
get-wmiobject Win32_computerSystem -computername $srv.name | %{
$sysName=$_.Name
$sysManufacturer=$_.manufacturer
$sysModel=$_.model
}

Если попытаться перевести это на русский язык, получим следующее: извлечь данные из класса win32_computersystem (тут хранятся общие параметры компьютера), обратившись к компьютеру с именем, хранящемся в переменной $srv.name, в переменной $sysName сохранить его имя, в $sysManufacturer - фирму-производителя, в $sysModel - модель компьютера.
В дальнейшем эти параметры в числе других будут записаны в специально подготовленную для этого базу данных.
Похожим образом извлекаются и остальные параметры системы, коих довольно много.

Следующее. Поскольку сценарий достаточно велик, я не стал выкладывать его в открытом виде здесь, как поступаю обычно. Вместо этого все необходимые для инвентаризации файлы выложены на Google Docs - ссылка ниже:
Архив на Google Docs
Описание загружаемого файла: zip-архив GetServerInfo.zip, размер 50 910 байт.
Содержимое архива: скрипт db-functions.ps1 (библиотека функций для работы с MS Access 2007), скрипт GetInfo.ps1 (собственно, сам сценарий инвентаризации), база данных ServerDB.accdb - болванка базы данных. Именно в нее будут складываться полученные сведения.
Как использовать?
1. Распаковать содержимое архива в какой-нибудь каталог.
2. В файле GetInfo.ps1 исправить путь к файлу библиотеки (строка 5), и путь к базе данных (строка 8, изменить параметр -path)
3. Все Windows-серверы собрать в какую-нибудь группу в AD и прописать имя этой группы в строке 11, именно для нее нужен пакет Quest AD Management. При использовании родных средств управления Windows 2008 Server R2 нужно заменить командлет Get-QADComputer на Get-ADComputer с соответствующим изменением синтаксиса, а также закомментировать вызов оснастки Quest AD (строка 2).
На этом подготовка закончена.

Возможные проблемы. Да, куда же без них? Заключаются они в весьма странных наборах данных, которые отдаются скрипту через WMI. Например, на почти всех виртуальных серверах, крутящихся под esxi 3.5 (ОС самой виртуальной машины значения не имеет) вся оперативная память виртуальной машины размазывается по 4 банкам памяти, что приводит к следующим результатам:
банк 0 - 512 Мб
банк 1 - 256 Мб
банк 2 - 128 Мб
банк 3 - 112(!) Мб.
Почему так - я пока не разобрался. На железных машинах подобной проблемы не замечено.
Другая неясность - не все машины передают названия своих сетевых соединений, но это скорее проблемы конкретных машин.
Проблема базы данных. Абсолютно все поля базы имеют текстовый тип, что с точки зрения рационализации - не очень хорошо. Оставлять так или нет - решать вам. На просторах сети встречалось упоминание, что при работе через Powershell в MS Access можно записать данные только этого типа. Так это или нет, пока не проверял, но решил перестраховаться.

На этом все. Любые вопросы, дополнения, уточнения - приветствуются. Надеюсь, кому-то эта информация сможет сэкономить довольно много времени и сил.
P.S. Предвосхищая вопрос - а почему не использовать такие средства, как SCCM, MOM и другие? Ответ прост - бюджет компании. Он везде разный.

@музыка: Australis - Ephemerage

@темы: PowerShell, Scripting

We rise up for the things we believe in over and over again

Окончание истории, начатой тут. Как я и предполагал, процесс удаления файлов растянулся надолго. Аж на двое суток неторопливого выпиливания орды мелких, очень мелких файлов. MFT от такого поворота дел просто в ужасе была, поскольку вся эта мелочь явно хранилась прямо в ней. Статистика это подтверждает: на диске рабочей станции на 70 с небольшим тысяч файлов MFT заняла около 70 мегабайт, а вот на многострадальном файловике на те же 69 тысяч она уже разрослась аж до 4 Гб! Ясно, сильнейшая фрагментация после удаления всего мусора, с этим еще придется повозиться, но главное, работа антивируса, все же починено.

@музыка: E.S.Posthumus - Anumati

@темы: Viruses and Spam, Security

We rise up for the things we believe in over and over again

По непонятной причине стоящий на файлопомойке клиент корпоративного антивируса отцепился от управляющей консоли. Offline режим, и все тут. Принял решение его переустановить, хотя и помню об замечательной утилитке IpXfer, которая и нужна для переподключения клиента к другому серверу. Или тому же самому, как раз вот в таком случае.
Сказано, сделано, команда на удаление отдана. В процессе видно, что удаление происходит с ооочень большим скрипом, удаление служб продолжалось минут 15, на стадии удаления файлов система воткнулась еще на 40 минут. Все симптомы зависания. Делать нечего, распечатывается специальный документ, и пошагово проходим процедуру ручной очистки системы. В конце этого списка значится - reboot. Ясное дело, что боевой файловый сервер перезагрузить в течение рабочего дня никто не даст, значит, откладываем это дело до вечера, команду на рестарт можно отдать и из дому.
Перезагрузили. С радостным лицом поставили клиент заново и... поняли, что что-то пошло не совсем так, как надо.
"Все вышло не так, как ты планировал, Итэн..." (с) M:I:2
Вместо трех нужных служб в системе зарегистрированы только две. Более того, служба сканирования в реальном времени запускаться отказывается в принципе, ссылаясь на то, что ей нечего делать(!). И вспоминаем, что до повторной установки нужно было все же вынести старые каталоги антивируса. Дурная голова ногам рукам покоя не дает. Ладно, снова сносим антивирус, и ожидаемо получаем затык на стадии удаления файлов. Что ж, взглянем на этот процесс под микроскопом, то есть Process Monitor'ом, по критерию:
Process Name is NTRMV.EXE
Результат следующий - данный процесс вовсю елозит по папке C:\Program Files\Trend Micro\Office Scan Client\Hlog, открывает файл, пишет в него, закрывает.
Что ж это за логи такие? Залезаем в папку проводником и получаем зависший проводник. Снять процесс, попробовать пролезть другим шеллом. Получаем то же самое. Ладно, расчитай мне размер этой папки. Explorer.exe уходит в подсчеты, отгребает на себя гигабайт оперативной памяти, но результат удручает - найдено 0 объектов. К слову сказать, ни TC, ни cmd в этом плане тоже не отличились. Что же делать? Это логи, они находятся в папке, которая полностью предполагается к сносу. Их надо снести. Прпробуем метод, который меня еще не подводил:
cmd
cd c:\program files\trend micro\officescan client
del /f/s/q hlog\*.*
После минутного раздумья шел все же начал удалять все то, что там было. Тогда я еще не знал, сколько там всего.
Через минут 20 этого терзания диска я остановил процесс и попробовал снова зайти туда проводником. Увиденное повергло меня в шок. Проводник все же смог показать часть этого каталога: 300000 объектов, каждый размером меньше килобайта. И это - еще не весь каталог. Ну что же, повторный запуск удаления всего и вся через командную строку и ждать результатов. Это надолго...
P.S. Поймал себя на мысли, что это уже не первые боевые действия с данным антивирусом. Связка Trend Micro и Symantec Backup Exec уже показала себя во всей красе.

@музыка: KOTO - Die Klapperschlange

@темы: Этот безумный мир, Viruses and Spam, Security

We rise up for the things we believe in over and over again

Наверняка каждый системный администратор сталкивался с задачей - вынуть да положить руководству на стол информацию о том, кто стер какой-либо очень нужный файл с сетевого хранилища. Почти все знают, как включить аудит событий файловой системы. Если кто-то не знает, очень рекомендую ознакомиться вот с этой статьей: How do I enable auditing on certain files/directories? - это очень просто и быстро.
После включения аудита в логе безопасности файлового сервера станут появляться события о работе с файловой системой. Вот как, например, выглядит запись о запросе на удаление какого-либо файла:


В этом сообщении видно все, что нам нужно для отчета. Единственная проблема заключается в том, что в логе безопасности сообщений будет огромное количество. И среди всего этого вороха данных нам нужно будет как-то отыскать нужную информацию. Известно, что все логи сервера - это файлы, значит, нужно каким-то образом в автоматическом режиме прочитать файл лога, вытащить оттуда записи согласно определенным критериям, и этот комплект записей выложить на стол руководству. Осталось лишь найти инструмент, которым можно этого добиться. Он есть, называется LogParser, взять можно вот здесь: LogParser @ Microsoft.com.
Инструмент этот относится к разряду CLI-утилит - вся работа осуществляется при помощи командной строки. В разборе того, что и куда вводить, чтобы прочитать нужные данные, мне очень сильно помогла вот эта страница: Log Parser - The "Swiss Army Knife" for Intrusion Investigators and Computer Forensics Examiners. По прочтению и пониманию материала был сформирован следующий ярлык вызова утилиты:


А в качестве содержимого файла запроса DeleteEvents.sql используется следующее:

Да, это самый обычный SQL запрос. Допустим, меня очень сильно интересовало, какой нехороший человек стер мой любимый файлик, называвшийся "тест.txt". Вводим запрос, нажимаем Enter, и в ответ получаем красивую табличку вот такого вида:

Откуда видим, что нахала, стершего файл, зовут user01, принадлежит он к домену TEST. И файл был стерт сегодня. Что ж, задача выполнена, мерзавец найден. Дальше уже пусть руководство разбирается, что с user01 делать и какие санкции к нему применять.

P.S. Все вышеописанное справедливо для Windows 2008 Server. В версии 2003 формат записей в логе безопасности был иным, поэтому файл sql запроса скорее всего нужно будет серьезно менять.
P.P.S. Небольшая хохма на десерт. Существуют платные решения из сферы аудита, одно из таких я сегодня захотел попробовать: sсript Logic File System Audit. Как всегда при запросе пробной версии нужно заполнить простыню. Ок, давайте, посмотрим, что и куда писать надо. Вот кусок этой простыни:

Ничего более подходящего, чем Вооруженные силы Европы я там не нашел. А что, хорошая страна ведь ;)

P.P.P.S. Окинул запись взглядом анонимного пользователя - ГРАФИЧЕСКИЕ СМАЙЛЫ! УБЕЙТЕ СЕБЯ О СТЕНУ В КРОВАВЫЕ ОШМЕТКИ!!!

@музыка: KOTO - Die Klapperschlange

@темы: Security

22:09

PCI DSS

We rise up for the things we believe in over and over again

Original @ ServerFault.com.
Перевод истории на Хабрахабре.
Читать всем, даже если вы не имеете никакого отношения к аудиту платежных систем и процессинговых центров. Это феерия.

@темы: Этот безумный мир, Security

We rise up for the things we believe in over and over again

Захотелось посмотреть, а у кого и куда стоит перенаправление почтовых писем в AD. И заодно подсчитать количество таких записей. Компоненты этого скрипта известны - get-qaduser, конвейеры, оператор вывода write-host. Основная сложность в том, что ключевой параметр altrecipient, в котором и хранится информация о цели перенаправления почты, в конвейер просто так не выводится, на выходе получаем пустые значения. Немного поковырявшись в справке по командлету get-qaduser находим ключ -IncludeAllProperties. Данный параметр заставляет команду get-qaduser выбрать из AD всю информацию о пользователе, по-умолчанию этого не происходит. Вторая сложность - по конвейеру нельзя передать конструкцию вида $_.altrecipient оператору write-host. Следовательно, приходится сначала упаковывать требуемые нам значения в переменные, а потом через write-host выводить на экран значения этих переменных. Одновременно в цикле можем подсчитать, сколько таких пользователей нашлось.
Суммируя всю эту информацию, скрипт принимает следующий вид:
get-qaduser -includeallproperties -oa @{altrecipient='*'} | %{$name = $_.name;$alt=$_.altrecipient;$i=$i+1;write-host $name" -> "$alt};write-host $i;$i=0

@музыка: Faun - Iduna

@темы: PowerShell, MS Exchange

We rise up for the things we believe in over and over again
Если в нескольких словах - понедельник вышел жестким.
Вводная - прийти на работу, зная, что висит одна из виртуальных машин (несчастный линукс на CentOS), на пинг не отзывается, бекап с нее, соответственно, не идет. Рестарт и можно спокойно разбираться, что не так. Раньше, чем успел послать ей команду перезапуска М. произносит: "Странно, к коммуникатору не могу подцепиться..." (Коммуникатор = Office Communications Server).
- Да ну нафиг! не знаю ничего про коммуникатор, знаю только про зависшее "зеркало" (та самая виртуальная машина).
Открыть VI Client, окинуть взглядом список машин, убедиться, что все в статусе Running, перейти в консоль коммуникатора, и охренеть на месте:
Virtual machine config file does not exist
Так, стоп. Машина есть, она зарегистрирована, она запущена. Так как же? Тыкаюсь в то самое "зеркало" - перехожу на ее консоль, и получаю абсолютно то же сообщение. ОК, берем наугад третью машину, переключаемся в ее консоль, заранее зная, что получим в ответ. Остается последнее: выбрать хост esxi, перейти на вкладку конфигурации, щелкнуть Storage. Формально все на месте. Видна арена, два раздела. Нажать Rescan и подтвердить худшие опасения - СХД с виртуальными машинами не видна вообще.
Надо сказать - это финиш. Бегом в серверную, открыть дверь, и понять, что же на самом деле не так. А все банально - в серверной жарковато.
Чуть позже подтянулись еще люди, от которых и узнали мы, что в воскресенье тут в очередной раз возникла нештатная ситуация с системой охлаждения и с электропитанием. Последнее наши "железные кони" выдержали - UPSы вытянули их. А вот отсутствие охлаждения - это труба. СХД, державшая на себе весь "запас" виртуальных машин, не выдержала перегрева и "замкнулась в себе", перестав отвечать на любые запросы по любым интерфейсам. В том числе и по Fiber Channel.
Делать нечего. Рестарт СХД. Долгих несколько минут, после чего Rescan на хосте esxi. СХД послушно появилась на месте, хост снова увидел все нужные разделы. Поочередный рестарт всех виртуальных машин, и работа нормализована.
Дальнейшее уже не столь интересно - ревизия бекапов (на всякий случай), да просто огромные волны ненависти в адрес администрации бизнес-центра.

@музыка: Corvus Corax - Avanti, Najo Ratte

@темы: Этот безумный мир

We rise up for the things we believe in over and over again

Нет слов. Просто нет.
История коротка - ноут, проверка на непрошенное зверье. Результаты ниже.
1. Лог задания:


2. Окончательный вердикт при попытке закрыть сам KVRT:

Вопрос - ГДЕ зараза?
Я все понимаю, денег хочется всем. Но мне это до боли напомнило принцип работы так называемых Fake-AV программ.

@музыка: Chrono Cross OST - Shadows and Forest

@темы: Viruses and Spam, Kaspersky Lab

We rise up for the things we believe in over and over again

UPDATE 19-07-2011:Тестирование скриптов на рабочей машине с установленной Windows XP показало, что сценарий очень плохо воспринимает пробелы, которые появляются в именах файлов при развертывании переменной %userprofile%. Выходом является заключение конструкции %userprofile%\filename.txt в кавычки. В тексте записи сценарии исправлены.

UPDATE 16-07-2011 #2: Учитывая, что на некоторых машинах наблюдались проблемы с запуском новой версии утилиты (см. здесь) - ниже выложен модифицированный скрипт для закачки старой, девятой версии KVRT (на сервере его инсталляторы лежат в отдельной папке) - Download KVRT version 9.cmd

UPDATE 16-07-2011: В связи с обновлением KVRT, введением формы загрузки и сменой структуры папок на сервере Kaspersky Lab пришлось немного модифицировать скрипт, чтобы вновь привести его в работоспособное состояние. Изменения выделены жирным шрифтом.

Оригинальная запись:
KVRT - весьма полезный инструмент, с которым довелось вылечить уже немало систем. И Винлоков, и простых файловых вирусов, и трояснов. Но есть у него один недостаток - он не умеет обновляться автоматом. Этот функционал в него специально не закладывался. Он не видит сети, не видит никаких других источников обновленных антивирусных баз, даже намека на кнопочку "обновить" нет. Это сугубо сканер-по-требованию.
Но тем не менее, обновлять его базы все же надо. Делается это выкачкой новой версии утилитки. Каждый раз открывать браузер, щелкать на закладку на ресурс devbuilds.kaspersky-labs.com/devbuilds/AVPTool/, затем подтверждать сохранение файла. Долгое время так и делал. Наконец, мне это надоело. Антивирус (пусть даже такой специфичный) все же должен обновляться регулярно, а не как бог на душу положит. Поэтому командную строку в зубы, гугль в помощь, и вперед.

Вводные данные: папка для сохранения новой версии утилиты - j:\software\kvrt (на флешке), утилита сохраняется под тем же именем, под каким лежит на сайте.
А теперь сам скрипт: Download KVRT.cmd

Как всегда, скрипт требует маленькой доработки напильником. В нем нужно заменить тот самый каталог j:\software\kvrt на то, куда требуется загружать новую версию программы. И еще одно замечание - блок REM check if target KVRT folder exist. Его назначение - проверить, а существует ли тот самый целевой каталог. Если его нет (читать - нет флешки) - не выполнять ничего, так как бессмысленно. Существование каталога я проверяю на уровне самой флешки. Если она есть, значит есть и каталог.
Что можно сделать с этим скриптом? Варианты использования ограничены лишь фантазией. Лично у меня он прицеплен в Планировщик задач, запускается в момент захода моего пользователя в систему или каждый день в 8:30 утра (на случай, если компьютер проработал всю ночь).

@музыка: Nobuo Uematsu - Beyond the Wasteland

@темы: Viruses and Spam, Scripting, Kaspersky Lab

We rise up for the things we believe in over and over again
Программирование без goto - Клац!
Я не случайно начал эту запись со ссылки на один из холиваров мира программирования - стоит ли использовать оператор goto при построении кода? Сам стараюсь его не употреблять ни в каком виде, благо, средств проверки условий и переходов по результату проверки достаточно. Но не в этот раз.
Довелось сегодня править код формы в этом самом UMRA. Форма работала, но после перегруппировки каталогов Active Directory работоспособность резко упала до нуля ;) Ожидаемый результат, который надо исправлять. Чем и занялся.
Итак, что представляет из себя редактор кода в этой консоли? Это достаточно прямолинейный список из заранее подготовленных команд, которые можно передать службе UmraSvc, и она уже будет их выполнять. Команд не так уж много, но и немало. Даже конструкция if... then... else поддерживается, которую я очень активно собирался использовать. Не тут-то было! Да, этот заранее заготовленный блок может проверять довольно много параметров (хотя и там нашлось, к чему придраться), но в качестве действий после проверки условия можно назначить только одно единственное! Угадайте, какое именно. Правильно - пресловутый goto!
Представить все это "великолепие" в виде псевдокода можно следующим образом:

variable1 = 5
if variable1 < 10 then goto label1 else goto label2
label1: action1
goto end
label2: action2
goto end
end:

И вот таким макаром проверять кучу условий. Повторюсь, в блоке then кроме тупого перехода к метке поставить ничего нельзя, вообще. Все дело в том, что код формы редактируется не в виде исходного кода как такового, где где угодно можно записать что угодно, а через самый что ни на есть GUI - отдельная формочка для ввода всех параметров блока if... then... else. Одним словом - такого кошмара я давно не встречал, если встречал где-то вообще.
Код этой несчастной формы в итоге был выправлен, но времени на отладку в итоге ушло куда больше, чем планировалось.
И на вкусное. Механизм проверки условий UMRA, как выяснилось, совершенно не может проверить какое-либо поле формы на непустое значение. На пустое - пожалуйста, можно выбрать тип проверки null or not present, но вот not null там не поставишь. Пришлось изгаляться с вариантом if var is null then end else blah-blah-blah. Тоже не добавило радости, если честно.

@музыка: Ryan Farish - Perfect Clarity

@темы: Этот безумный мир, Scripting