суббота, 22 ноября 2008 г.

Интеграция GERMES и WinScript

Сегодня выходит новая версия нашего продукта для автоматизированной передачи файлов через локальную сеть/интернет GERMES.

Продукт "заточен" именно под передачу/приём файлов и не обладает возможностью обработки полученных файлов. Все действия по постобработке необходимо выполнять вручную, в BAT либо CMD файлах, используя наш продукт WinScript или же сторонние скриптовые языки/технологии.

Особенно это актуально в банках, где движение файлов очень интенсивное (например, в системах "Клиент-Банк") и есть необходимость надёжной маршрутизации файлов, логгирования и прочего.

Также GERMES применяется для организации систем резервного копирования, однако выполняет лишь функцию непосредственной передачи данных и их синхронизации.

Поэтому принято решение следующую версию GERMES (после 4.1) оснастить возможностью выполнения любых скриптов как на стороне клиента, так и сервера.

Новые версии WinScript и в дальнейшем будут выходить как отдельным продуктом, так и в составе нашего файлового агента GERMES.

воскресенье, 2 ноября 2008 г.

WinScript 1.4.0.15

Вышла свежая версия нашего скриптового движка. Реализовано всё то, что было обещано, кроме работы с хард- и симлинками :)

Исправлены найденные ошибки. Скачать новую версию WinScript >>.

понедельник, 20 октября 2008 г.

Работа с hardlinks и symlinks

В Windows, при использовании файловой системы NTFS, можно делать так называемые хардлинки и симлинки. Постараюсь пояснить, что это такое.

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

Чтобы решить проблему, нужно либо переписать скрипт с учётом новой структуры каталогов, либо сделать так, чтобы он "не заметил" никаких изменений.

Есть консольная команда SUBST, которая позволяет привязать к букве диска любой каталог на любом диске. Но если нам хочется гибкости, то придётся использовать линки. Люди из мира UNIX очень часто пользуются этой возможностью, в Windows эта технология применяется не так широко.

Линк - это ссылка на файл либо каталог. Скажем, каталог - "C:\MyDocs\", а симлинк на него - "C:\MyLinks\Docs\". Для программ нет никакой разницы, к какому пути обращаться. Если мы удалим файлы из "C:\MyLinks\Docs\" - это моментально отразится в исходном "C:\MyDocs\".

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

Есть ещё и хардлинки - они, в отличие от симлинков, могут указывать только на файлы. Основное отличие от хардлинков в Linux то, что при удалении хардлинка исходный файл не удаляется. В остальном - тот же симлинк.

В новой версии WinScript будет поддержка создания хардлинков и симлинков. Экспериментируйте, буду ждать замечаний и предложений.

среда, 24 сентября 2008 г.

Что нового планируется в следующей версии WinScript

В готовящемся обновлении WinScript добавлены новые функции, которые реализуют весьма интересный функционал. В релизе, скорее всего, будут ещё некоторые изменения, но хочется остановиться именно на этих функциях немного подробнее.

  1. procedure SetLedState(KeyCode:byte;OnOff:boolean). Процедура, с помощью которой можно зажигать и гасить индикаторы NumLock, CapsLock и ScrollLock программно. Например, вызов SetLedState(1,true) включит NumLock, а SetLedState(2,false) погасит CapsLock.
  2. function SumToString(value:string;valute:byte):string. Функция, которая преобразовывает сумму в строку прописью. Например, вызов SumToString(10387652.02,1) вернёт строку "десять миллионов триста восемьдесят семь тысяч шестьсот пятьдесят два доллара 02 цента". Поддерживаются пока две валюты: доллар и рубль. Максимальная сумма - 999 999 999. Нужно будет больше либо есть необходимость в других валютах - пишите, добавим. Также имеется функция для преобразования числа в строку прописью (т.е. без валют и дробной части - просто число). Ограничения на размерность числа - то же.
  3. function SetScreenResolution(PelsWidth,PelsHeight,BitsPerPixel,DisplayFrequency:integer):boolean. Эта функция автоматически выставляет разрешение экрана на заданное. Указываем размер экрана в точках по вертикали, горизонтали и цветность - и всё. Если монитор TFT - то последний параметр устанавливаем в ноль. Функция очень эффективна, если нужна автоматизированно выставлять определённое разрешение для разных задач. Скажем, для работы в AutoCad - максимальное разрешение, для игр - 800х600х24bit. Если попытка была неудачной - функция вернёт false.
  4. procedure SendKeys(Buffer,WndCaption:string). Крайне полезная функция для взаимодействия с приложениями Windows. Суть ее в следующем: выбранному приложению посылаются наборы комбинаций клавиш, приложение реагирует на них и выполняет какие-либо функции, как будто бы мы действительно нажимали что-либо на клавиатуре, управляя этим приложением. Получаем возможность создания макросов произвольной сложности для управления теми программами, которые как бы и не предусматривают такого поведения с собой :) В примерах к дистрибутиву будут приложены варианты работы с Блокнотом, Калькулятором и некоторыми другими распространёнными Windows-приложениями.

понедельник, 1 сентября 2008 г.

Обновление WinScript - версия 1.2.0.13

Сегодня вышла новая версия скриптового движка WinScript. Добавлена пачка функций для работы с системным реестром. Также можно управлять реестром компьютеров удалённо, по сети.

Чувствую, пора писать серию статей по использованию скриптового движка, а то что-то активности сисадминов никакой не чувствуется :)

http://www.nsoft-s.com/downloadwinscript.html

Avira Antivir VS WinScript

В нашем корпоративном блоге писалось о том, что антивирус Avira Antivir неадекватно реагирует на WinScript. Как выяснилось, корень проблемы в том, что эвристик антивируса ошибается из-за того, что exe-файл скриптового движка WinScript ws.exe сжат упаковщиком UPX. Достаточно распаковать программу и проблема отпадает.

Командная строка для распаковки: upx.exe -d ws.exe

вторник, 26 августа 2008 г.

Что же будет в следующей версии?

Готовится к выходу новая версия WinScript.

Что добавлено или улучшено?

функция StrConvert для перевода текстовых строк из одной кодировки в другую;
процедура MsgBox для показа стандартных информационных окон Windows;
процедура SaveScreenToBMP - сохранение экрана в BMP файл;
процедура XDelFolder для удаления каталога со всем содержимым (подпапки, файлы);
функция ExecuteEx - расширенный запуск приложений изнутри скриптов;
функция DatesDelta - вычисление разницы в днях для двух указанных дат (день, месяц, год);
функции FileSetAttr и FileGetAttr для установки и чтения атрибутов файлов;
функции GetWinScriptVer и GetWinScriptReleaseDate для получения версии скрипт-машины WinScript и даты её сборки;
функция GetIdleTime для определения времени простоя системы;
функция LockWorkstation - блокировка пользовательской сессии;
функция GetCmdLineParameters для получения параметров, которые были переданы скрипту прямо из командной строки;
процедуры ScriptSleep и ScriptIdle - для возможности сделать паузу во время выполнения или пропуска тиков процессора во время работы скрипта;
значительное количество новых примеров (папка "\examples").

Список исправленных ошибок:

ошибка в функции GetTextFileLinesCount. Функция возвращала неверное значение, если файл был пуст;
функции DeleteFile и DeleteFiles теперь корректно удаляют файлы с атрибутом ReadOnly;

Также добавлен полный спектр функций для работы с системным реестром (поддерживается удалённое подключение). В следующих постах будут полезные исходники, которые с успехом можно будет применить для удалённой диагностики компьютеров в локальной сети.

пятница, 13 июня 2008 г.

Как очистить профиль пользователя от мусора?

В нашей компании используется контроллер домена под Linux Mandriva. Работает SAMBA. Рабочие станции работают на Windows XP и Windows 2000 Professional. Все пользователи сохраняют свои профили автоматически при перезагрузке или logoff/logon на файловом сервере.

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

Но тут есть один неприятный момент. Люди часто используют свой профиль для того, чтобы записать туда какую-нибудь муть. Типа пачки mp3 файлов или пары фильмов по полтора гигабайта. И выложить это добро на "Рабочий стол". Профиль стремительно пухнет и гигабайты свободного места на файловом сервере начинают быстро уменьшаться.

Периодически начинаются чистки, но это происходит время от времени. Когда ситуация со свободным местом на сервере становится угрожающей.

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

А после того, как закончили работу - выдаём гневное сообщение, типа "Ай-яй-яй, нехорошо!".

Вот собственно и сам скрипт:

{===========================================
Скрипт переносит из пользовательского профиля
все медиа файлы в локальную папку с названием,
равном имени пользователя, под которым тот
залогинился в системе

24.06.2008
Gifer
============================================}
var
trashlog,home,prhome,profile,trash,user,s,st,newdir:string;
i,j:integer;

//Функция удаления имени файла из строкиfunction
function DeleteFileName(s:string):string;
var
st:string;
begin
st:=s;
while st[length(st)]<>'\' do
if st[length(st)]<>'\' then delete(st,length(st),1);
result:=st;
end;

begin
//Диск на котором расположен профиль
prhome:= GetEnvValue('HOMEDRIVE')+'\';

//Папка профиля на сервере
home:= prhome+'profile';

//Папка профиля на локальной машине пользователя
profile:= GetEnvValue('USERPROFILE')+'\';

//Имя текущего пользователя
user:= GetEnvValue('USERNAME');

//Расположение перенесенных файлов из профиля
trash:=profile[1]+':\'+user;

Deletefile(profile[1]+':\Profile_cleaner.txt');

Protocol('Пользователь '+user+' начал работу....','T:\winscript.logs\users.log',true);

//Сканирование локальной папки профиля на наличие "лишних" файлов
ExecuteEX('cmd.exe',' /c dir "'+profile+'*.avi" /s /b /c /a>trash.log', prhome,1);
ExecuteEX('cmd.exe',' /c dir "'+profile+'*.mp3" /s /b /c /a>>trash.log',prhome,1);
ExecuteEX('cmd.exe',' /c dir "'+profile+'*.mp4" /s /b /c /a>>trash.log',prhome,1);
ExecuteEX('cmd.exe',' /c dir "'+profile+'*.wmv" /s /b /c /a>>trash.log',prhome,1);
ExecuteEX('cmd.exe',' /c dir "'+profile+'*.mkv" /s /b /c /a>>trash.log',prhome,1);
ExecuteEX('cmd.exe',' /c dir "'+profile+'*.3gp" /s /b /c /a>>trash.log',prhome,1);
ExecuteEX('cmd.exe',' /c dir "'+profile+'*.wav" /s /b /c /a>>trash.log',prhome,1);
ExecuteEX('cmd.exe',' /c dir "'+profile+'*.wma" /s /b /c /a>>trash.log',prhome,1);

j:=GetTextFileLinesCount(prhome+'trash.log');

if j>0 then begin
Protocol('Пользователь '+user+' собрал мусор','T:\winscript.logs\users.log',true);
createfolder(trash);
AddLineToFile(trash+'\Profile_cleaner.txt','Ниже перечислены медиа файлы,');
AddLineToFile(trash+'\Profile_cleaner.txt','которые были перенесены из Вашего профиля в: '+trash);
AddLineToFile(trash+'\Profile_cleaner.txt','========================================================================');
for i:=1 to j do begin
LoadLineFromFile(prhome+'trash.log',i,s);

//в это условие подставляем название тех папок, которые не нужно просматривать
if (pos(profile+'Local Settings',s)=0) or (pos(profile+'Application Data',s)=0) then begin
s:=strconvert(s,4);
AddLineToFile(trash+'\Profile_cleaner.txt',s);
st:=s;
delete(s,1,length(profile)-1);
newdir:=trash+DeleteFileName(s);
//Удаление файлов с сервера
if FileExists(home+s) then DeleteFile(home+s);
//Перенос на локальный диск "лишних" файлов
ForceFolders(newdir);
MoveFile(st,trash+s,true);
end;
end;
Protocol('Пользователь '+user+' выбросил мусор.','T:\winscript.logs\users.log',true);
MsgBox('Внимание!!!','Ваш профиль был очищен от медиа файлов. Все вопросы к Яндексу :)',1);
Execute(trash+'\Profile_cleaner.txt','','');
end else Protocol('Пользователь '+user+' ничего не нашeл.','T:\winscript.logs\users.log',true);

deletefile(prhome+'trash.log');
end.

Авторство - Andrey Rakov aka Gifer (gifer17@gmail.com)

После небольшой адаптации (в скрипте все логи пишутся на диск T:\winscript.logs\users.log) можно использовать где угодно. Скрипт проверен и работает надёжно. Запускаем скрипт машину с файлового сервера, с примапленного диска - чтобы избежать неоднозначности версий.

Будут вопросы - пишите на support@nsoft-s.com, постараемся помочь. В теме укажите "WinScript".