Устанавливаем и настраиваем терминальное решение на базе Citrix Presentation Server 4.5 и тонких клиентов WYSE Алексей Бережной SQLEXPR.EXE –x SQLEXPR_ADV.EXE -х INSTANCENAME=_ИМЯ_ЭКЗЕМПЛЯРА_ setup INSTANCENAME=CITRIX_METAFRAME ----------------------------------------------------------------------------------------------------------------- Используем check_relay в Sendmail для борьбы со спамом Сергей Супрунов $ grep "dns rule 2" /var/log/maillog | tail -1 $ nslookup 18971199139.user.veloxzone.com.br $ dig -x 77.88.21.3 $ dig www.yandex.ru R$+!$+ $: $2@$1 $ sendmail -bt > /map block4 pool-127-165.gen.ua > /map block5 pool-127-165.gen.ua > /quit FEATURE(`delay_checks', `friend') To:postmaster@ SPAMFRIEND To:abuse@ SPAMFRIEND LOCAL_CONFIG # Правила-исключения Krelays regex -a@MATCH ^(mail|relay|mx|smtp|mta).*[0-9]*(\..*){2,} Kexdoms regex -a@MATCH \.(mydom\.ru|hotmail\.com|rambler\.ru|yandex\.ru|mail\.ru)$ Kournet1 regex -a@MATCH 10\.5\.[0-9]{1,3}\.[0-9]{1,3} # Правила блокировки Kblock1 regex -a@MATCH ([0-9]{1,3}[._x-]){4} Kblock2 regex -a@MATCH ([0-9]+[._x-]){2,}.*(\..*){2,} Kblock3 regex -a@MATCH [0-9a-f]{8,}(\..*){3,} Kblock4 regex -a@MATCH [0-9].*(dsl|dial|dynamic|static|ppp|pool|client|user|dhcp|gprs).*(\..*){2,} Kblock5 regex -a@MATCH (dsl|dial|dyn|static|ppp|pool|client|user|dhcp|gprs|ip|vpn|nat)[a-z_-]*[0-9]+.*(\..*){2,} Kblock6 regex -a@MATCH (vectranet\.pl|mediating\.barrier\.volia\.net)$ LOCAL_RULESETS SLocal_check_relay # Пропускаем соединения со своей подсети R$* $: $(ournet1 $&{client_name} $) R@MATCH $@ OK # Выполняем разрешение имени клиента R$* $: < $&{client_resolve} > R $#error $@ 4.4.0 $: ? "450 Temp. (dns rule 1). Cannot resolve PTR for " $&{client_addr} R $#error $@ 5.7.1 $: ? "550 Denied (dns rule 2). IP name forged " $&{client_name} R $#error $@ 5.7.1 $: "550 Denied (dns rule 3). IP name lookup failed " $&{client_name} # Применяем оставшиеся правила-исключения R$* $: $(relays $&{client_name} $) R@MATCH $@ OK R$* $: $(exdoms $&{client_name} $) R@MATCH $@ OK # Блокируем соединения согласно правилам блокировки R$* $: $(block1 $&{client_name} $) R@MATCH $#error $@ 5.7.1 $: "554 Bad hostname for mailserver: " $&{client_name} " (regex rule 1)" R$* $: $(block2 $&{client_name} $) R@MATCH $#error $@ 5.7.1 $: "554 Bad hostname for mailserver: " $&{client_name} " (regex rule 2)" R$* $: $(block3 $&{client_name} $) R@MATCH $#error $@ 5.7.1 $: "554 Bad hostname for mailserver: " $&{client_name} " (regex rule 3)" R$* $: $(block4 $&{client_name} $) R@MATCH $#error $@ 5.7.1 $: "554 Bad hostname for mailserver: " $&{client_name} " (regex rule 4)" R$* $: $(block5 $&{client_name} $) R@MATCH $#error $@ 5.7.1 $: "554 Bad hostname for mailserver: " $&{client_name} " (regex rule 5)" R$* $: $(block6 $&{client_name} $) R@MATCH $#error $@ 5.7.1 $: "554 Bad hostname for mailserver: " $&{client_name} " (regex rule 6)" # cd /etc/mail # make && make install # make restart $ cd /var/log $ bzcat maillog.7.bz2 | grep "Greylisting in action" | wc -l $ bzcat maillog.7.bz2 | grep "stat=Sent" | wc -l $ bzcat maillog.7.bz2 | grep "5.7.1" | wc -l $ bzcat maillog.0.bz2 | grep "Greylisting in action" | wc -l $ bzcat maillog.0.bz2 | grep "5.7.1" | wc -l $ bzcat maillog.0.bz2 | grep "stat=Sent" | wc -l grep 'regex rule 3' maillog | wc -l $ ./getsendmailstat.sh /var/log/maillog.0.bz2 ----------------------------------------------------------------------------------------------------------------- Jabberd2 – простой и нетребовательный к ресурсам XMPP-сервер Часть 2. Управление базами данных BerkeleyDB и тонкая настройка Jabberd2 Михаил Кондрин # db_archive -l # db_archive -d # db_archive -s # db_hotbackup -v -c -h ./ -b /root/backup # db_checkpoint -v -1 # ls /root/backup # db_recover -c -v -h ./ -e # ls ./ # db_verify -h ./ authreg.db sm.db # db_upgrade -v -h ./ authreg.db sm.db # one 0GB 2MB cache set_cachesize 0 2097152 1 # Transaction Log settings set_lg_max 2097152 set_lg_bsize 262144 set_flags DB_LOG_AUTOREMOVE set_flags DB_DIRECT_LOG set_flags DB_DIRECT_DB proc myfunction { z } { puts [set z] } load /usr/lib/libdb_tcl-4.4.so [berkdb env -home ./ -recover] close set e [berkdb env -data_dir ./ -home ./] set h [berkdb open -rdonly -env $e sm.db] set c [$h cursor] catch { for {set entry [$c get -first] } { $entry != {} } { set entry [$c get -next] } { eval entry $entry puts [lindex $entry 0] } } $c close $h close $e close $ tclsh ../scripts/list-sm.tcl source ../scripts/serialize.tcl load /usr/lib/libdb_tcl-4.4.so [berkdb env -home ./ -recover] close set e [berkdb env -home ./] set h [berkdb open -env $e sm.db vcard] set c [$h cursor] catch { for {set entry [$c get -first] } { $entry != {} } { set entry [$c get -next] } { eval set vcards $entry puts "->key(jid) = [lindex $vcards 0]" set card [deserialize [lindex $vcards 1]] foreach {field value} $card { puts "$field : $value" } } } $c close $h close $e close $ tclsh ../scripts/list-vcard.tcl ->key(jid) = mike@hppi.troitsk.ru nickname : mike email : mkondrin@hppi.troitsk.ru fn : Kondrin Mikhail adr-region : MO adr-country : RU n-given : Mikhail n-family : Kondrin root@myrealm.ru 0 0 0 Admin root postmaster@myrealm.ru 0 0 0 Admin postmaster mike@myrealm.ru 0 0 0 Colleagues mike source ../scripts/serialize.tcl load /usr/lib/libdb_tcl-4.5.so [berkdb env -home ./ -recover] close set e [berkdb env -home ./] set h [berkdb open -dup -hash -create -auto_commit -env $e sm.db published-roster] set f [open published.txt] set t [$e txn] set err [ catch { foreach line [split [read $f] "\n"] { set a [ pub_roster_format $k] $h put -txn $t "" $a } }] if { $err } { $t abort } else { $t commit } close $f $h sync $h close $e close ----------------------------------------------------------------------------------------------------------------- Работаем с данными Active Directory из скриптов Часть первая. Применение Bourne Shell Рашид Ачилов # ldapsearch -D ldapread@SHELTON.NET -w qwerty{123} -LLL -h 192.168.50.1 -b dc=shelton,dc=net -P 3 -a always (sAMAccountName=ld*) distinguishedName sAMAccountType # ldapsearch -D ldapread@SHELTON.NET -w qwerty{123} -LLL -h 192.168.50.1 -b dc=shelton,dc=net -P 3 -a always (sAMAccountName=ld*) title sAmAccountType # echo 0KfQuNGC0LDRgtC10LvRjA== | mmencode -u | iconv -f utf-8 -t koi8-r ivanov-iv Иванов Иван petrov-pp Петров Петр root Администратор ldap_server=192.168.50.1 ldap_basedn="dc=shelton,dc=net" ldap_binddn=ldapread@SHELTON.NET ldap_password="cXdlcnR5YXNkZgo 1" ldap_common_filter="(&(sAMAccountName=*)(sAMAccountType=805306368)(telephoneNumber=*))" etcdir=/usr/local/etc sargdir=sarg2 sargfile=sargusers # Обратное преобразование строки пароля # Вход: $1 enconved (строка) - пароль из файла конфигурации # Выход: _passwd - пароль в текстовом виде demux_passwd() { local _ideconv _iadd _ifill _ifill="=" _ideconv=$1 if [ ! $2 -eq 0 ]; then _iadd=$2 while [ $_iadd -gt 0 ]; do _ideconv=$_ideconv$_ifill _iadd=$(($_iadd-1)) done fi _passwd=`echo $_ideconv | $util_mmencode -u` } safe_logger "LDAPQuery ver. $revisionNumber started" # Обратное преобразование пароля demux_passwd $ldap_password _ldap_pwd=$_passwd # Создать временный каталог, если еще не создан, и перейти в него make_tempdir # Выполнить поиск в LDAP и сохранить результат ldap_data_query sAMAccountName $tempdir/users.ldif # Преобразовать данные в читаемый вид ldap_data_deconvert $tempdir/users.ldif $tempdir/users.list # Выполнить поиск в LDAP и сохранить результат ldap_data_query displayName $tempdir/names.ldif # Преобразовать данные в читаемый вид ldap_data_deconvert $tempdir/names.ldif $tempdir/names.list # Внешний цикл по списку пользователей из LDAP for _oneldapuser in $ldapusers do _togo=0 # Внутренний цикл по списку пользователей Sarg for _onesarguser in $sargusers do # Если пользователь найден, то мы прерываем и внутренний, и внешний циклы. # Переходим к следующей записи внешнего цикла if [ $_oneldapuser = $_onesargluser ]; then continue 2 fi done # Если мы находимся здесь, значит, пользователь LDAP не найден в списке пользователей Sarg. # Мы записываем в список пользователей Sarg строку с логином из names.list и именем из names.list _oneusername=`cat $tempdir/names.list | tail -n +$_togo | head -n 1` echo -e "$_oneldapuser \t$_oneusername\n" >> $etcdir/$sargdir/$sarglist _togo=$(($_togo+1)) _added=$(($_added+1)) done # Запросить некоторые данные у LDAP-сервера # Вход: $1 fieldname (строка) - Имя атрибута(ов), запрашиваемых в AD # $2 outfile (строка) - Имя файла для сохранения полученных данных # Выход: none ldap_data_query() { local _ldapfield _outfile _ldapfield=`echo $1 | sed -e "s:,: :g"` _outfile=$2 # Выполнить запрос к LDAP и сохранить результат $util_ldapsearch -T $tempdir -D $ldap_binddn -w $_ldap_pwd -LLL -h $ldap_server \ -b $ldap_basedn -P 3 -a always $ldap_common_filter $_ldapfield > $_outfile # Проверить код возврата status=$? if [ $status -ne 0 ]; then safe_logger "Unable to complete LDAP request to get $_ldapfield from AD" exit fi } # Удалить пробелы и строки комментариев из файла # Вход: $1 source (строка) - Имя исходного файла # $2 destination (строка) - Имя файла результата # Выход: none _unspace() { cat $1 | grep -v ^# | sed -e "s: ::g" > $2 } # Создать временный каталог, если он еще не был создан, и перейти в него # Вход: none # Выход: tempdir (строка) - имя временного каталога make_tempdir() { if [ ${#tempdir} -eq 0 ]; then tempdir=`mktemp -d /tmp/adphones.XXXXXX` fi cd $tempdir } # Обратное преобразование данных, прочитанных из AD # Вход: $1 source (строка) - имя файла с исходными данными # $2 dest (строка) - имя файла для записи выходных данных # Выход: none ldap_data_deconvert() { local _tempsfx _outfile _tempstr _enconved _skip # Из строки типа /path/to/filename.ext мы выбираем только имя файла. # Первая команда отбрасывает путь (шаблон – наибольший префикс). # Вторая команда отбрасывает расширение (шаблон – наименьший суффикс) _tempsfx=${1##*/} _tempsfx=${_tempsfx%.*} _outfile=$2 # Удаляем из файла все пробелы и строки комментариев _unspace $1 stripped.$_tempsfx # Готовимся разбивать по строкам, для чего используем глобал $newline, # равный переводу строки saveifs=$IFS IFS=$newline _skip=0 _tempstr="" _enconved=0 conved=`cat stripped.$_tempsfx` for one in $conved do # Внутри строки разбиваем по символу двоеточия IFS=: set $one # Если $2 установлен, это значит, что значение в коде ASCII # и может быть записано в выходной файл напрямую, если это не dn write_when_not_dn "$2" $1 1 # Если $3 установлен, значит, что значение в коде base64 # и должно быть преобразовано перед записью, если это не dn write_when_not_dn "$3" $1 0 # Если же одна переменная – это промежуточная строка, # и она должна быть присоединена к значению буфера if [ ${#2} -eq 0 ] && [ ${#3} -eq 0 ] && [ $_skip -eq 0 ]; then _tempstr=$_tempstr$1 fi IFS=$newline done # Если данные не требуют преобразования – выводим в один файл, # если требуют - в другой, потому что mmencode пытается преобразовать # все данные, переданные ей if [ $_enconved -eq 1 ]; then echo $_tempstr >> unconved.data else echo $_tempstr >> conved.data fi # Сортируем данные в обоих файлах и удаляем дублирующие строки cat unconved.data | sort -df | uniq > $_outfile cat conved.data | sort -df | uniq > deconved.data # Построчно перекодируем файл deconved=`cat deconved.data` for one in $deconved do echo $one | $util_mmencode -u | $util_iconv -f utf-8 -t koi8-r >> $_outfile printf "\n" >> $_outfile done IFS=$saveifs } # Сформировать файл с данными для преобразования, если оно требуется, иначе с данными, # не требующими преобразования, в том случае, если это не dn # Вход: $1 line (строка) - данные из исходного файла # $2 attribute (строка) - имя атрибута # $3 enconved (digit) - 1 значит, что данные не требуют преобразования # Выход: none write_when_not_dn() { # Если установлен $1, значит, это первая строка данных, # и нужно записать предыдущее содержимое промежуточного буфера [ ${#1} -eq 0 ] && return # Если промежуточный буфер содержит накопленные данные, их нужно записать if [ ${#_tempstr} -ne 0 ] && [ $_skip -ne 1 ]; then # Если данные не требуют преобразования, записать в один файл, # если требуют — в другой, потому что mmencode преобразовывает все if [ $_enconved -eq 1 ]; then echo $_tempstr >> unconved.data _enconved=0 else echo $_tempstr >> conved.data fi fi # Если атрибут — dn, мы пропускаем эту и следующие строки до тех пор, # пока не начнется новый атрибут if [ $2 = "dn" ]; then # Пропускать следующие строки _skip=1 return else # Использовать следующие строки и накапливать данные во временном буфере _skip=0 _tempstr=$1 # Отметим, если данные не требуют преобразования if [ $3 -eq 1 ]; then _enconved=1 fi fi } ----------------------------------------------------------------------------------------------------------------- Панель управления хостингом ISPConfig Сергей Яремчук $ sudo apt-get update $ sudo apt-get -u upgrade $ sudo apt-get install postfix postfix-mysql mysql-client mysql-server courier-authdaemon courier-authlib-mysql courier-pop courier-pop-ssl courier-imap courier-imap-ssl libsasl2-2 libsasl2-modules libsasl2-modules-sql sasl2-bin libpam-mysql openssl courier-maildrop getmail4 $ mysqladmin -u root password password $ sudo apt-get install amavisd-new spamassassin clamav clamav-daemon zoo nomarch lzop cabextract apt-listchanges libnet-ldap-perl libauthen-sasl-perl daemon libio-string-perl libio-socket-ssl-perl libnet-ident-perl libnet-dns-perl $ sudo apt-get install apache2 apache2.2-common apache2-mpm-prefork apache2-utils libexpat1 ssl-cert libapache2-mod-php5 php5 php5-common php5-gd php5-mysql php5-imap phpmyadmin php5-cli $ sudo a2enmod suexec $ sudo a2enmod rewrite $ sudo a2enmod ssl $ sudo a2enmod fastcgi $ grep -i capabilities /boot/config-2.6.24-16-generic CONFIG_SECURITY_CAPABILITIES=y $ sudo modprobe capability $ sudo echo 'capability' >> /etc/modules $ sudo apt-get install pure-ftpd-common pure-ftpd-mysql quota quotatool $ sudo sh -c 'echo 'yes' > /etc/pure-ftpd/conf/DontResolv' $ sudo apt-get install build-essential libmysqlclient15-dev $ wget http://mydns.bboy.net/download/mydns-1.1.0.tar.gz $ tar xvfz mydns-1.1.0.tar.gz $ cd mydns-1.1.0 $./configure $ make $ sudo make install $ sudo apt-get install vlogger webalizer $ wget http://www.ispconfig.org/downloads/ISPConfig-3.0.0.6-beta.tar.gz $ tar xvfz ISPConfig-3.0.0.6-beta.tar.gz $ cd ispconfig3_install/install/ $ sudo php -q install.php ----------------------------------------------------------------------------------------------------------------- Лебедь, рак да щука: САМО-Софт, wine, Etersoft Сергей Барановский "С:\Program Files\OpenOffice.org 2.4\program\soffice.exe" %1 $ wine msiexec /i /путь/unioffice.msi # yum install wine # rpm -e wine wine-core –nodeps # rpm -ihv wine-0.9.58-1.fc8.i386.rpm wine-core-0.9.58-1.fc8.i386.rpm --nodeps --force [Settings]^M Locale=0^M ConnectionIndex=0^M ^M [Connection0]^M Port=88^M Name=Connection^M Host=192.168.0.1^M UserName=^M Login=^M ----------------------------------------------------------------------------------------------------------------- На страже безопасности – Software Restriction Policies Вадим Поданс C:\Users\%username%\AppData\Roaming\Microsoft\Windows\Start Menu\*.lnk C:\Users\%username%\AppData\Roaming\Microsoft\Windows\Start Menu\*\*.lnk C:\ProgramData\Microsoft\Windows\Start Menu\*.lnk C:\ProgramData\Microsoft\Windows\Start Menu\*\*.lnk %HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders\Programs%*.lnk %HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders\Start Menu%*\*.lnk %userprofile%\AppData\Roaming\Microsoft\Internet Explorer\Quick Launch\*.lnk Windows Registry Editor Version 5.00 [HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\Windows\safer\codeidentifiers] "DefaultLevel"=dword:00000000 Windows Registry Editor Version 5.00 [HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\Windows\safer\codeidentifiers] "DefaultLevel"=dword:00040000 Windows Registry Editor Version 5.00 [HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\Windows\Safer\CodeIdentifiers] "DefaultLevel"=dword:00020000 Windows Registry Editor Version 5.00 [HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\Windows\safer\codeidentifiers] "authenticodeenabled"=dword:00000000 Windows Registry Editor Version 5.00 [HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\Windows\safer\codeidentifiers] "authenticodeenabled"=dword:00040000 ----------------------------------------------------------------------------------------------------------------- Распределенная система контроля версий Bazaar Дмитрий Васильев bzr version bzr help bzr help version bzr help commands bzr whoami "John Doe " bzr whoami bzr whoami --branch "John Doe " [DEFAULT] emai = John Doe $ cd project-directory $ bzr init $ bzr add $ bzr commit -m "Импортирование проекта" bzr commit -m "Изменения" README.txt src $ bzr init-repo repo $ cd repo $ bzr init trunk $ cd trunk $ bzr add $ bzr commit -m "Испортирование проекта" bzr ignore имена объектов bzr ignore "RE:lib/.*\.o" $ bzr status $ bzr diff bzr diff -r 100.. bzr diff -r 100..120 $ bzr log $ bzr log --short bzr log README.txt $ bzr cat -r 100 README.txt bzr export ../releases/project-1.0.zip bzr tag version-1.0 bzr diff -r tag:version-1.0 bzr add file.txt bzr remove file.txt bzr revert bzr commit -m "Исправлен файл README" bzr uncommit bzr commit -m "Исправлен файл README.txt" bzr uncommit -r -3 bzr revert -r -3 bzr tag --delete version-1.0 bzr tag --force version-2.0 $ cd projects $ bzr init-repo project $ cd project $ bzr branch bzr+ssh://some.host/some/project remote $ bzr branch remote local $ cd remote $ bzr info bzr pull bzr merge ../local bzr resolve bzr annotate bzr push $ bzr init-repo --no-trees sftp://central.host/bzr/repo $ bzr init sftp://central.host/bzr/repo/trunk $ bzr checkout sftp://central.host/bzr/repo/trunk $ cd trunk $ cp -ar ../some-files/ . $ bzr add $ bzr commit -m "Импорт проекта" bzr bind sftp://central.host/bzr/repo/trunk bzr unbind bzr checkout --lightweight sftp://central.host/bzr/repo/trunk bzr update bzr commit --local ----------------------------------------------------------------------------------------------------------------- Готовимся к переходу на PHP 5.3 Александр Майоров --- myspace_part2.php --- --- myspace_part1.php --- --- index.php --- field_1 = 123; $Std->field_2 = array(1,2,3); My::Test::Space::var_dump($Std); use My::Test::Space::TestClass; use My::Test::Space as MTS; $Obj = new TestClass; MTS::var_dump( $Obj, MTS::TestClass::getTestItem() ); ?> field ); var_dump( TestSingleton_A::getInstance()->field ); ?> lambda_foo = function() { return __CLASS__; }; } } $Obj = new TestClass_A(); echo $Obj->lambda_foo(); ?> lambda_foo->__invoke(); ?> lambda_foo = function() { return __CLASS__; }; } function __call($name, $argv) { if ( isset($this->$name) && $this->$name instanceof Closure ) return $this->$name->__invoke($argv); } } $Obj = new TestClass_A(); echo $Obj->lambda_foo(); ?> function & (parameters) use (lexical vars) { body }; foo_method(3, 2); ?> [phar] phar.readonly=0 getMessage(); } ?> convertToExecutable(Phar::TAR, Phar::GZ); ?> php test.phar [PATH=/home/ develop_host/www] error_repoting = E_ALL | E_STRICT [PATH=/home/production_host/www] error_reporting = 0 [PATH=develop.my-super-startup.ru] error_repoting = E_ALL | E_STRICT [PATH= my-super-startup.ru] error_reporting = 0 push('a'); $Stack->push('b'); $Stack->push('c'); printf("%s \n", $Stack->pop() ); printf("%s \n", $Stack->pop() ); printf("%s \n", $Stack->pop() ); ?> setExtractFlags( SplPriorityQueue::EXTR_DATA ); $PQueue->insert('последний элеменет',1); $PQueue->insert('первый элемент', 3); $PQueue->insert('средний элемент', 2); printf("Верхний элемент: %s \n", $PQueue->top() ); printf("%s \n", $PQueue->extract() ); printf("%s \n", $PQueue->extract() ); printf("%s \n", $PQueue->extract() ); ?> ----------------------------------------------------------------------------------------------------------------- Открываем базу данных одним щелчком мыши Андрей Луконькин Windows Registry Editor Version 5.00 [HKEY_CLASSES_ROOT\.MD] @="mdfile" [HKEY_CLASSES_ROOT\mdfile] [HKEY_CLASSES_ROOT\mdfile\shell] [HKEY_CLASSES_ROOT\mdfile\shell\open] @="Конфигуратор" [HKEY_CLASSES_ROOT\mdfile\shell\open\command] @="\"C:\\Program Files\\1Cv77\\BIN\\1cv7s.exe\" config /D\"%1\\..\"" [HKEY_CLASSES_ROOT\mdfile\shell\open2] @="Монитор" [HKEY_CLASSES_ROOT\mdfile\shell\open2\command] @="\"C:\\Program Files\\1Cv77\\BIN\\1cv7s.exe\" monitor /D\"%1\\..\"" [HKEY_CLASSES_ROOT\mdfile\shell\open3] @="Предприятие" [HKEY_CLASSES_ROOT\mdfile\shell\open3\command] @="\"C:\\Program Files\\1Cv77\\BIN\\1cv7s.exe\" enterprise /D\"%1\\..\"" [HKEY_CLASSES_ROOT\mdfile\shell\open4] @="Предприятие монопольно" [HKEY_CLASSES_ROOT\mdfile\shell\open4\command] @="\"C:\\Program Files\\1Cv77\\BIN\\1cv7s.exe\" enterprise /m /D\"%1\\..\"" -----------------------------------------------------------------------------------------------------------------