воскресенье, 14 января 2018 г.

Этот диск прожил долгую и трудную жизнь


Этот диск прожил долгую и трудную жизнь. Но пришло и его время. Теперь разве что в качестве зеркальца его использовать. Правда, у меня такое уже есть, а больше никому не надо. Люди предпочитают обычные зеркала. Почему-то...
via Instagram http://ift.tt/2AQvzCH

пятница, 16 июня 2017 г.

Программисты, зачем вы так?

Или это я чего-то не понимаю, или таки в консерватории что-то не так. Но я в любом случае не понимаю.

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

Ну так вот, установил я на домашний комп программу Homebank. Для Linux, версия 4.5.5. Занёс туда свои доходы/расходы. А на следующий день поставил эту программку ещё и на работе, чтобы сразу же, оперативно заносить туда данные, дабы не забыть ничего. Файл данных синхронизируется через Dropbox, всё хорошо. Казалось бы.

А сегодня вечером мне домашняя версия Homebank и говорит человеческим голосом, что не может открыть файл данных, так как он создан в более новой версии программы. Опаньки? Опаньки. Оказывается, версия для Windows имеет номер уже 5.1.5 и формат данных там как бы другой, несовместимый со старым. И в ЧаВо (в оригинале FAQ) написано, что если вы не хотите иметь проблем, то имейте везде новейшую версию программы. Не, я не против, только где ж её взять для моей Убунточки, новейшую-то? Разве что из исходников собрать, но это как-то фу.

Но самое забавное выяснилось вот буквально только что. Оказывается, что данные сохраняются в XML-формате. Это почти обычный текстовый файл, но с дополнительной разметкой. В общем, его может прочитать и понять не только программа, но и человек. И там в самом начале написано про версию программы буквально следующее: <homebank v="1.2" d="050105">

А в старом, который я уже создал с горя, думая, что придётся снова всё заполнять, написано так: <homebank v="0.69999999999999996">

Стоило поменять эту строчку, как всё заработало. Ну и вот нафига это было делать?

четверг, 8 июня 2017 г.

Автоматический костыль для Thunderbird

Вообще почтовыми клиентами я пользуюсь исключительно на работе. По разным причинам. Одна из причин - есть у меня маленький, но гордый локальный почтовый сервер, который нужен, чтобы разные скрипты могли отправлять мне уведомления о результатах своей работы. В качестве клиента использую известный многим Mozilla Thunderbird. И вот с этим Thunderbird-ом стали происходить какие-то странные вещи. Иногда бывает, что хочешь удалить письмо, а оно не удаляется! Как так?! Оказывается, по непонятным причинам пропадает файл Trash, в котором, собственно, и должны храниться удалённые сообщения. Ну вот пропадает и всё тут. В принципе, достаточно закрыть Thunderbird, создать в нужном месте этот файл и снова запустить почтовик. Но это же каждый раз нужно руками найти этот нужный каталог, создать там файл... В общем, я написал скрипт, который делает это всё сам, по расписанию в планировщике. Утром, за пару минут до начала рабочего дня, планировщик запускает мой скриптик, который проверяет существование файла Trash, при необходимости - создаёт.


@ECHO OFF

IF NOT EXIST "d:\home\user\Thunderbird\Profiles\kpya8y83.default\Mail\mail.mydomain.ru\Trash" (
   TYPE nul > "d:\home\user\Thunderbird\Profiles\kpya8y83.default\Mail\mail.mydomain.ru\Trash"
   ECHO =====================================  >> %~dp0\create_trash.log
   ECHO File "Trash" successfully created at >> %~dp0\create_trash.log
   DATE /t  >> %~dp0\create_trash.log
   TIME /t  >> %~dp0\create_trash.log
   )

IF "%1" == "" GOTO END

START "" "C:\Program Files (x86)\Mozilla Thunderbird\thunderbird.exe"
   
:END

Но если вдруг случилось так, что "Удалённые" пропадут в процессе работы, то можно запустить скрипт вручную (у меня есть средство для быстрого запуска нужных программ, долго искать не придётся), с параметром START (на самом деле - просто с параметром), тогда после создания файла Trash снова запустится Thunderbird, и можно будет продолжить работу.

Я чёртов гений! :-)

четверг, 6 апреля 2017 г.

Скрипт для сбора информации о компьютере

Немного воды


Для понимания на чём же у нас работают люди неплохо бы иметь информацию о "железе" и кое-каких других данных с компьютеров пользователей. Чтобы не лазить на каждый комп Radmin-ом и не отвлекать пользователей от работы, можно воспользоваться утилитами командной строки.
К сожалению, работает только на Windows XP и Windows Server 2003. Для Windows 7 на целевом компьютере нужно совершать дополнительные действия, то есть всё равно лезть Radmin-ом, т.е. весь смысл затеи теряется.

Необходимое ПО


Кроме собственно скриптов нужно следующее ПО:
  • Утилита CPU-Z. Можно взять на любимом файл-сервере. Или на сайте разработчика: http://www.cpuid.com/softwares/cpu-z.html Работает без установки, просто распаковать в любимый каталог.
    ВАЖНО! В файле cpuz.ini нужно изменить параметр CheckUpdates=0. Если будет стоять 1, то утилита полезет проверять обновления, будет спрашивать всякое, и ничего не получится.
  • Утилита PsExec из комплекта SysinternalsSuite. Также можно взять на любимом файл-сервере. Или на сайте разработчика: https://technet.microsoft.com/ru-ru/library/bb545021.aspx Работает без установки, просто распаковать в любимый каталог.

Структура каталогов



  • d:\Programs\cmd\inventory\
    • inventory.cmd
    • cpu-z\
      • cpuz.ini
      • cpuz_readme.txt
      • cpuz_x32.exe
      • cpuz_x64.exe
      • sysinfo.cmd

SysinternalsSuite в этой структуре не обязательно, путь к утилите PsExec указывается в скрипте.

Параметры запуска


На локальной машине запускается файл inventory.cmd с параметром - IP-адрес целевого компьютера, т.е. того, с которого будем собирать информацию:
inventory.cmd 192.168.0.1
Без передаваемого параметра скрипт не запустится.

Скрипты


inventory.cmd


@ECHO OFF

REM Проверяем на отсутствие IP. Без этого параметра скрипт не работает
IF "%1" EQU "" (
ECHO Нужно ввести IP компьютера
GOTO END
)

REM Установка переменных
SETLOCAL
REM Буква, на которую будет назначен сетевой диск
SET NET_DRIVE=T:
REM Откуда брать CPU-Z для копирования на целевой компьютер
SET CPUZ="d:\Programs\cmd\inventory\cpu-z"
REM Где лежит PsExec
SET PSEXEC="d:\Programs\SysinternalsSuite\PsExec.exe"

REM Собственно, скрипт

REM Подключаем диск C: на целевом компьютере как сетевой диск
NET USE %NET_DRIVE% \\%1\c$ /user:Администратор password /persistent:no

REM Создаём на целевом компьютере каталог, в котором будет работать скрипт, собирающий сведения
IF NOT EXIST %NET_DRIVE%\INVENTORY\nul MD %NET_DRIVE%\INVENTORY
IF NOT EXIST %NET_DRIVE%\INVENTORY\cpu-z\nul MD %NET_DRIVE%\INVENTORY\cpu-z

REM Копируем на целевой компьютер каталог с утилитой CPU-Z и скриптом, собирающим сведения
XCOPY /E %CPUZ% %NET_DRIVE%\INVENTORY\cpu-z

REM С помощью утилиты PsExec запускаем на целевом компьютере скрипт, собирающий сведения
%PSEXEC% \\%1 -u Администратор -p password cmd /c c:\Inventory\cpu-z\sysinfo.cmd

REM Удаляем следы присутствия на целевом компьютере
%PSEXEC% \\%1 -u Администратор -p password cmd /c RD /S /Q C:\inventory

REM После завершения работы отключаем сетевой диск
NET USE %NET_DRIVE% /d /y

REM Подключаем как сетевой диск каталог на файловом сервере с результатом работы
NET USE I: \\192.168.0.10\temp\inventory /user:username userpassword /persistent:no
START explorer I:\

:END


  • Скрипт должен быть в кодировке OEM866 (DOS), иначе не будут распознаны кириллические символы, например, "Администратор".
  • Скрипт создаёт на целевом компьютере, на диске C:, необходимую структуру каталогов, копирует туда утилиту CPU-Z и скрипт sysinfo.cmd.
  • Затем с помощью утилиты PsExec запускает на целевом компьютере скрипт sysinfo.cmd.
  • Результаты работы скрипта sysinfo.cmd сохраняются на файл-сервер.
  • После завершения скрипта sysinfo.cmd на целевом компьютере удаляется созданная структура каталогов.
  • Подключается сетевым диском каталог на файл-сервере с результатами работы скрипта sysinfo.cmd и открывается Explorer с этим каталогом.

sysinfo.cmd


@ECHO OFF

REM Подключаем как сетевой диск каталог на файл-сервере для сохранения результатов работы
NET USE Z: \\192.168.0.10\temp\inventory /user:username userpassword /persistent:no

REM Запускаем CPU-Z в режиме без GUI, зато с сохранением результатов в файл
REM В качестве имени файла используется имя компьютера из системной переменной %COMPUTERNAME%
%~dp0\cpuz_x32.exe -txt=Z:\%COMPUTERNAME%

REM Недостающую информацию даст встроенная в Windows команда systeminfo
systeminfo >> Z:\%COMPUTERNAME%.txt

REM А эти команды помогут понять есть ли у пользователя права локального администратора
net localgroup Администраторы >> Z:\%COMPUTERNAME%.txt
net localgroup Пользователи >> Z:\%COMPUTERNAME%.txt

REM Отключаем сетевой диск
NET USE Z: /d /y

:END


  • Скрипт должен быть в кодировке OEM866 (DOS), иначе не будут распознаны кириллические символы, например, "Администратор".
  • Что именно делает скрипт подробно написано в комментариях в теле скрипта.

четверг, 30 марта 2017 г.

А вот не надо было умничать!

Вредно быть слишком умным :-(

Вернее, вредно быть шибко умным, но при этом невнимательным.

Это я опять про себя. Вчера убил почти целый день на разборки с брандмауэром Windows. Ни в какую он не хотел пропускать через себя сетевой сканер! Есть у нас в конторе один модный поточный сканер, а к нему модуль сканирования по сети. Можно сканирование запускать с компьютера, с помощью специальной программы, а можно нажатием кнопочки на этом модуле. Вот только как только я включаю брандмауэр, так сканирование по кнопке перестаёт работать! Из программы работает, а напрямую со сканера - нет.

Я уж и так, и эдак, Интернет весь перелопатил, и правила всякие создавал - ничего не помогает! Сегодня с утра со свежими силами пришёл снова разбираться с этой проблемой. И что вы думаете оказалось? Оказалось, что сеть этого компьютера почему-то числилась как "Общественная"! Всего-то нужно было переназначить сеть из общественной в рабочую, чтобы всё стало хорошо.

Отсюда вывод: надо быть внимательным. А не только умным. Не умничать, а присматриваться к мелочам и настройкам.

Такие дела.

среда, 12 октября 2016 г.

Бэкап данных средствами Windows, с использованием .cmd скриптов и архиватора

Системные администраторы делятся на тех, кто не делает бэкапы, и тех, кто УЖЕ делает...


Я хоть и "бессистемный" администратор, но бэкапом данных озадачен. На настоящие enterprise-решения у нас не хватает ни денег, ни знаний, ни времени, чтобы разобраться, поэтому "велосипедим" из того, что под руку попадётся. Скрипты для бэкапа я сочинил уже довольно давно, но периодически к ним возвращаюсь - что-то переделываю, исправляю ошибки. Веду работу над продуктом, как будто я настоящий программист :-)

Не так давно вылезла очередная проблема с моей системой бэкапа - слишком большие объёмы данных по сети гоняются. Полез разбираться, почему же так происходит. Оказалось, сам виноват, не думал, как компьютер, когда писал. У меня архивы делал программа nnBackup, которая очень хорошая, если делать бэкапы на локальный диск. Она сама умеет их нумеровать, хранит столько пронумерованных копий, сколько скажешь, лишние сама же и удаляет. И вот как раз здесь собака и порылась - у меня на сервер каждый день копировались ВСЕ архивы. А я думал, что будет только один, самый новый. Говорю же - думал, как человек, а не как компьютер.

Поэтому на днях взялся всё переписывать по новой, выкинул nnBackup, оставил простой архиватор 7zip. Архивы теперь не нумеруются, просто в имени записывается дата и время создания архива. Пришлось придумать как удалять старые архивы, оставляя только определённое количество. В общем, было достаточно увлекательно.

Вчера утром избавился от последней критческой ошибки, гонял всячески на виртуальной машине с тренировочным сервером внутри. Попутно дописал ещё несколько мелочей. Чувствую себя прям программистом :-)

Результат, чтобы не потерялся, выложил на свой собственный вики-сайт, пусть будет. Мало ли, вдруг пригодится где в другом месте. Или кому-нибудь другому.

четверг, 18 августа 2016 г.

Отложенный запуск программ в Windows

Вчера мой перегретый мозг выдал идею - а нельзя ли написать небольшой скрипт, который бы с заданным интервалом запускал программы из списка? Потому что когда пихаешь в автозагрузку штук пять-семь программ, да ещё на не новом, мягко говоря, компьютере, то всё получается грустно. Машинка пыхтит, греется процессором, скрипит жёстким диском и тупит в десять раз больше обычного. А если всё то же самое запускать по очереди, то, может, оно лучше будет? Решил попробовать.

Можно, конечно, сделать, что называется, в лоб. То есть прямо в скрипте поочерёдно вызывать нужные программы, вставляя между ними требуемую задержку. Но так же не интересно.

Поэтому решил, что нужно разнести программную и конфигурационную части по разным файлам. Как будто я настоящий программист, а не .cmd файл в винде пишу :-)

Задуманное у меня получилось совсем не сразу, поскольку "я же не настоящий сварщик". Но получилось.

Итак, в файлик, скажем, app_list.txt пишем как-то так:

10;"C:\Program Files\7-Zip\7zFM.exe"
20;"C:\Program Files\IrfanView\i_view64.exe"


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

Сам скрипт тоже не очень большой:

@ECHO OFF

SETLOCAL
SET APP_LIST=%~dp0\app_list.txt


FOR /F "tokens=1,2 delims=;" %%i in (%APP_LIST%) DO (
ping -n %%i 127.0.0.1 2>&1>NUL
START "" %%j
)

:END


Три строчки.

Первая строка в цикле читает из файла конфигурации параметры. ключ "tokens=1,2" говорит, что из каждой строки выбирается две подстроки. Ключ "delims=;" говорит, что разделителем подстрок служит точка с запятой.

Вторая строчка служит для задержки перед запуском программы из списка. Пингует localhost столько раз, сколько указано в строке конфигурации, до точки с запятой. Каждый пинг - примерно секунда. Так что можно считать, что задержку указываем в секундах.

Третья строчка, собственно, запускает программу.

И так в цикле пробегается весь список. Красота нечеловеческая! :-)

И вот что хочется сказать напоследок. Для подобной задачи, сделать отложенный запуск программ, которая делается в несколько строчек на встроенном скриптовом языке Windows, пишутся специальные утилиты! Ну, например, Startup Delayer. Там, конечно, интерфейс, кнопочки, все дела... Но ТРИ СТРОЧКИ .cmd файла!