FreeBSD tips: какими возможностями обладает ftpd Сергей Супрунов #!/usr/local/bin/python # lystener – скрипт для прослушивания указанного порта import sys, socket host = str(sys.argv[1]) port = int(sys.argv[2]) s = socket.socket() s.bind((host, port)) s.listen(1) m = s.accept() print 'Connected on', m[1] while(1): rsv = str(m[0].recv(256)) print rsv if rsv == '': print 'No data more. Connection is closed.' break; m[0].close() s.close() EPRT |протокол|адрес|порт| #ftp stream tcp nowait root /usr/libexec/ftpd ftpd -l #!/bin/sh # # PROVIDE: ftpd # REQUIRE: DAEMON LOGIN # KEYWORD: shutdown . /etc/rc.subr name="ftpd" rcvar=`set_rcvar` command="/usr/libexec/${name}" load_rc_config $name ftpd_flags="-D ${ftpd_flags}" run_rc_command "$1" ftpd_enable="YES" ftpd_flags="-E" # /etc/rc.d/ftpd start # /etc/rc.d/ftpd stop vasya petya /var/db/petya @dialup serg /home/serg/./public_html ----------------------------------------------------------------------------------------------------------------- Автоматизируем установку драйверов в Windows Алексей Барабанов # fdformat /dev/fd0 # mkdosfs /dev/fd0 # umount /dev/fd0 # mkdosfs /dev/fd0 # mount /dev/fd0 # mount -t iso9660 -o ro,loop /usr/lib/vmware/isoimages/windows.iso /mnt # cp -v /mnt/program\ files/VMware/VMware\ Tools/Drivers/scsi/win2k/* /media/floppy # umount /dev/fd0 # diff -Naur TXTSETUP.SIF.orig TXTSETUP.SIF --- TXTSETUP.SIF.orig 2005-10-27 10:15:56.000000000 +0400 +++ TXTSETUP.SIF 2005-10-29 21:32:40.000000000 +0400 @@ -206,6 +206,9 @@ isapnp.sys = 1,,,,,,3_,4,1,,,1,4 +vmscsi.sys = 1,,,,,,_x,4,1,,,1,4 + + ksecdd.sys = 100,,,,,,_5,4,0,0,,1,4 mountmgr.sys = 100,,,,,,3_,4,0,0,,1,4 mrxdav.sys = 100,,,,,,,4,0,0 @@ -18836,6 +18839,8 @@ *PNP0E02 = "pcmcia" *PNP0700 = "fdc" +PCI\VEN_104B&DEV_1040 = "vmscsi" + *PNP0300 = "i8042prt",{4D36E96B-E325-11CE-BFC1-08002BE10318} *PNP0301 = "i8042prt",{4D36E96B-E325-11CE-BFC1-08002BE10318} *PNP0302 = "i8042prt",{4D36E96B-E325-11CE-BFC1-08002BE10318} @@ -19281,6 +19286,7 @@ dac2w2k = dac2w2k.sys,4 +vmscsi = vmscsi.sys,4 [BootBusExtenders.Load] @@ -21639,6 +21645,7 @@ perc2 = "Dell PERC 2|3 RAID-БЮЮ" perc2gat = "Dell PERC 2/3 RAID-БЮЮ (Gatling)" +vmscsi = "VMware SCSI Controller" [BootBusExtenders] pci = "└Ю═╘╒╔Ю Х╗╜К PCI",files.pci,pci PCI\VEN_1106&DEV_3249 = "viamraid" PCI\VEN_1106&DEV_3149 = "viamraid" PCI\VEN_1106&DEV_3164 = "viamraid" OemPnPDriversPath="Drivers\Very_looooong_filename" DriverSigningPolicy=Ignore # ls -l /uawsp2/\$OEM\$/\$1/Drivers/Very_looooong_filename # grep -n rmdir WINNT.SIF 539:"%windir%\system32\cmd.exe /c rmdir %systemdrive%\InstData /s /q" 540:"%windir%\system32\cmd.exe /c rmdir %systemdrive%\Drivers /s /q" # ls -l /uawsp2/\$OEM\$ # cat /heap2/unattended-win/uawsp2/\$OEM\$/Drivers.au3 ProcessSetPriority("setup.exe",0) Run(@ScriptDir & "\WatchDriverSigningPolicy.exe") ProcessWait("WatchDriverSigningPolicy.exe") RunWait(@ScriptDir & "\SetupCopyOEMInf.exe Drivers") ProcessClose("WatchDriverSigningPolicy.exe") ProcessSetPriority("setup.exe",2) DetachedProgram="%windir%\system32\cmd.exe" Arguments="/Q /C FOR /F %I IN (%SystemRoot%\SYSTEM32\$WINNT$.INF) DO (FOR %J IN (%I$OEM$) DO (IF EXIST %J start /min /D%J Autoit3.exe Drivers.au3)))" ----------------------------------------------------------------------------------------------------------------- GRUB на CD, или Ещё один способ восстановить MBR Алексей Мичурин default 0 timeout 300 color light-green/black black/green # FreeBSD title FreeBSD /dev/ad0s1a root (hd0,0,a) kernel /boot/loader title FreeBSD /dev/ad0s2a root (hd0,1,a) kernel /boot/loader title FreeBSD /dev/ad0s3a root (hd0,2,a) kernel /boot/loader title FreeBSD /dev/ad0s4a root (hd0,3,a) kernel /boot/loader # Linux title Linux (/boot/vmlinuz) /dev/hda1 root (hd0,0) kernel /boot/vmlinuz root=/dev/hda1 title Linux (/boot/vmlinuz) /dev/hda2 root (hd0,1) kernel /boot/vmlinuz root=/dev/hda2 title Linux (/boot/vmlinuz) /dev/hda3 root (hd0,2) kernel /boot/vmlinuz root=/dev/hda3 title Linux (/boot/vmlinuz) /dev/hda4 root (hd0,3) kernel /boot/vmlinuz root=/dev/hda4 # Windows title Windows rootnoverify (hd0,0) chainloader +1 makeactive # halt/reboot title REBOOT reboot title HALT halt title FreeBSD rootnoverify (hd0,0) chainloader +1 title LILO on hda2 rootnoverify (hd0,1) chainloader +1 kernel --type=netbsd /boot/netbsd-elf chainloader +4 mkisofs -R \ -jcharset koi8-r \ -b boot/grub/stage2_eltorito \ -c boot/boot.catalog \ -no-emul-boot \ -boot-load-size 4 \ -boot-info-table \ -o boot.iso \ iso cdrecord -dev=0,1,0 -data boot.iso burncd -v -f /dev/acd0 data boot.iso fixate configfile (hd0,2)/boot/grub/menu.lst ./configure \ --prefix=$HOME/GRUB \ --enable-preset-menu=menu.lst dd if=/dev/hda1 of=DOS-BOOT-IMAGE bs=512 count=1 chainloader (cd)/boot/DOS-BOOT-IMAGE title Linux (kernel root=/dev/hda1) kernel (cd)/boot/vmlinuz root=/dev/hda1 ----------------------------------------------------------------------------------------------------------------- Тонкий клиент – шаг к мэйнфреймам? Антон Борисов FLASH879 /SBIOS.BIN CBROM.EXE BIOS.BIN /D CBROM.EXE BIOS.BIN /PCI release CBROM.EXE BIOS.BIN /PCI netboot.rom CBROM.EXE BIOS.BIN /D FLASH879 BIOS.ROM /A /B /E /R tftp dgram udp wait root /usr/sbin/in.tftpd in.tftpd -s /tftpboot -vv service tftp { socket_type = dgram protocol = udp wait = yes user = root server = /usr/sbin/in.tftpd server_args = -l -s /tftpboot disable = no } # killall -HUP inetd ddns-update-style none; subnet 10.0.0.0 netmask 255.0.0.0 { option broadcast-address 10.0.255.255; max-lease-time 7200; default-lease-time 600; } host TS_EPIA_M_01 { hardware ethernet 00:40:63:d6:69:d7; fixed-address 10.0.0.50; filename "pxelinux.0"; } # wget Thinstation-2.1.3.tar.gz # tar xzvf Thinstation-2.1.3.tar.gz # cd Thinstation-2.1.3 1 module agpgart 2 module 3c59x 3 module 8139too 4 module e100 5 module via-rhine 6 module usb-hid 7 module usb-storage 8 module smbfs 9 package xorg6-vesa 10 package keymaps-en_us 11 package rdesktop 12 package vncviewer 13 package rxvt 14 package xterm 15 package ssh 16 package blackbox 17 package xtdesk 18 param rootpasswd root 19 param xorgvncpasswd vnc 20 param bootlogo true 21 param bootresolution 1024x768 22 param bootverbosity 7 package ica param icaurl http://download2.citrix.com/files/en/products/client/ica/current/linuxx86.tar.gz KEYBOARD_MAP=ru # ./build # su - # cp -R ./boot-images/pxe /tftpboot ----------------------------------------------------------------------------------------------------------------- Развертываем сервер Subversion на платформе FreeBSD Андрей Шетухин, Ольга Никулина make buildworld make installworld DESTDIR=$D # cd /usr/src # mkdir -p /usr/home/jails/svn # make buildworld # make installworld DESTDIR=/usr/home/jails/svn # cd etc # make distribution DESTDIR=/usr/home/jails/svn jail_enable="YES" # Включаем загрузку jail jail_list="svn" # Список всех jail, которые есть в системе jail_set_hostname_allow="NO" # Запрещаем изменение hostname из jail jail_socket_unixiproute_only="YES" # Разрешаем для jail обмен только по TCP/IP jail_sysvipc_allow="NO" # Запрещаем SystemV IPC внутри jail # Для jail с именем "svn" jail_svn_rootdir="/usr/home/jails/svn" # Каталог jail jail_svn_hostname="svn.reki.ru" # Имя хоста jail jail_svn_ip="XX.YY.XX.TT" # IP адрес jail_svn_exec="/bin/sh /etc/rc" # Скрипт инициализации jail_svn_devfs_enable="YES" # Монтировать devfs в jail # vipw -d /usr/home/jails/svn/etc # pw -V /usr/home/jails/svn/etc useradd admin -g 0 -d /usr/home/jails/svn/usr/home/admin -s /bin/csh -h 0 -m # jls # ssh XX.YY.XX.TT -l admin # su - root # cd /usr # fetch ftp://ftp.freebsd.org/pub/FreeBSD/ports/ports/ports.tar.gz # tar -xzf ports.tar.gz # cd /usr/ports/www/apache2 # setenv WITH_BERKELEYDB db42 # cd files # fetch http://reki.ru/products/subversion/patch-server-ssl_engine_kernel.c # cd ../ # make install clean # cd /usr/ports/devel/subversion # setenv WITH_MOD_DAV_SVN yes # setenv WITH_APACHE2_APR yes # make install clean # cd /usr/ports/print/enscript-a4 # make install clean # cd /usr/ports/lang/php4 # make install clean # cd /usr/ports/lang/php4-extensions # make install clean # cd /usr/ports/devel/websvn # make install clean # mkdir -p /usr/home/www/svn/svn.reki.ru/www # mkdir -p /var/log/apache/www/svn.reki.ru # cp -r /usr/local/www/data/WebSVN /usr/home/www/svn/svn.reki.ru/www // Правим файл конфигурации фронтэнда # vi /usr/home/www/svn/svn.reki.ru/www/include/config.inc // Указываем пути к программам svn, diff, sed, tar и gzip $config->setSVNCommandPath("/usr/local/bin"); $config->setDiffPath("/usr/bin"); $config->setSedPath("/usr/bin"); $config->setTarPath("/usr/bin"); $config->setGZipPath("/usr/bin"); // Перечисляем все те репозитории, которые должны быть доступны через фронтэнд $config->addRepository("Example Repository #1", "/usr/home/svn/example"); $config->addRepository(«Example Repository #2", "/usr/home/svn/example2"); // Язык веб-интерфейса include("languages/russian.inc"); // Кодировки веб-интерфейса $config->setInputEncoding("windows-1251"); $config->setOutputEncoding("windows-1251"); // Включить кэширование данных для фронтэнда $config->setCachingOn(); // Разрешить скачивание проекта в виде tar.gz-архива $config->allowDownload(); // Включить подсветку синтаксиса программой enscript $config->setEnscriptPath("/usr/local/bin"); $config->useEnscript(); # openssl req -new -newkey rsa:1024 -x509 -days 3650 -nodes -out ca.crt -keyout ca.key -subj /C=RU/ST=-/L=Moscow/O=Reki.ru/OU=Certificate_Issuer/CN=reki.ru/emailAddress=admin@reki.ru [ca] default_ca = CA_CLIENT [CA_CLIENT] dir = ./db # Рабочий каталог для базы данных клиентских ключей certs = $dir/certs # Каталог для новых сертификатов new_certs_dir = $dir/newcerts # Каталог, куда будут складываться выписанные сертификаты database = $dir/index.txt # Индекс базы данных выписанных ключей serial = $dir/serial # Номер текущего ключа certificate = ./ca.crt # Собственный самоподписанный сертификат CA private_key = ./ca.key # Закрытый ключ сертификата CA default_days = 365 # Время, на которое выписывается клиентский сертификат default_crl_days = 7 # Срок действия CRL default_md = md5 # Алгоритм подписи policy = policy_anything # Название секции политики [policy_anything] countryName = optional # Разрешаем не указывать код страны stateOrProvinceName = optional # ------ // ------- название штата или округа localityName = optional # ------ // ------- название города/деревни organizationName = optional # ------ // ------- название организации organizationalUnitName = optional # ------ // ------- название отдела commonName = supplied # Обязательно указать имя. emailAddress = optional # Почтовый адрес можно не указывать # mkdir -p /usr/local/etc/crt # cd /usr/local/etc/crt // Создаем и редактируем файл конфигурации # vi ca.config # mkdir ./db # mkdir ./db/certs # mkdir ./db/newcerts # touch ./db/index.txt # echo "01" > ./db/serial # openssl req -new -newkey rsa:1024 -nodes -keyout server.key -out server.csr -subj /C=RU/ST=-/L=Moscow/O=Reki.ru/OU=SVN/CN=svn.reki.ru/emailAddress=svn@svn.reki.ru # openssl ca -config ca.config -in server.csr -out server.crt -batch # cp server.crt /usr/local/etc/apache2/ssl.crt/server.crt # cp server.key /usr/local/etc/apache2/ssl.key/server.key # cp ca.crt /usr/local/etc/apache2/ssl.crt/ca.crt # mkdir -p /var/log/apache/www/svn.reki.ru # mkdir -p /usr/home/www/svn/svn.reki.ru/www DocumentRoot /usr/home/www/svn/svn.reki.ru/www ServerName svn.reki.ru:443 ServerAdmin admin@svn.reki.ru ErrorLog /var/log/apache/www/svn.reki.ru/error_log CustomLog /var/log/apache/www/svn.reki.ru/access_log "%t %h %{SSL_PROTOCOL}x %{SSL_CIPHER}x \"%r\" %b" SSLEngine on SSLCipherSuite ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP:+eNULL SSLCertificateFile /usr/local/etc/apache2/ssl.crt/server.crt SSLCertificateKeyFile /usr/local/etc/apache2/ssl.key/server.key SSLCACertificateFile /usr/local/etc/apache2/ssl.crt/ca.crt SSLVerifyClient require # Пускаем только тех пользователей, которые имеют подписанные нами сертификаты SSLVerifyDepth 1 SSLVerifyClient require # Для совместной работы этих опций SSLOptions +FakeBasicAuth SSLUserName SSL_CLIENT_S_DN_CN # необходим патч AuthName "SVN" AuthType Basic AuthUserFile /usr/home/www/svn/svn.reki.ru/.htpasswd_ssl require valid-user DAV svn # Обработчик DAV - svn # общий каталог для репизиториев SVNParentPath /usr/home/svn AuthzSVNAccessFile /usr/home/www/svn/svn.reki.ru/.htauth_svn require valid-user SetEnvIf User-Agent «.*MSIE.*» nokeepalive ssl-unclean-shutdown downgrade-1.0 force-response-1.0 stellar:xxj31ZMTZzkVA oniks:xxj31ZMTZzkVA # имя репозитория:/путь [example:/] # Имена пользователей = права доступа stellar = rw oniks = rw [example2:/] stellar = rw oniks = r # svnadmin create /usr/home/svn/example # svnadmin create /usr/home/svn/example2 # chown -R www:www /usr/home/svn/ # svnadmin create /usr/home/svn/example # mkdir -p /usr/local/share/svn/skel // Каталог с шаблоном репозитория # cd /usr/local/share/svn/skel # mkdir branches tags trunk # svn import /usr/local/share/svn/skel/tree file:///usr/home/svn/example -m "initial import" apache2_enable="YES" apache2ssl_enable="YES" # /usr/local/etc/rc.d/apache2.sh start # ps axw | grep httpdvv # cd /usr/ports/mail/svnmailer # make install clean #!/bin/sh REPOS="$1" REV="$2" /usr/local/bin/svn-mailer --commit --repository "${REPOS}" --revision "${REV}" --config /usr/local/etc/svn/mailer.conf & [example] # Имя репозитория for_repos = .*/example from_addr = %(author)s # Список рассылки to_addr = test-developersA@example.ru [examle2] for_repos = .*/example2 from_addr = %(author)s to_addr = test-developersB@example.ru [maps] # Список подстановок from_addr = [authors] # Авторы to_addr = [mailing-lists] # Подписчики [authors] oniks = nikulina@example.ru stellar = stellar@example.ru [mailing-lists] oniks = nikulina@example.ru stellar = stellar@example.ru test-developersA = test-developersA@example.ru test-developersB = test-developersB@example.ru test-developersC = test-developersC@example.ru # openssl req -new -newkey rsa:1024 -nodes -keyout stellar.key -out stellar.csr -subj /C=RU/ST=-/L=Moscow/O=Reki.ru/OU=SVN/CN=stellar/emailAddress=stellar@reki.ru # openssl ca -config ca.config -in stellar.csr -out stellar.crt -batch # openssl pkcs12 -export -in stellar.crt -inkey stellar.key -certfile ca.crt -out server.p12 -passout pass: stellar:xxj31ZMTZzkVA # svn list https://svn.reki.ru/svn/example/ # svn list https://svn.reki.ru/svn/example/ ----------------------------------------------------------------------------------------------------------------- bugtraq, стр. 53 BOOL CreateProcess( LPCTSTR lpПриложениеName, LPTSTR lpCommandLine, LPSECURITY_ATTRIBUTES lpProcessAttributes, LPSECURITY_ATTRIBUTES lpThreadAttributes, BOOL bInheritHandles, DWORD dwCreationFlags, LPVOID lpEnvironment, LPCTSTR lpCurrentDirectory, LPSTARTUPINFO lpStartupInfo, LPPROCESS_INFORMATION lpProcessInformation ); CreateProcess( NULL, c:\program files\sub dir\program.exe, ... ); c:\program.exe files\sub dir\program name c:\program files\sub.exe dir\program name c:\program files\sub dir\program.exe ----------------------------------------------------------------------------------------------------------------- Расширяем права доступа в Linux с помощью ACL Сергей Яремчук # grep 'XATTR\|POSIX_ACL' /usr/src/linux/.config CONFIG_EXT2_FS_XATTR=y CONFIG_EXT2_FS_POSIX_ACL=y CONFIG_EXT3_FS_XATTR=y CONFIG_EXT3_FS_POSIX_ACL=y CONFIG_REISERFS_FS_XATTR=y CONFIG_REISERFS_FS_POSIX_ACL=y CONFIG_FS_POSIX_ACL=y CONFIG_XFS_POSIX_ACL=y # CONFIG_DEVPTS_FS_XATTR is not set # CONFIG_TMPFS_XATTR is not set # CONFIG_CIFS_XATTR is not set # apt-get install acl attr # mount /home -o remount,acl /dev/hda5 /home reiserfs defaults,acl 1 1 # mkdir test_acl # setfacl -dm user:sergej:rw,group:sales:rwx test_acl # getfacl test_acl # setfacl -dm u:sergej:rw test_file # setfacl -m m::rx file # setfacl -dm u:sergej:rw /home/sergej/acl # mkdir test_acl/subdir # getfacl test_acl/subdir # mount /home -o remount,acl # getfacl test_acl/test_file # ls -al test_acl # mv test_acl work # getfacl work/test_acl # mv test_acl /home/sergej/ # getfacl /home/sergej/test_acl # touch test_acl_file # setfacl -m u:vasja:rw,g:webmaster:rwx test_acl_file # getfacl test_acl_file # apt-get install acl attr # getfacl test_acl_2 # cp test_acl_file test_acl # getfacl test_acl/test_acl_file # mkdir dir # setfacl -m u:fedja:rw,g:netadmin:rwx test_acl_file # getfacl dir # cp test_acl_file dir # getfacl dir/test_acl_file # getfacl -R --skip-base . > backup.acl # setfacl --restore=backup.acl # getfacl -a dir | setfacl -M - dir # getfacl file1 | setfacl -S- file2 # setfacl -x g:sales test_acl # setfacl -m u:fedja:rw,g:netadmin:rwx test_acl_file # setfacl -m default:u::rx acldir smbcacls //server/share filename [options] # cd /usr/src/linux-2.6.11 # patch -p1 < ../2.6.11.diff # # Security options # CONFIG_SECURITY=y CONFIG_SECURITY_TRUSTEES=y # make KDIR=/usr/src/linux-2.6.11 install [/block/device]/any/path:usr1:flags:+grp1:flags... [/network/share]I/any/path:+grp2:flags:*:flags... [/dev/hda5]/sergej [/dev/hda5]/home/sergej [/dev/hda6]/win/test:sergej:REBO # mkdir /mnt/win/test # mount -t trusteesfs none /mnt/win/test # mount | grep trusteesfs # touch /mnt/win/test/test_file # settrustees -D [/dev/hda3]/httpd/htdocs:apache:REBX [/dev/hda3]/httpd/htdocs:+web_editors:RWEBX ----------------------------------------------------------------------------------------------------------------- Windows Script Host: проводим аудит безопасности сети Андрей Бирюков Листинг 1. SQL-скрипт для создания таблицы Logons CREATE TABLE [dbo].[Logons] ( [id] [int] IDENTITY (1, 1) NOT NULL , [Event_vch] [varchar] (50) COLLATE Cyrillic_General_CI_AS NULL , [Date_dat] [datetime] NULL , [User_vch] [varchar] (50) COLLATE Cyrillic_General_CI_AS NULL , [WID_vch] [varchar] (50) COLLATE Cyrillic_General_CI_AS NULL , [Address_vch] [varchar] (50) COLLATE Cyrillic_General_CI_AS NULL ) ON [PRIMARY] GO SELECT Max(Date_dat) AS Last FROM Logons Листинг 2. Функция substring для поиска вхождений искомой строки Function SubString(Str1) strpos1=InStr(1,Str,str1) strtemp=Right(Str, Len(str)-strpos1-Len(str1)) strpos2=InStr(1,Strtemp,Chr(10)) SubString=trim(Left(strtemp,strpos2)) End Function Листинг 3. Сценарий для поиска и сохранения искомых сообщений в базе данных Dim Cnxn, strCnxn Dim rsCustomers, strSQLCustomers Dim EventDate, EventTime, EventTmp Dim objWMI, objItem ' Objects Dim strComputer Dim intEvent,intRec, colLoggedEvents Dim Str, strtemp Function SubString(Str1) strpos1=InStr(1,Str,str1) strtemp=Left(Right(Str, strpos1+2), Len(str1)) strpos2=InStr(1,Strtemp,Chr(10)) SubString=Left(strtemp,strpos2) End Function strComputer="127.0.0.1" Set objWMI = GetObject("winmgmts:" _ & "{impersonationLevel=impersonate}!\\" _ & strComputer & "\root\cimv2") Set colLoggedEvents = objWMI.ExecQuery _ ("Select * from Win32_NTLogEvent Where Logfile = 'Security'" ) Set Cnxn = wscript.CreateObject("ADODB.Connection") strCnxn = "Provider='sqloledb';Data Source=" & _ "127.0.0.1;" & _ "Server=MyServer;Database=Audit;Trusted_Connection=yes" // устанавливаем соединение с SQL-сервером Cnxn.Open strCnxn LastRec="" Line=" SELECT Max(Date_dat) AS Last FROM Logons" Set rs=Cnxn.execute(Line) 'wscript.echo rs("Last") If not(rs.eof) Then LastRec=Left(rs("Last"),19) // находим дату последней записи rs.close last=0 intRec=0 For Each objItem in colLoggedEvents EventTmp=Mid(objItem.TimeWritten, 7,2)+"."+Mid(objItem.TimeWritten, 5, 2)+"."+Mid(objItem.TimeWritten, 1,4)+" "+Mid(objItem.TimeWritten, 9,2)+":"+Mid(objItem.TimeWritten, 11, 2)+":"+Mid(objItem.TimeWritten, 13,2) // время каждого события If (EventTmp=LastRec) Then Last=1 // сравниваем If Last=0 Then // пока даты не равны, ищем соответствующие события If objItem.eventCode=675 Then str=objItem.message IpAddr=substring("Client Address:") UserName=substring("User Name:") UserID=substring("User ID:") EventDate=Mid(objItem.TimeWritten,5,2)+"."+Mid(objItem.TimeWritten, 7, 2)+"."+Mid(objItem.TimeWritten, 1,4) EventTime=Mid(objItem.TimeWritten,9,2)+":"+Mid(objItem.TimeWritten,11,2)+":"+Mid(objItem.TimeWritten, 13,2) Str=objItem.message Line=” INSERT INTO dbo.Logons ( Event_vch, Date_dat, User_vch, WID_vch, Address_vch)VALUES ( '675', CONVERT(DATETIME, '"+EventDate+"', 110)+ CONVERT(DATETIME, '"+EventTime+"', 114), '"+UserName+"','"+UserID+"','"+IpAddr+"')" Set rs=Cnxn.execute(Line) End if If objItem.eventCode=673 Then str=objItem.message IpAddr=substring("Client Address:") UserName=substring("User Name:") UserID=substring("Service Name:") EventDate=Mid(objItem.TimeWritten, 5,2)+"."+Mid(objItem.TimeWritten, 7, 2)+"."+Mid(objItem.TimeWritten, 1,4) EventTime=Mid(objItem.TimeWritten, 9,2)+":"+Mid(objItem.TimeWritten, 11, 2)+":"+Mid(objItem.TimeWritten, 13,2) Str=objItem.message Line=" INSERT INTO dbo.Logons ( Event_vch, Date_dat, User_vch, WID_vch, Address_vch) VALUES ( '673', CONVERT(DATETIME, '"+EventDate+"', 110)+CONVERT(DATETIME, '"+EventTime+"', 114), '"+UserName+"', '"+UserID+"','"+IpAddr+"')" Set rs=Cnxn.execute(Line) End if If objItem.eventCode=538 Then str=objItem.message IpAddr=substring("User Name:") EventDate=Mid(objItem.TimeWritten, 5,2)+"."+Mid(objItem.TimeWritten, 7, 2)+"."+Mid(objItem.TimeWritten, 1,4) EventTime=Mid(objItem.TimeWritten, 9,2)+":"+Mid(objItem.TimeWritten, 11, 2)+":"+Mid(objItem.TimeWritten, 13,2) Str=objItem.message Line=" INSERT INTO dbo.Logons ( Event_vch, Date_dat, User_vch, WID_vch, Address_vch) VALUES ( '538', CONVERT(DATETIME, '"+EventDate+"', 110)+CONVERT(DATETIME, '"+EventTime+"', 114), '"+UserName+"','','')" Set rs=Cnxn.execute(Line) End if End If intrec=intRec+1 Next cnxn.close Листинг 4. Сценарий для построения отчетов strComputer="127.0.0.1" Set objWMI = GetObject("winmgmts:" _ & "{impersonationLevel=impersonate}!\\" _ & strComputer & "\root\cimv2") Set colLoggedEvents = objWMI.ExecQuery _ ("Select * from Win32_NTLogEvent Where Logfile = 'Security'") Set objFso = CreateObject("Scripting.FileSystemObject") ' open connection Set Cnxn = wscript.CreateObject("ADODB.Connection") strCnxn = "Provider='sqloledb';Data Source=" & _ "127.0.0.1;" & _ "Server=MyServer;Database=Audit;Trusted_Connection=yes" Cnxn.Open strCnxn Set strFile = objFso.CreateTextFile("c:\report.htm", True) strFile.WriteLine("Аудит системы") strFile.WriteLine("
Отчет от "& Date &"") DateNow= Line=" SELECT DISTINCT(User_vch) FROM Logons" Set rs1=Cnxn.execute(Line) Do While not(rs1.eof) Line=" SELECT * FROM Logons WHERE (Date_dat > CONVERT(DATETIME, '" & Date &" 00:00:00', 102)) AND (Date_dat < CONVERT(DATETIME, '" & Date & " 23:59:59', 102)) AND (User_vch = '"+rs1("User_vch")+"')" Set rs2=Cnxn.execute(Line) strFile.WriteLine("") strFile.WriteLine(" ") strFile.WriteLine(" ") strFile.WriteLine(" ") strFile.WriteLine(" ") strFile.WriteLine(" ") strFile.WriteLine("") rs2.close rs1.MoveNext loop strFile.WriteLine("
Имя пользователяВремя событияСобытиеUserIDIP адрес
") strFile.WriteLine(rs2("User_vch")) strFile.WriteLine(" ") strFile.WriteLine(rs2("Date_dat")) strFile.WriteLine(" ") If (rs2(“Event_vch”)="673") Then strFile.WriteLine("Неудачная попытка входа") If (rs2("Event_vch”)="675") Then strFile.WriteLine("Удачный вход") If (rs2("Event_vch")="538") Then strFile.WriteLine("Выход из системы") strFile.WriteLine(" ") strFile.WriteLine(rs2("WID_vch")) strFile.WriteLine(" ") strFile.WriteLine(rs2("Address_vch")) strFile.WriteLine("
") rs1.close Cnxn.close Set WshShell = CreateObject("WScript.Shell") Return = WshShell.Run("iexplore.exe c:\report.htm", 1) Листинг 5. Запрос, возвращающий самый ранний logon и самый поздний logoff SELECT MAX(Date_dat) AS Last, MIN(Date_dat) AS First, User_vch FROM Logons WHERE (Date_dat > CONVERT(DATETIME, '2005-11-01 00:00:00', 102)) AND (Date_dat < CONVERT(DATETIME, '2005-11-01 23:59:59', 102)) AND (User_vch = '"+rs1("User_vch")+"') AND ((Event_vch='675') OR (Event_vch='538')) GROUP BY User_vch Листинг 6.Сценарий построения отчета для контроля рабочего времени strComputer="127.0.0.1" Set objWMI = GetObject("winmgmts:" _ & "{impersonationLevel=impersonate}!\\" _ & strComputer & "\root\cimv2") Set colLoggedEvents = objWMI.ExecQuery _ ("Select * from Win32_NTLogEvent Where Logfile = 'Security'") Set objFso = CreateObject("Scripting.FileSystemObject") Set Cnxn = wscript.CreateObject("ADODB.Connection") strCnxn = "Provider=’sqloledb’;Data Source=" & _ "127.0.0.1;" & _ "Server=MyServer;Database=Audit;Trusted_Connection=yes" Cnxn.Open strCnxn Set strFile = objFso.CreateTextFile("c:\report.htm", True) strFile.WriteLine("Учет времени") strFile.WriteLine("
Отчет") Line=" SELECT DISTINCT(User_vch) FROM Logons" // извлекаем имена пользователей Set rs1=Cnxn.execute(Line) Do While not(rs1.eof) For i=1 to 30 // Цикл по количеству дней в месяце Line=" SELECT MAX(Date_dat) AS Last, MIN(Date_dat) AS First, User_vch FROM Logons WHERE (Date_dat > CONVERT(DATETIME, '2005-11-"& i &" 00:00:00', 102)) AND (Date_dat < CONVERT(DATETIME, '2005-11-""& i &" 23:59:59', 102)) AND (User_vch = ‘'"+rs1 ("User_vch")+"') AND ((Event_vch='675') OR (Event_vch='538')) GROUP BY User_vch" Set rs2=Cnxn.execute(Line) If not(rs2.eof) Then strFile.WriteLine("") strFile.WriteLine(" ") strFile.WriteLine(" ") strFile.WriteLine(" ") strFile.WriteLine("") End If rs2.close Next rs1.MoveNext loop strFile.WriteLine("
Имя пользователяВремя приходаВремя ухода
") strFile.WriteLine(rs2("User_vch")) strFile.WriteLine(" ") strFile.WriteLine(rs2("First")) strFile.WriteLine(" ") strFile.WriteLine(rs2(«Last»)) strFile.WriteLine("
") rs1.close Set WshShell = CreateObject("WScript.Shell") Return = WshShell.Run("iexplore.exe c:\report.htm", 1) Cnxn.close ----------------------------------------------------------------------------------------------------------------- Расширения РHP: пять шагов к написанию Александр Календарев # ./ext_skel # ./ext_skel --extname=module # ./ext_skel --extname=test 1 dnl $Id$ 2 dnl config.m4 for extension test 3 4 dnl Comments in this file start with the string 'dnl'. 5 dnl Remove where necessary. This file will not work 6 dnl without editing. 7 8 dnl If your extension references something external, use with: 9 10 dnl PHP_ARG_WITH(test, for test support, 11 dnl Make sure that the comment is aligned: 12 dnl [ --with-test Include test support]) 13 14 dnl Otherwise use enable: 15 16 PHP_ARG_ENABLE(test, whether to enable test support, 17 dnl Make sure that the comment is aligned: 18 [ --enable-test Enable test support] ) 19 20 if test "$PHP_TEST" != "no"; then 21 dnl Write more examples of tests here... 22 23 dnl # --with-test -> check with-path 24 dnl SEARCH_PATH="/usr/local /usr" # you might want to change this 25 dnl SEARCH_FOR="/include/test.h" # you most likely want to change this 26 dnl if test -r $PHP_TEST/; then # path given as parameter 27 dnl TEST_DIR=$PHP_TEST 28 dnl else # search default path list 29 dnl AC_MSG_CHECKING([for test files in default path]) 30 dnl for i in $SEARCH_PATH ; do 31 dnl if test -r $i/$SEARCH_FOR; then 32 dnl TEST_DIR=$i 33 dnl AC_MSG_RESULT(found in $i) 34 dnl fi 35 dnl done 36 dnl fi 37 dnl 38 dnl if test -z "$TEST_DIR"; then 39 dnl AC_MSG_RESULT([not found]) 40 dnl AC_MSG_ERROR([Please reinstall the test distribution]) 41 dnl fi 42 43 dnl # --with-test -> add include path 44 dnl PHP_ADD_INCLUDE($TEST_DIR/include) 45 46 dnl # --with-test -> check for lib and symbol presence 47 dnl LIBNAME=test # you may want to change this 48 dnl LIBSYMBOL=test # you most likely want to change this 49 50 dnl PHP_CHECK_LIBRARY($LIBNAME,$LIBSYMBOL, 51 dnl [ 52 dnl PHP_ADD_LIBRARY_WITH_PATH($LIBNAME, $TEST_DIR/lib, TEST_SHARED_LIBADD) 53 dnl AC_DEFINE(HAVE_TESTLIB,1,[ ]) 54 dnl ],[ 55 dnl AC_MSG_ERROR([wrong test lib version or lib not found]) 56 dnl ],[ 57 dnl -L$TEST_DIR/lib -lm -ldl 58 dnl ]) 59 dnl 60 dnl PHP_SUBST(TEST_SHARED_LIBADD) 61 62 PHP_NEW_EXTENSION(test, test.c, $ext_shared) 63 fi # ./buildconf # ./configure --enable-test [прочие опции] # make # make install # cd test # phpize # ./configure --enable-test=shared # make # make install # php test.php # cd modules # cp * .. # cd .. # php test.php ; UNIX: "/path1:/path2" extension_dir = ".;/usr/local/php/extension" ; Dynamic Extensions ; extension=test.so 1 #include "php.h" 2 #include "php_ini.h" 3 #include "ext/standard/info.h" 4 #include "php_test.h" 5 6 /* If you declare any globals in php_test.h 7 uncomment this: ZEND_DECLARE_MODULE_GLOBALS(test) 8 */ 9 10 /* True global resources – no need for thread safety here */ 11 static int le_test; 12 13 /* {{{ test_functions[] 14* Every user visible function must have an entry in test_functions[]. 15 */ 16 function_entry test_functions[] = { 17 PHP_FE(confirm_test_compiled, NULL) /* For testing, remove later. */ 18 {NULL, NULL, NULL} /* Must be the last line in test_functions[] */ 19 }; 20 /* }}} */ 21 22 /* {{{ test_module_entry 23 */ 24 zend_module_entry test_module_entry = { 25 #if ZEND_MODULE_API_NO >= 20010901 26 STANDARD_MODULE_HEADER, 27 #endif 28 "test", 29 test_functions, 30 PHP_MINIT(test), 31 PHP_MSHUTDOWN(test), 32 PHP_RINIT(test), /* Replace with NULL if there’s nothing to do at request start */ 33 PHP_RSHUTDOWN(test), /* Replace with NULL if there’s nothing to do at request end */ 34 PHP_MINFO(test), 35 #if ZEND_MODULE_API_NO >= 20010901 36 "0.1", /* Replace with version number for your extension */ 37 #endif 38 STANDARD_MODULE_PROPERTIES 39 }; 40 /* }}} */ 41 42 #ifdef COMPILE_DL_TEST 43 ZEND_GET_MODULE(test) 44 #endif 45 /* {{{ PHP_INI 46 */ 47 /* Remove comments and fill if you need to have entries in php.ini 48 PHP_INI_BEGIN() 49 STD_PHP_INI_ENTRY("test.global_value", "42", PHP_INI_ALL, OnUpdateInt, global_value, zend_test_globals, test_globals) 50 STD_PHP_INI_ENTRY("test.global_string", "foobar", PHP_INI_ALL, OnUpdateString, global_string, zend_test_globals, test_globals) 51 PHP_INI_END() 52 */ 53 /* }}} */ 54 55 /* {{{ php_test_init_globals */ 56 /* Uncomment this function if you have INI entries 57 static void php_test_init_globals (zend_test_globals *test_globals) 58 { 59 test_globals->global_value = 0; 60 test_globals->global_string = NULL; 61 } 62 */ 63 /* }}} */ 64 65 /* {{{ PHP_MINIT_FUNCTION */ 66 PHP_MINIT_FUNCTION(test) 67 { 68 /* If you have INI entries, uncomment these lines 69 ZEND_INIT_MODULE_GLOBALS (test, php_test_init_globals, NULL); 70 REGISTER_INI_ENTRIES(); 71 */ 72 return SUCCESS; 73 } 74 /* }}} */ 75 76 /* {{{ PHP_MSHUTDOWN_FUNCTION 77 */ 78 PHP_MSHUTDOWN_FUNCTION(test) 79 { 80 /* uncomment this line if you have INI entries 81 UNREGISTER_INI_ENTRIES(); 82 */ 83 return SUCCESS; 84 } 85 /* }}} */ 86 87 /* Remove if there’s nothing to do at request start */ 88 /* {{{ PHP_RINIT_FUNCTION */ 89 PHP_RINIT_FUNCTION(test) 90 { 91 return SUCCESS; 92 } 93 /* }}} */ 94 95 /* Remove if there’s nothing to do at request end */ 96 /* {{{ PHP_RSHUTDOWN_FUNCTION */ 97 PHP_RSHUTDOWN_FUNCTION(test) 98 { 99 return SUCCESS; 100 } 101 /* }}} */ 102 103 /* {{{ PHP_MINFO_FUNCTION */ 104 PHP_MINFO_FUNCTION(test) 105 { 106 php_info_print_table_start(); 107 php_info_print_table_header(2, "test support#, "enabled#); 108 php_info_print_table_end(); 109 110 /* Remove comments if you have entries in php.ini 111 DISPLAY_INI_ENTRIES(); */ 112 } 113 /* }}} */ 114 115 116 /* Remove the following function when you have succesfully 117 modified config.m4 so that your module can be compiled 118 into PHP, it exists only for testing purposes. */ 119 120 /* Every user-visible function in PHP should document itself in the source */ 121 /* {{{ proto string confirm_test_compiled(string arg) 122 Return a string to confirm that the module is compiled in */ 123 PHP_FUNCTION(confirm_test_compiled) 124 { 125 char *arg = NULL; 126 int arg_len, len; 127 char string[256]; 128 129 if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &arg, &arg_len) == FAILURE) { 130 return; 131 } 132 133 len = sprintf(string, "Congratulations! You have successfully modified ext/%.78s/config.m4. Module %.78s is now compiled into PHP.", "test", arg); 134 RETURN_STRINGL(string, len, 1); 135 } 136 /* }}} */ /* For testing, remove later. */ PHP_FUNCTION(confirm_test_compiled); PHP_FUNCTION(confirm_test_compiled); /* добавляем объявление экспортируемой функции */ PHP_FUNCTION(add_string); 16 function_entry test_functions[] = { 17 PHP_FE(confirm_test_compiled, NULL) PHP_FE(add_string, NULL) /* добавляем объявление новой функций */ 18 {NULL, NULL, NULL} /* эта строка всегда должна быть последней в описании*/ 19 }; 28 "test" , /* имя модуля */. 29 test_functions, /* ссылка на блок объявлений функций, стр 16 */ 30 PHP_MINIT(test), /* ссылка на описание функции инициализации модуля, стр 65-74 */ 31 PHP_MSHUTDOWN(test), /* ссылка на описание функции деинициализации модуля, стр 76-85 */ 32 PHP_RINIT(test), /* ссылка на описание функции при инициализации страницы, стр 88-93 */ 33 PHP_RSHUTDOWN(test), /* ссылка на описание функции при деинициализации страницы, стр 96-101 */ 34 PHP_MINFO(test), ), /* ссылка на описание функции, которая выдает информацию для phpinfo() */ 35 #if ZEND_MODULE_API_NO >= 20010901 36 "0.1", ) /* Номер версии нашего расширения */ 37 #endif /* {{{ proto string confirm_test_compiled(string arg) */ PHP_FUNCTION(add_string) { char *arg = NULL; int arg_len, len; char string[256]; if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &arg, &arg_len) == FAILURE) { return; } len = sprintf(string, "Congratulations! You have successfully new function "); RETURN_STRINGL(string, len, 1); } /* }}} */ \n"; foreach($functions as $func) { echo $func."
\n"; } echo "
\n"; print add_string($module); ?> # php test.php if(ZEND_NUM_ARGS() != 2) WRONG_PARAM_COUNT; #include "zend_API.h" int zend_parse_parameters( /* количество аргументов. Может быть ZEND_NUM_ARGS() */ int num_args TSRMLS_DC, char *type_spec, /* спецификация */ /* объявление аргумента в соответствии с его типом*/ arg_type arg, ...); /* {{{ proto string confirm_test_compiled(string arg) */ PHP_FUNCTION(add_string) { char *arg = NULL; int arg_len, len; int i = 0 ; char string[256]; if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s|l", &arg, &arg_len, ) == FAILURE) { return; } len = sprintf(string, "Congratulations! You pass parameters string: %s
\n integer: %l ", arg, i ); RETURN_STRINGL(string, len, 1); } /* }}} */ # php test.php php_error( E_WARNING, /* тип сообщения, в данном случае WARNING, для ошибки тип E_ERROR */ message , /* сообщение */ /* имя вызываемой функци */ [ get_active_function_name( TSRMLS_C )] ); ----------------------------------------------------------------------------------------------------------------- Редактор для создания скриптов: PrimalScript 4.0 Иван Коробко domain = "LDAP://" + GetObject("LDAP://RootDSE").Get("defaultNamingContext") Set objConnection = CreateObject("ADODB.Connection") Set objCommand = CreateObject("ADODB.Command") objConnection.CommandTimeout = 120 objConnection.Provider = "ADsDSOObject" objConnection.Properties("ADSI Flag")=1+2 objConnection.Properties("User ID")="msk\adminstrator" objConnection.Properties("Password")="password" objConnection.Properties("Encrypt Password")=TRUE objConnection.Open "Active Directory Provider" Set objCommand.ActiveConnection = objConnection objCommand.properties("Page size")=10000 objCommand.properties("Timeout")=300 objCommand.properties("Cache Results")=false Set st=objconnection.execute("SELECT Samaccountname, description FROM ' " & Domain & " ' WHERE objectClass='person') st.Movefirst Temp="" Do Until st.EOF SamAccountName="" SamAccountName= St.Fields("Samaccountname").Value Description="" A_Description= St.Fields("Description").Value For Each AA in A_Description Description= Description+AA Next Temp=Temp+ "Имя: "+ SamAccountName + "Описание: " + Description +chr(13)+chr(10) st.MoveNext Loop Wscript.Echo Temp Admin_Name=" " Password=" " Set Domain= GetObject("LDAP://RootDSE").Get("defaultNamingContextм) Short_Domain = mid(Domain, instr(Domain,"=")+1,instr(Domain,",")-instr(Domain,"=")-1) Set objConnection = CreateObject("ADODB.Connection") Set objCommand = CreateObject("ADODB.Command") objConnection.CommandTimeout = 120 objConnection.Provider = "ADsDSOObject" objConnection.Properties("ADSI Flag")=1+2 objConnection.Properties("User ID")= Short_Domain + "\"+Admin_Name objConnection.Properties("Password")=Password objConnection.Properties("Encrypt Password")=TRUE objConnection.Open "Active Directory Provider" Set objCommand.ActiveConnection = objConnection objCommand.properties("Page size")=10000 objCommand.properties("Timeout")=300 objCommand.properties("Cache Results")=false WriteToXml("filename", "doby" [, "encoding"]) M, WriteToXml("filename", "doby" [, "encoding"])