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 &"Имя пользователя | Время события | Событие | UserID | IP адрес |
")
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(rs2("User_vch"))
strFile.WriteLine(" | ")
strFile.WriteLine(" ")
strFile.WriteLine(rs2("Date_dat"))
strFile.WriteLine(" | ")
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(" ")
strFile.WriteLine(rs2("WID_vch"))
strFile.WriteLine(" | ")
strFile.WriteLine(" ")
strFile.WriteLine(rs2("Address_vch"))
strFile.WriteLine(" | ")
strFile.WriteLine("
")
rs2.close
rs1.MoveNext
loop
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(rs2("User_vch"))
strFile.WriteLine(" | ")
strFile.WriteLine(" ")
strFile.WriteLine(rs2("First"))
strFile.WriteLine(" | ")
strFile.WriteLine(" ")
strFile.WriteLine(rs2(«Last»))
strFile.WriteLine(" | ")
strFile.WriteLine("
")
End If
rs2.close
Next
rs1.MoveNext
loop
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);
}
/* }}} */
print PHP_SHLIB_SUFFIX;
if(!extension_loaded('test')) {
dl('test.' . PHP_SHLIB_SUFFIX);
}
$module = 'test';
$functions = get_extension_funcs($module);
echo "Functions available in the test extension:
\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,
...);
if(!extension_loaded('test')) {
dl('test.' . PHP_SHLIB_SUFFIX);
}
$module = 'test';
$i = 12;
print add_string($module, $i );
?>
/* {{{ 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"])