Управляем объектами в Active Directory Часть 1 Иван Коробко Листинг 1. Создание учетной записи пользователя set RootDSE = GetObject("LDAP://RootDSE") Domain = rootDSE.Get("defaultNamingContext") Set objUsers = GetObject("LDAP://CN=Users," & Domain) Set objNewUser = objUsers.Create("user", "cn=Ivan\, Petrov") objNewUser.Put "sAMAccountName", "IPetrov" objNewUser.Put "sn", "Petrov" objNewUser.Put "givenName", "Ivan" objNewUser.Put "Initials", "V" objNewUser.Put "userPrincipalName", "IPetrov@" & DetectDNSName(Domain) objNewUser.SetInfo objNewUser.AccountDisabled=False objNewUser.SetPassword("1234567890") objNewUser.SetInfo Function DetectDNSName(Domain) ' Определение DNS-имени домена LDAPArray = Split(Domain,",") For Each el In LDAPArray DNSName = DNSName + right(el,Len(el)-3) + "." Next DetectDNSName = left(DNSName, Len(DNSName)-1) End Function Листинг 2. Шаблон создания объектов в Active Directory set RootDSE = GetObject("LDAP://RootDSE") Domain = rootDSE.Get("defaultNamingContext") Set objs = GetObject("LDAP:// " + ПУТЬ К ПАПКЕ + " & Domain) Set obj = objs.Create("ТИП ОБЪЕКА", "ИМЯ ОБЪЕКТА") obj.Put "ПОЛЕ ТИПА СТРОКА В ACTIVE DIRECTORY", "ЗНАЧЕНИЕ" obj.Put "ПОЛЕ ТИПА МАССИВ В ACTIVE DIRECTORY", Array("ЗНАЧЕНИЕ1", "ЗНАЧЕНИЕ2", "ЗНАЧЕНИЕ3"…) obj.SetInfo Листинг 3. Создание учетной записи группы безопасности set RootDSE = GetObject("LDAP://RootDSE") Domain = rootDSE.Get("defaultNamingContext") Set objGroups = GetObject("LDAP:// CN=Test,CN=Groups," & Domain) Set objGrous = objGroups.Create("group", "cn=Print Manage") objGroup.Put "sAMAccountName", "Print Manage" objGroup.SetInfo Листинг 4. Создание учетной записи папки set RootDSE = GetObject("LDAP://RootDSE") Domain = rootDSE.Get("defaultNamingContext") Set objOUs= GetObject("LDAP://CN=Users," & Domain) Set objOU = objOUs.Create("organizationalUnit", "ou=Test") objOU.SetInfo ----------------------------------------------------------------------------------------------------------------- SharePoint в качестве платформы документооборота Работаем с workflow в WSS 3.0 и MOSS 2007 Нелли Садретдинова using System; using System.ComponentModel; using System.ComponentModel.Design; using System.Collections; using System.Drawing; using System.Workflow.ComponentModel; using System.Workflow.ComponentModel.Design; using System.Workflow.ComponentModel.Compiler; using System.Workflow.ComponentModel.Serialization; using System.Workflow.Runtime; using System.Workflow.Activities; using System.Workflow.Activities.Rules; using Microsoft.SharePoint; using Microsoft.SharePoint.WorkflowActions; namespace MyActivities { public partial class getEmail: SequenceActivity { public getEmail() { InitializeComponent(); } //Описываем свойство __Context, в нем хранится информация //о веб-приложении, из которого было вызвано действие public static DependencyProperty __ContextProperty = System.Workflow.ComponentModel.DependencyProperty.Register("__Context", typeof(WorkflowContext), typeof(getEmail)); [Description("Context")] [ValidationOption(ValidationOption.Required)] [Browsable(true)] [DesignerSerializationVisibility(DesignerSerializationVisibility.Visible)] public WorkflowContext __Context { get { return ((WorkflowContext)(base.GetValue(getEmail.__ContextProperty))); } set { base.SetValue(getEmail.__ContextProperty, value); } } //Описываем свойство, в котором будет храниться логин пользователя public static DependencyProperty LoginProperty = System.Workflow.ComponentModel.DependencyProperty.Register("Login", typeof(string), typeof(getEmail)); [Description("Login")] [ValidationOption(ValidationOption.Required)] [Browsable(true)] [DesignerSerializationVisibility(DesignerSerializationVisibility.Visible)] public string Login { get { return ((string)(base.GetValue(getEmail.LoginProperty))); } set { base.SetValue(getEmail.LoginProperty, value); } } //Описываем свойство, в котором будет храниться электронный адрес пользователя public static DependencyProperty EmailProperty = System.Workflow.ComponentModel.DependencyProperty.Register("Email", typeof(string), typeof(getEmail)); [Description("Email")] [Category("Email")] [Browsable(true)] [DesignerSerializationVisibility(DesignerSerializationVisibility.Visible)] public string Email { get { return ((string)(base.GetValue(getEmail.EmailProperty))); } set { base.SetValue(getEmail.EmailProperty, value); } } //Переопределяем метод, в котором выполняется само действие protected override ActivityExecutionStatus Execute(ActivityExecutionContext executionContext) { SPWeb web = this.__Context.Web; SPUser user; if (Login != "") { user = web.AllUsers[Login]; if (user != null) { Email = user.Email; } } return base.Execute(executionContext); } } } ----------------------------------------------------------------------------------------------------------------- Устанавливаем и настраиваем систему мониторинга сети OpenNMS Андрей Семенов rpm -ihv http://mirror.yandex.ru/fedora/tigro/8/i386/tigro-release-8-1.i386.rpm yum install jdk sed -i 's/XINERAMA/FAKEEXTN/g' /usr/java/jdk1.6.0_05/jre/lib/i386/xawt/libmawt.so yum install postgresql-server /sbin/service postgresql initdb local all all trust host all all 127.0.0.1/32 trust host all all ::1/128 trust listen_addresses = 'localhost' /sbin/service postgresql start rpm -Uvh http://yum.opennms.org/repofiles/opennms-repo-unstable-fc8.noarch.rpm yum install opennms yum install jrrd yum install jicmp yum install iplike cd /opt/opennms/bin ./runjava -s ./runjava -S /usr/java/jdk1.6.0_5/bin/java ./install -dis ./install -disU -l /usr/lib/jni:/usr/lib -A,--admin-password // Пароль администратора сервера postgres (по умолчанию: '') -a,--admin-username // Имя администратора сервера postgres (по умолчанию: 'postgres') -c,--clean-database // Очистить существующую базу при создании -D,--database-url // JDBC УРЛ базы данных (по умолчанию: jdbc:postgresql://localhost:5432/) -P,--database-name // Имя базы данных PostgreSQL (по умолчанию: opennms) -p,--password // Пароль для базы данных opennms (по умолчанию: 'opennms') -u,--username // Имя пользователя БД opennms (по умолчанию: 'opennms') ./install -help ./opennms start 10.10.10.1 10.10.14.254 10.10.11.1 10.10.11.254 10.10.11.1 file:/opt/OpenNMS/etc/moreip.txt /opt/opennms/bin/send-event.pl --interface ip-address uei.opennms.org/internal/discovery/newSuspect 10.10.11.1 file:/opt/OpenNMS/etc/include IPADDR != '0.0.0.0' RRA:AVERAGE:0.5:1:89280 RRA:AVERAGE:0.5:60:8784 RRA:AVERAGE:0.5:1440:366 RRA:MAX:0.5:1440:366 RRA:MIN:0.5:1440:366 interval="20000" begin="0" end="300000"/> org.opennms.snmp.strategyClass=org.opennms.netmgt.snmp.snmp4j.Snmp4JStrategy 10.10.10.1 10.10.11.1 10.10.14.1 ./opennms start opennms.bat start ----------------------------------------------------------------------------------------------------------------- Медиация Linux и GDI-принтера Павел Закляков -I"C:\Program Files\gs\gs8.62\lib";"C:\ProgramFiles\gs\gs8.62\fonts" -sDEVICE=mswinpr2 -dNOPAUSE -dSAFER -sPAPERSIZE=a4 -sOutputFile="\\spool\SHARP AR-153E N" @"C:\Program Files\gs\winprinter.rsp" – ----------------------------------------------------------------------------------------------------------------- Как запустить «САМО-Тур» для Windows под Linux Сергей Барановский # service yum-updatesd stop # /etc/rc.d/init.d/yum-updatesd stop # chkconfig yum-updatesd off export http_proxy=http://user:password@192.168.0.1:3128 export http_proxy=http://192.168.0.1:3128 export http_proxy=192.168.0.1:3128 wget http://rpm.livna.org/livna-release-8.rpm # rpm -ihv livna-release-8.rpm # yum install mc unrar # yum install freetds wine [Server80] host = 192.168.0.2 port = 1433 tds version = 8.0 client charset=WINDOWS-1251 [FreeTDS] Description=FreeTDS for MSSQL Driver=/usr/lib/libtdsodbc.so.0 [labirint] Driver=FreeTDS Description=Labirint database Trace=No Servername=Server80 Database=labirint # odbcinst -i -d -f tds.driver.template $ odbcinst -i -s -f tds.datasource.template isql -v labirint user pass wine 123 "/home/домашняя_директория_пользователя/.wine/drive_c/Program Files/WinTour/Wintour.exe" env WINEPREFIX="/home/labirint/.wine" wine "/home/домашняя_директория_пользователя/.wine/drive_c/Program Files/WinTour/Wintour.exe" wine "/home/домашняя_директория_пользователя/.wine/drive_c/Program Files/WinTour/Wintour.exe" wget http://www.jrsoftware.org/download.php/bdeinst.cab wget http://www.cabextract.org.uk/cabextract-1.2.tar.gz tar -zxvf cabextract-1.2.tar.gz -C /progi cd /progi/cabextract-1.2 ./configure make #make install # yum install cabextract $ cabextract bdeinst.cab wine c:/windows/system32/regsvr32.exe BdeInst.dll wine "c:/Program Files/Common Files/Borland Shared/BDE/BDEADMIN.EXE" # yum update kernel uname -a wine OOo_2.4.0_Win32Intel_install_ru_infra.exe ----------------------------------------------------------------------------------------------------------------- Фильтруем спам в Exim с помощью SpamProbe Павел Литвинов # cd /usr/ports/mail/spamprobe # make -s install clean # spamprobe -d /var/lib/spamprobe create-db system_filter = /usr/local/etc/spamprobe/exim.filter # system_filter_user = mailnull # system_filter_group = mail ########################################################## # ACL CONFIGURATION # # Specifies access control lists for incoming SMTP mail # ########################################################## # Exim filter # Ни в коем случае не удаляйте верхнюю строку # Путь к лог-файлу logfile /var/log/exim/spam-filter.log # Указываем максимальный размер письма, которое будет подвержено анализу (Кб). # Число взял из конфигурационного файла DSPAM add 307200 to n0 # Проверяем письмо только один раз, даже если Exim с первого раза его не сможет доставить. # Нечего плодить заголовки X-SpamProbe: if first_delivery then if $message_size is above $n0 then # Если не нужно вести Лог-файл закомментируйте строку ниже. logwrite "SPAM FILTER: Размер письма от $return_path превышает $n0 Kb ; Письмо не будет проходить проверку" else headers add "X-SpamProbe: ${run {/usr/local/etc/spamprobe/msgscore.sh ${message_id} ${quote:${message_headers}}} {$value} {expansion failed} }" # Если не нужно вести Лог-файл закомментируйте строку ниже. logwrite "SPAM FILTER: Письмо от $return_path успешно прошло проверку; $value" endif endif #!/bin/sh # Путь к месту, где почта хранится до момента доставки spooldir=/var/spool/exim/input # Путь к базе, где SpamProb хранит токены dbdir=/var/lib/spamprobe # Полный путь к программе SpamProbe path_spamprobe=/usr/local/bin/spamprobe # Находим полный путь к нашему письму. # Если бы не опция " split_spool_directory = true " в конфигурационном файле Exim # он бы соответствовал переменной ‘$spooldir/$1-D’ path_file=`/usr/bin/find $spooldir -name $1-D -print` echo "$2" > $spooldir/$1-M sed '1 s/.*//' $path_file >> $spooldir/$1-M $path_spamprobe -8 -d $dbdir score $spooldir/$1-M rm $spooldir/$1-M exit 0 ######################################################### # ROUTERS CONFIGURATION # # Specifies how addresses are handled # begin routers # SpamProbe start ############# SP_spam_router: driver = accept domains = +local_domains local_part_prefix = spam transport = SP_spam_transport SP_no-spam_router: driver = accept domains = +local_domains local_part_prefix = no-spam transport = SP_no-spam_transport # SpamProbe end ############### dnslookup: driver = dnslookup domains = ! +local_domains transport = remote_smtp ignore_target_hosts = 0.0.0.0 : 127.0.0.0/8 no_more # SpamProbe start ############# SP_check_router: driver = accept domains = +local_domains local_parts = lsearch;/usr/local/etc/spamprobe/users condition = ${if and {{match{$h_X-SpamProbe:}{SPAM}}{!match_address{$sender_address}{lsearch;/usr/local/etc/spamprobe/whitelist}}}} transport = SP_check_transport no_more # SpamProbe end ############### local_parts = lsearch;/usr/local/etc/spamprobe/users # Список пользователей, письма которых анализируются антиспамом admin maxim hostmaster oleg gl_sten condition = ${if and {{match{$h_X-SpamProbe:}{SPAM}}{!match_address{$sender_address}{lsearch;/usr/local/etc/spamprobe/whitelist}}}} # Список адресов, которым можно доверять, и не анализировать почту, приходящую от них murzilka@ukr.net meren@mail.ru office@predpriyatie.com info@rambler.ku ######################################################### # TRANSPORTS CONFIGURATION # # SpamProbe start ############# SP_check_transport: driver = pipe command = "/usr/local/libexec/dovecot/deliver -d $local_part@$domain -m INBOX.Spam" user = mailnull group = mail log_output = true return_path_add # headers_remove = X-SpamProbe SP_spam_transport: driver = pipe command = "/usr/local/bin/spamprobe –d /var/lib/spamprobe spam" return_path_add = false return_fail_output = true log_output = true user = mailnull group = mail SP_no-spam_transport: driver = pipe command = "/usr/local/bin/spamprobe –d /var/lib/spamprobe good" return_path_add = false return_fail_output = true log_output = true user = mailnull group = mail # SpamProbe end ############# #!/bin/bash spamprobe -d /var/lib/spamprobe spam ./spam/* spamprobe -d /var/lib/spamprobe good ./nonspam/* 0 3 * * * * root find /var/mail/*/*/.INBOX.Spam/new/* -ctime +30 -exec rm -f {} \; ----------------------------------------------------------------------------------------------------------------- Хитрости и тонкости работы, позволяющие экономить время Андрей Луконькин Год = 2003; Строка1 = Строка(Число1); Строка1 = Формат(Число1,"ЧГ=0"); Строка1 = Формат(ТекущаяДата(), "ДФ=yyyy"); Мод = Макс(А, -А); Неотр = Макс(А, 0); ----------------------------------------------------------------------------------------------------------------- Правда об идентификаторах безопасности Иван Коробко Листинг 1. Генерация GUID (V-Script) Set TypeLib = CreateObject("Scriptlet.TypeLib") wscript.Echo TypeLib.Guid Set TypeLib = Nothing S-R-X-Y1-Y2-…-Yn-1-Yn (1) A-B-C-Z1-Z2-…-Zn-1-Zn (2) 01 05 00 00 00 00 00 05 15 00 00 00 2C 8F EC FB E5 F2 48 01 35 A6 99 55 26 1B 00 00 (3) 01 05 00 00 00 00 00 05 15 00 00 00 2C 8F EC FB E5 F2 48 01 35 A6 99 55 26 1B 00 00 (4) S — 0x1 — 0x5 — 0 x 00 00 00 00 00 05 — 0 x 00 00 00 15 — 0 x FB EC 8F 2C — 0 x 01 48 F2 E5 — 0 x 55 99 A6 35 — 0 x 00 00 1B 26 (5) S — 1 — 5 — 21 — 4226584364 — 21557989 — 1436132917 — 6950 (6) GetSID.exe \\server1 account \\server2 account GetSID.exe \\MSK test \\MSK test ----------------------------------------------------------------------------------------------------------------- Новые возможности Heimdal Объединение открытых ключей и Kerberos Михаил Кондрин hxtool issue-certificate \ --self-signed \ --issue-ca \ --subject="CN=CA,DC=myrealm,DC=ru" \ --lifetime=10years \ --generate-key=rsa \ --certificate=FILE:ca.pem #hxtool print FILE:ca.pem openssl x509 -in ca.pem -text > ca.crt hxtool issue-certificate \ --subject="CN=www.myrealm.ru,DC=myrealm,DC=ru" \ --type="https-server" \ --hostname="www.myrealm.ru" \ --generate-key=rsa \ --ca-certificate=FILE:ca.pem \ --certificate=FILE:https.pem hxtool issue-certificate \ --subject="CN=www.myrealm.ru,DC=myrealm,DC=ru" \ --type="https-client" \ --generate-key=rsa \ --ca-certificate=FILE:ca.pem \ --certificate=FILE:https-client.pem SSLCertificateFile "/etc/httpd/ssl/https.pem" SSLCertificateChainFile "/etc/httpd/ssl/ca.crt" SSLCACertificateFile "/etc/httpd/ssl/ca.crt" SSLVerifyClient require SSLVerifyDepth 1 openssl pkcs12 -export \ -in https-client.pem \ -name HTTPS-Client \ -out https-client.p12 hxtool issue-certificate \ --type="pkinit-kdc" \ --pk-init-principal="krbtgt/MYREALM.RU@MYREALM.RU" \ --subject="uid=kdc,DC=myrealm,DC=ru" \ --generate-key=rsa \ --ca-certificate=FILE:ca.pem \ --certificate=FILE:kdc.pem hxtool issue-certificate \ --type="pkinit-client" \ --pk-init-principal="mike@MYREALM.RU" \ --subject="uid=mike,DC=myrealm,DC=ru" \ --generate-key=rsa \ --ca-certificate=FILE:ca.pem \ --certificate=FILE:mike.pem chmod -R 600 /home/mike/secure [kdc] enable-pkinit=yes pkinit_identity = FILE:/var/heimdal/secure/kdc.pem pkinit_anchors=FILE:/etc/ssl/ca.crt [appdefaults] pkinit_anchors = FILE:/etc/ssl/ca.crt [kinit] MYREALM.RU = { pkinit_anchors = FILE:/etc/ssl/ca.crt } #hxtool print FILE:ca.pem mike@MUREALM.RU:DC=ru,DC=myrealm,UID=mike #kinit \color{red}--pk-user=FILE:mike.pem \color{black} mike #klist -v certificate Certificate Mike FILE:/home/mike/secure/mike.pem kinit \color{red}--pk-user=PKCS11:libhx509.so \color{black} mike cat mike.pem > /dev/usb/sda1 #!/usr/bin/bash echo -n "Insert pem-certificate and hit enter when ready!" read /usr/bin/kinit -C FILE:/dev/sda1 $2 && \ /usr/bin/kgetcred host/$(hostname -f) && \ /usr/bin/login -f $2 ... c1:1235:respawn:/sbin/agetty -l /usr/local/bin/login.sh 38400 tty6 linux c2:1235:respawn:/sbin/agetty -l /usr/local/bin/login.sh 38400 tty6 linux ... ----------------------------------------------------------------------------------------------------------------- XML-native DB. XQuery Александр Календарев Пример 1. Простое использование XPath doc("auction")/site/regions/*/name() SELECT * FROM TABLE Пример 2. Усложненное использование XPath doc("auction")/site/regions/*[ name()='asia']/item SELECT * FROM TABLE regions WHERE name='asia' Пример 3. Использование выражений FLWOR for $reg in doc("auction")/site/regions/* return $reg/name() Пример 4. Использование выражений FLWOR for $reg in doc("auction")/site/regions/* where $reg/name()='asia' return $reg/item {$reg/name()} Пример 5. Использование конструктора выражений for $reg in doc("auction")/site/regions/* return {$reg/name()} Пример 6. Более расширенное использование конструктора выражений for $reg in doc("auction")/site/regions return { for $r in $reg/* return {$r/name()} } Пример 7. Выборка и упорядочивание for $reg in doc("auction")/site/regions/* return { for $loc in $reg/item order by $loc/location return } Пример 8. Группировка let $person := doc("auction")/site/people/person for $p in $person return {$p/name/text()} let $country := distinct-values($person/address/country) Пример 9. Группировка let $person := doc("auction")/site/people/person let $country := distinct-values($person/address/country) for $c in $country return { for $p in $person[address/country=$c ] return {$p/name} } SELECT name, country FROM table GROUP BY country Пример 10. Выборка по одному множеству let $auc := doc("auction")/site/open_auctions for $a in $auc/open_auction return { for $p in $a/bidder/personref/@person return {$p} } let $person := doc("auction")/site/people/person Пример 11. Пересечение выборок let $auc := doc("auction")/site/open_auctions let $person := doc("auction")/site/people/person for $a in $auc/open_auction return { for $p in $person[@id = $a/bidder/personref/@person] return {$p/name/text()} } $person[@id=$a/bidder/personref/@person] Пример 12. Выборка с условием let $price := doc("auction")/site/closed_auctions/closed_auction/price for $p in $price return if ( $p < 30 ) then {data($p)} else {data($p)} Пример 13. Использование встроенных функций let $name := doc("auction")/site/regions/*/name() for $n in $name return concat( $n, " is region tag") Пример 14. Объявление функции declare function math:increment($num as xs:decimal) as xs:decimal { $num + 1 }; define type user { attribute id of xs:ID element rating ? } declare namespace fn="http://nycompany.ru/Sedna/fn"; Пример 15. Выражение Update. Вставка узла UPDATE insert John Smith 223-322-223-322 3454 3656 2344 6767 into document("auction")/site/people Пример 16. Выражение Update. Удаление узла UPDATE delete document("auction")/site/people/person[name/text()="John Smith"] Пример 17. Выражение Update. Замена узла UPDATE replace $g in document("auction")/site/people/person[@id="person25"]/name with Ivanov Ivan Пример 18. Запрос на выборку товаров по всей категории «пылесосы» let $catalog := doc("catalog")/category[@name = "пылесосы"] let $goods := doc("goods")/brand/item for $g in $goods where $catalog/@id = $g/@category return $g Пример 19. Запрос на выборку товаров по имени товара let $goods := doc("items2")/goods/brand/item for $g in $goods where @name="TWNtt" return $ Пример 20. Запрос на выборку товаров по части имени: let $goods := doc("items2")/goods/brand/item for $g in $goods where fn:contains( $g/@name ,"S80" ) return $g LoadModule sedna_module modules/mod_sedna.so LoadModule apreq_module modules/mod_apreq.so AddHandler sedna-handler .xqy .xquery Alexandre let $id = document("request_parameters")/data/person/@id; let $name = document("request_parameters")/data/person/text(); -----------------------------------------------------------------------------------------------------------------