Кто подрывает монополию Windows? Владимир Брюков Y = 0,006*t07^2 - 0,00006*t07^3 + 0,132*t - 0,00125*t^2 + 3,66 (1) Y = 0,068*WINXP + 0,086*VISTA + 0,0057*VISTA^2 + 0,238*WIN7 - 0,0011*WIN7^2 + 1,91 (2) Y = 0,068 * (WINXP + VISTA) (3) ----------------------------------------------------------------------------------------------------------------- Использование IIS в корпоративных сетях Иван Коробко Листинг 1. Фрагмент файла web.config …. The section enables configuration of the security authentication mode used by ASP.NET to identify an incoming user. --> userName="registry:HKLM\Software\AspNetProcess,Name" password="registry:HKLM\Software\AspNetProcess,Pwd" Листинг 2. Сценарий регистрации пользователей в сети (PowerShell) $ServerLogon=(dir env:logonserver).value # Сервер загрузки cd $ServerLogon\NETLOGON\PowerShell [xml] $obj=gc .\IIS.xml # Чтение XML-файла # Чтение раздела ROOT – PART – IIS, параметра ENABLE if ([int32]$obj.root.part.iis.enable -eq 1 ) { # Чтение списка сайтов из ROOT – IIS – SITE, параметры VISIBLE и URL $obj.root.iis.site | % { # Вызов версии Internet Explorer $ie = New-Object -com InternetExplorer.Application while ($ie.busy -eq $true ) {} $ie.visible =[int32] $_.visible $ie.navigate($_.url) # Назначение времени ожидания $timeUntil =(Get-Date).AddMinutes($obj.root.part.iis.timeout) # Контроль времени ожидания while ($ie.busy -eq $true) {If($timeUntil -lt (Get-Date)){$ie.quit();Write-Host "windows was closed"} } # Обеспечение последовательного выполнения сценариев switch ($ie.visible){ $true {while ($ie.visible -eq $true) {}} $false {$ie.quit()} } } } Листинг 3. Конфигурационный файл для сценария регистрации пользователей в сети (PowerShell) Листинг 4. Подключение к кусту удаленного реестра (VB.NET) Partial Class _Default Public hklm As Microsoft.Win32.RegistryKey Public hccr As Microsoft.Win32.RegistryKey Public pcname As String Public Key As String = "SOFTWARE\Microsoft\Windows\CurrentVersion\..." Protected Sub form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles form1.Load pcname = Request.UserHostName Try hklm = Microsoft.Win32.RegistryKey.OpenRemoteBaseKey(Microsoft.Win32.RegistryHive.LocalMachine, pcname) hklm.OpenSubKey(Key1, True).CreateSubKey(SubKeyName) hklm.OpenSubKey(Key1, True).CreateSubKey(SubKeyName).SetValue(FlagKey, FlagValue, Microsoft.Win32.RegistryValueKind.String) Catch ex As Exception ErrorMessage("Remote Registry Access: " + ex.Message) End Try … End Sub Листинг 5. Поиск групп в Active Directory (VB.NET) Imports System.DirectoryServices … Public Domain As String = "" … Dim obj As New DirectoryEntry("LDAP://RootDSE") Domain = "LDAP://" + obj.Properties("DefaultNamingContext").Value Dim obj As New DirectorySearcher() obj.SearchRoot = New DirectoryEntry("LDAP://" + Domain) Dim query As String = "(&(objectclass =group)(cn=" + Prefix + "*))" obj.Filter = query Dim bb As SearchResultCollection bb = search.FindAll For Each b As SearchResult In bb Dim path As String = b.GetDirectoryEntry.Properties("distinguishedName").Value.ToString() Dim read = GetObject("LDAP://" + path) ‘ чтение поля INFO For Each t As String In read.info Response.Write (t + "
") Next ‘ чтение поля DESCRIPTION Response.Write read.description Next ----------------------------------------------------------------------------------------------------------------- Windows Server 2008 R2 Core. Установка и настройка типовых сервисов IIS Владимир Озеров C:\Windows\System32>netsh interface ipv4 show interfaces netsh interface ipv4 set address name="3" source=static address=192.168.1.3 mask=255.255.255.0 netsh interface ipv4 add dnsserver name="3" address=192.168.1.2 index=1 netdom join %computername% /domain:test.local /userd:Administrator /password:* cscript C:\Windows\System32\slmgr.vbs start /w ocsetup MicrosoftWindowsPowerShell winrm quickconfig cscript C:\Windows\System32\Scregedit.wsf /ar 0 cscript C:\Windows\System32\Scregedit.wsf /cs 0 netsh advfirewall firewall set rule group="Remote Desktop" new enable=yes start /w pkgmgr /l:log.etw /iu:IIS-WebServerRole;WAS-WindowsActivationService;WAS-ProcessModel;WAS-NetFxEnvironment;WAS-ConfigurationAPI start /w pkgmgr /iu:IIS-WebServerRole;IIS-WebServer;IIS-CommonHttpFeatures;IIS-StaticContent;IIS-DefaultDocument;IIS-DirectoryBrowsing;IIS-HttpErrors;IIS-HttpRedirect;IIS-ApplicationDevelopment;IIS-ASP;IIS-CGI;IIS-ISAPIExtensions;IIS-ISAPIFilter;IIS-ServerSideIncludes;IIS-HealthAndDiagnostics;IIS-HttpLogging;IIS-LoggingLibraries;IIS-RequestMonitor;IIS-HttpTracing;IIS-CustomLogging;IIS-ODBCLogging;IIS-Security;IIS-BasicAuthentication;IIS-WindowsAuthentication;IIS-DigestAuthentication;IIS-ClientCertificateMappingAuthentication;IIS-IISCertificateMappingAuthentication;IIS-URLAuthorization;IIS-RequestFiltering;IIS-IPSecurity;IIS-Performance;IIS-HttpCompressionStatic;IIS-HttpCompressionDynamic;IIS-WebServerManagementTools;IIS-ManagementScriptingTools;IIS-IIS6ManagementCompatibility;IIS-Metabase;IIS-WMICompatibility;IIS-LegacyScripts;IIS-FTPPublishingService;IIS-FTPServer;WAS-WindowsActivationService;WAS-ProcessModel start /w ocsetup IIS-ManagementService reg add HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\WebManagement\Server /v EnableRemoteManagement /t REG_DWORD /d 1 net start wmsvc set-service wmsvc -startuptype automatic set-executionPolicy remoteSigned import-module WebAdministration ----------------------------------------------------------------------------------------------------------------- Использование pGina для аутентификации в системах MS Windows Евгений Бушков OPTS="-h 'ldaps:// ldap:// ldapi://%2fvar%2frun%2fopenldap%2fslapd.sock'" netstat -nap|egrep '0.0.0.0:(389|636)' $ openssl rsa -noout -text -in ca.key 1024 $ openssl req -new -x509 -nodes -sha1 -days 1825 -key ca.key out ca.crt $ openssl x509 -noout -text -in ca.crt $ openssl genrsa -des3 -out ldap.key 1024 $ openssl rsa -in ldap.key -out ldap.key.unsecure $ chmod 440 ldap.key.unsecure $ chown ldap:ldap ldap.key.unsecure $ openssl req -new -key ldap.key -out ldap.csr $ openssl x509 -req -in ldap.csr -days 1080 -CA ca.crt CAkey ca.key -CAcreateserial -out ldap.crt TLSCertificateKeyFile /etc/openldap/ssl/ldap.key.unsecure TLSCertificateFile /etc/openldap/ssl/ldap.crt TLSCACertificateFile /etc/ssl/certs/ca.crt reg export "hklm\software\pGina" c:\path\pgina.reg ----------------------------------------------------------------------------------------------------------------- Authentication Authorization Accounting. Интеграция Cisco с Microsoft Active Directory Сергей Цымбалюк service password-encryption enable secret ******* username recover password ********* aaa new-model aaa authentication banner ^ Access only for persons explicitly authorized. All rights reserved. ^ aaa authentication fail-message ^ Authentication failed ^ aaa authentication login login-RADIUS group radius local aaa authorization exec auth-RADIUS-exec group radius local radius-server retransmit 1 radius-server host 10.0.0.2 radius-server key SupErkEy line vty 0 15 exec-timeout 15 0 login authentication login-RADIUS authorization exec auth-RADIUS-exec timeout login response 180 no password # debug radius events # debug aaa authentication # debug aaa authorization # debug aaa protocols # debug radius [authentication | elog | verbose] ----------------------------------------------------------------------------------------------------------------- Управление ресурсами пользователя без перезагрузки компьютера Иван Коробко Листинг 1. Изменение типа группы безопасности на Universal Security # Определение имени домена $objD=([ADSI]"LDAP://RootDSE").defaultNamingContext $domain= ([ADSI]"LDAP://$objD").path # Поиск всех групп безопасности в домене $objS=New-Object System.DirectoryServices.DirectorySearcher $objS.Filter="(&(objectclass=group))" $objS.SearchRoot=$domain $result=$objS.FindAll() # Обработка списка групп безопасности $result |% { if (([ADSI]$_.path).isCriticalSystemObject -eq $TRUE) {} else { # Фильтрация некритических объектов $tempObj=[ADSI]$_.path # Изменение типа группы безопасности на Universal Security $tempObj.put("grouptype","-2147483640") $tempObj.setinfo() Write-Host $tempObj.name } } Write-Host "End Of Script" Листинг 2. Пример XML-файла config.xml Листинг 3. Чтение данных из XML-файла [XML]$obj = Get-Content .\config.xml $Prefix = $obj.Root.Prefix.Value Write-Host $Prefix Листинг 4. Определение GUID-объекта в каталоге Active Directory # Имя искомого контейнера $ou="Пользователи" # Определение имени домена $domain="LDAP://"+([ADSI]"LDAP://RootDSE").defaultnamingcontext # Создание объекта для поиска $objS=New-Object System.DirectoryServices.DirectorySearcher $objs.Filter="(&(objectclass=organizationalunit)(name=$ou))" $objs.SearchRoot=$domain # Поиск объектов по заданным критериям $Result = $objs.FindAll() $Result | %{ # Определение GUID найденного объекта $GUID=([ADSI]$_.path).GUID # Определение RDN-пути к объекту $Path=$_.path # Вывод данных в консоль Write-host $GUID " " $path } ([ADSI]"LDAP://").path Листинг 5. Определение GUID-объекта в каталоге Active Directory # Подключение к XML-файлу cd "…" [XML]$obj = Get-Content .\config.xml # Чтение данных из XML-файла $StoreOU=$obj.Root.GroupsOU.GUID $UsersOU=$obj.Root.UsersOU.GUID $Prefix=$obj.Root.Prefix.Value # Поиск учетных записей пользователей $objSearch=New-Object System.DirectoryServices.DirectorySearcher $objSearch.Filter="(&(objectClass=person)(!(objectClass=computer)))" $objSearch.SearchRoot="LDAP://" $result = $objSearch.FindAll() $result | % { $GroupName = $Prefix + $_.properties.samaccountname $GroupDescrition = $_.properties.description Write-Host $GroupName # Создание новой группы $objGroup = [ADSI]"LDAP://" $objNewGroup = $objGroup.Create("group", "cn=$GroupName") $objNewGroup.put("samaccountname","$GroupName") $objNewGroup.put("description","$GroupDescrition ") $objNewGroup.put("grouptype","-2147483640") # Добавление пользователя в группу $objNewGroup.PutEx(3,"member",@([string]([ADSI]$_.path).distinguishedName)) $objNewGroup.setinfo() } Write-Host "End Of Work" } Листинг 6. Изменение значений Primary Group учетных записей пользователей контейнера Function DetectSID { # Чтение значения передаваемого функции параметра $object=$args[0] # Определение SID-группы безопасности $AdObj = New-Object System.Security.Principal.NTAccount($object) $strSID = $AdObj.Translate([System.Security.Principal.SecurityIdentifier]) # Определение последнего октека SID-группы безопасности $Value=$strSID.Value.split("-") $ID=[int]$Value[$Value.count-1] # Возвращение полученного значения return $ID } # Подключение к XML-файлу CD "…" [XML]$obj = Get-Content .\config.xml # Чтение данных из XML-файла $StoreOU=$obj.Root.GroupsOU.GUID $UsersOU=$obj.Root.UsersOU.GUID $Prefix=$obj.Root.Prefix.Value # Поиск учетных записей пользователей в указанном контейнере $objSearch=New-Object ? System.DirectoryServices.DirectorySearcher $objSearch.Filter="(&(objectClass=person)(!(objectClass=computer)))" $objSearch.SearchRoot="LDAP://" $result = $objSearch.FindAll() $result | % { # Определение имени связанной группы $GroupName = $Prefix + $_.properties.samaccountname # Определение идентификатора группы из SID с помощью функции $newID=DetectSID $GroupName Write-Host "User: " $_.properties.samaccountname Write-Host "Link Group: " $GroupName Write-Host "OLD Primary Group ID: " $_.properties.primarygroupid Write-Host "NEW Primary Group ID: " $newID Write-Host "***********************************************" # Получение доступа к объекту (пользователь) $objID=[ADSI]$_.Path # Изменение типа группы $objID.Put("primaryGroupID",$newID) # Запись изменений в каталог Active Directory $objID.setInfo() } Листинг 7. Копирование списка групп безопасности из пользователя в новую группу ForEach($Element in $MemberOF) { $AddMembers=[ADSI]("LDAP://"+$Element) $AddMembers.PutEx(3,"member",@([string]$objNewGroup.distinguishedName)) $AddMembers.setInfo() } Листинг 8. Изменение основной группы в учетной записи пользователя # Подключение к XML-файлу CD "…" [XML]$obj = Get-Content .\config.xml # Чтение данных из XML-файла $StoreOU=$obj.Root.GroupsOU.GUID $UsersOU=$obj.Root.UsersOU.GUID $Prefix=$obj.Root.Prefix.Value # Поиск учетных записей пользователей в указанном контейнере $objSearch=New-Object System.DirectoryServices.DirectorySearcher $objSearch.Filter="(&(objectClass=person)(!(objectClass=computer)))" $objSearch.SearchRoot="LDAP://" $result = $objSearch.FindAll() $result | % { # Определение RDN-пути удаляемой учетной записи $UserName = $_.properties.distinguishedname # Формирование списка групп, членом которых является пользователь $MemberOf = $_.Properties.memberOf ForEach($element in $memberof) { # Получение доступа к группе безопасности $objS = [ADSI]"LDAP://$element" # Определение типа группы безопасности: Universal if ($objS.grouptype -eq -2147483640 ) { # Удаление пользователя из группы безопасности $objS.name $objs.PutEx(4,"member",@($UserName)) $objs.setinfo() } } } Write-Host "End Of Work" ----------------------------------------------------------------------------------------------------------------- Как читать MIB Павел Малахов $ snmpwalk -c public -v2c 10.0.0.1 $ snmpwalk -c public -v2c 10.0.0.1 1.3.6.1.4.1.343.2.19.1.2.10.206.1.1.16 $ snmpwalk -c public -v2c 10.0.0.1 1.3.6.1.4.1.343.2.19.1.2.10.206.1.1.16 ----------------------------------------------------------------------------------------------------------------- Предупрежден значит вооружен. Мгновенное оповещение системы мониторинга Zabbix на .NET Алексей Бойко Листинг 1. Вызов утилиты Zabbix_sender zabbix_sender -z ***.***.***.*** -p 10051 -s 314-4-pc -k testItem -o 2 Листинг 2. Формат данных Zabbix на примере сообщения от Zabbix_sender { "request":"sender data", "data": [ { "host":"314-4-pc", "key":"testItem", "value":2 } ] } Листинг 3. Формирование JSON. Тип параметра value может быть любым private void _SetItem(string hostName, string ItemName, object value) { JavaScriptSerializer serializer = new JavaScriptSerializer(); string json = serializer.Serialize( new { request = "sender data", data = new[] { new { host = hostName, key = ItemName, value = value } } }); ... Листинг 4. Формирование массива байт сообщения byte[] header = Encoding.ASCII.GetBytes("ZBXD\x01"); byte[] length = BitConverter.GetBytes((long)json.Length); byte[] data = Encoding.ASCII.GetBytes(json); byte[] all = new byte[header.Length + length.Length + data.Length]; System.Buffer.BlockCopy(header, 0, all, 0, header.Length); System.Buffer.BlockCopy(length, 0, all, header.Length, length.Length); System.Buffer.BlockCopy(data, 0, all, header.Length + length.Length, data.Length); Листинг 5. Отправка данных с помощью сокета using (var client = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp)) { client.Connect(_Ip, _TrapperPort); client.Send(all); // чтение ответа Zabbix-сервер ... } Листинг 6. Чтение информации из сокета. Размер получаемой информации нужно знать заранее private static void _Receive(Socket socket, byte[] buffer, int offset, int size, int timeout) { int startTickCount = Environment.TickCount; int received = 0; do { if (Environment.TickCount > startTickCount + timeout) throw new Exception("Timeout."); try { received += socket.Receive(buffer, offset + received, size - received, SocketFlags.None); } catch (SocketException ex) { if (ex.SocketErrorCode == SocketError.WouldBlock || ex.SocketErrorCode == SocketError.IOPending || ex.SocketErrorCode == SocketError.NoBufferSpaceAvailable) { // Socket buffer is probably empty, wait and try again Thread.Sleep(30); } else throw ex; // Any serious error occurr } } while (received < size); } Листинг 7. Надежное получение данных от Zabbix-сервера // Прочитаем заголовок byte[] buffer = new byte[5]; _Receive(client, buffer, 0, buffer.Length, _TcpReceiveTimeout); if ("ZBXD\x01" != Encoding.ASCII.GetString(buffer, 0, buffer.Length)) throw new Exception("Invalid response"); // Прочитаем длину сообщения buffer = new byte[8]; _Receive(client, buffer, 0, buffer.Length, _TcpReceiveTimeout); int dataLength = BitConverter.ToInt32(buffer, 0); if (dataLength == 0) throw new Exception("Invalid response"); // Прочитаем сообщение buffer = new byte[dataLength]; _Receive(client, buffer, 0, buffer.Length, _TcpReceiveTimeout); string result = Encoding.ASCII.GetString(buffer, 0, buffer.Length); ----------------------------------------------------------------------------------------------------------------- Работа с драйверами устройств в Microsoft System Center Configuration Manager 2007 Андрей Криницкий SELECT * FROM WIN32_COMPUTERSYSTEM WHERE MODEL <> 'ESPRIMO Mobile M9400' SELECT * FROM WIN32_COMPUTERSYSTEM WHERE MODEL = 'ESPRIMO Mobile M9400' ----------------------------------------------------------------------------------------------------------------- Microsoft Exchange 2010. Упрощаем обслуживание с помощью агентов сценариев Алексей Богомолов if($succeeded) { $mailbox = $provisioningHandler.UserSpecifiedParameters["Name"] $OU = $provisioningHandler.UserSpecifiedParameters["OrganizationalUnit"] if($OU -like "test.local/Top_Managers") { set-Mailbox -Identity $mailbox -IssueWarningQuota 209715200 -ProhibitSendQuota 262144000 -ProhibitSendReceiveQuota 293601280 -UseDatabaseQuotaDefaults $false } else { set-casmailbox $mailbox -POPEnabled $false -IMAPEnabled $false } c:\MailScritp.ps1 –name $mailbox } Enable-CmdletExtentionAgent "Scripting Agent" ----------------------------------------------------------------------------------------------------------------- Основы AMD64. Исследуем с помощью свободного ПО Игорь Штомпель $ sudo apt-get install dissy $ tar xfz debugger-0.9.16.tgz $ sudo apt-get install qt4-qmake libqt4-dev libboost-dev g++ $ qmake $ sudo make install $ edb $ sudo apt-get install flex $ tar xJf pcalc-2.tar.lzma $ make $ sudo make install #include int main () { int a, b, c; for (a=0; a<=3; a++) { printf ("a равно %d\n", a); } for (b=0; b<=3; b++) { printf ("b равно %d\n", b); } c = a + b; printf ("Сумма a и b равна %d\n", c); return 0; } $ gcc -m64 -o first first.c -o "имя выходного файла" gcc -S first.c gcc -O0 -o first first.c $ readelf -h first $ file first && nm first $ objdump -f ./first $ gdb -q first (gdb) break main (gdb) run (gdb) info registers (gdb) i r $ gcc -m64 -g -O0 -o first first.c $ gdb -q first (gdb) list $ edb $ gdb -q first (gdb) break main (gdb) run (gdb) info register eax (gdb) i r eax $ pcalc 0x2ec8 $ objdump -d ./first $ objdump -M intel -d ./first $ objdump -d tiny-crackme $ gdb -q tiny-crackme ----------------------------------------------------------------------------------------------------------------- IRC: сохраняем сообщения в СУБД MySQL Максим Лобов $ wget http://www.unrealircd.com/downloads/Unreal3.2.8.1.tar.gz $ tar -xv -C /opt -f Unreal3.2.8.1.tar.gz $ grep -irl "send[_ ]message" /opt/Unreal3.2/src Debug((DEBUG_ERROR, "Sending [%s] to %s", msg, to->name)); int f; int msg_size; f = open("/var/log/unreal/msg.log", O_APPEND | O_WRONLY); msg_size = strlen(msg); write(f, msg, msg_size); write(f, "\r\n", 2); close(f); #include MYSQL *mysql_conn; char *mysql_server = "localhost"; int mysql_port = 3306; char *mysql_user = "mysql_user"; char *mysql_password = "mysql_password"; char *mysql_database = "irclog"; mysql_conn = mysql_init(NULL); if (mysql_real_connect(mysql_conn, mysql_server, mysql_user, mysql_password, mysql_database, mysql_port, NULL, 0)) { char query[1024]; memset(query, 0, 1024); strcat(query, "INSERT INTO `irclog`.`table` (message) VALUES ('"); strncat(query, msg,1000); strcat(query, "');"); mysql_query(mysql_conn, query); mysql_close(mysql_conn); } #include # yum install mysql-devel # yum install gcc # yum install make $ cd /opt/Unreal3.2 $ ./сonfigure $ ./make $ ./Сonfig ./configure --with-showlistmodes --enable-hub --enable-prefixaq --with-listen=5 --with-dpath=/opt/Unreal3.2 --with-spath=/opt/Unreal3.2/src/ircd --with-nick-history=2000 --with-sendq=3000000 --with-bufferpool=18 --with-hostname=linux --with-permissions=0600 --with-fd-setsize=1024 –enable-dynamic-linking `/usr/bin/mysql_config --cflags` LDFLAGS=`/usr/bin/mysql_config --libs` # ./unreal start $ wget ftp://ftp.berlios.de/pub/ngircd/ngircd-17.1.tar.gz $ tar -xv -C /opt -f ngircd-17.1.tar.gz $ grep -irl "send[_ ]message" /opt/Unreal3.2/src static bool Send_Message PARAMS((CLIENT *Client, REQUEST *Req, int ForceType, bool SendErrors)); if (!Channel_Write(chan, from, Client, Req->command, SendErrors, Req->argv[1])) return DISCONNECTED; @@ -474,6 +488,7 @@ return DISCONNECTED; } else if (ForceType != CLIENT_SERVICE && (chan = Channel_Search(currentTarget))) { // Write to MySQL or log file + write_message_to_mysql(Client, Req); if (!Channel_Write(chan, from, Client, Req->command, SendErrors, Req->argv[1])) return DISCONNECTED; --- irc.c 2010-08-29 21:07:42.000000000 +0400 +++ irc_patched.c 2011-01-13 14:41:34.000000000 +0300 @@ -32,6 +32,7 @@ #include "messages.h" #include "parse.h" #include "tool.h" +#include #include "exp.h" #include "irc.h" @@ -43,6 +44,7 @@ static bool Send_Message_Mask PARAMS((CLIENT *from, char *command, char *targetMask, char *message, bool SendErrors)); +void write_message_to_mysql PARAMS((CLIENT * Client, REQUEST * Req)); GLOBAL bool @@ -474,6 +476,7 @@ return DISCONNECTED; } else if (ForceType != CLIENT_SERVICE && (chan = Channel_Search(currentTarget))) { // Write to MySQL or log file + write_message_to_mysql(Client, Req); if (!Channel_Write(chan, from, Client, Req->command, SendErrors, Req->argv[1])) return DISCONNECTED; @@ -559,5 +562,59 @@ return CONNECTED; } /* Send_Message_Mask */ +void write_message_to_mysql(CLIENT * Client, REQUEST * Req){ + char * m_nick; + m_nick=(char *)Client; + m_nick+=4; + char * m_channel; + char * msg=Req->argv[1]; + m_channel=Req->argv[0]; + MYSQL *mysql_conn; + + char *mysql_server = "localhost"; + UINT16 mysql_port = 3306; + char *mysql_user = "mysql_user"; + char *mysql_password = "mysql_password"; + char *mysql_database = "irclog"; + const char *nomysql_logfile="/var/log/ngircd/msg.log"; + + mysql_conn = mysql_init(NULL); + + // Преобразуем время + struct tm* current_time_struct_tm; + char* current_time_string; + time_t my_time; + my_time=time(NULL); + current_time_struct_tm=localtime(&my_time); + current_time_string=asctime(current_time_struct_tm); + + if (!mysql_real_connect(mysql_conn, mysql_server, mysql_user, mysql_password, mysql_database, mysql_port, NULL, 0)) + { + //Если БД не работает, пишем в файл + FILE* f=fopen(nomysql_logfile, "a"); + fprintf(f, "%s\t%s %s: %s\n", current_time_string, m_channel, m_nick, msg); + fclose(f); + } + else + { + char query[1024]; + memset(query, 0, 1024); + + strcat(query, "INSERT INTO `irclog`.`table` (time, channel, nick, message) VALUES ('"); + strcat(query, current_time_string); + strcat(query,"','"); + strcat(query,m_channel); + strcat(query,"','"); + strcat(query,m_nick); + strcat(query,"','"); + strncat(query,msg, 1000); + strcat(query,"');"); + + mysql_query(mysql_conn, query); + } + + mysql_close(mysql_conn); + +} /* write_message_to_mysql */ /* -eof- */ $ cd /opt/ngircd-17.1 $ ./сonfigure $ ./make `/usr/bin/mysql_config --cflags` `/usr/bin/mysql_config --libs` CFLAGS=-lmysqlclient LDFLAGS=-L/usr/lib/mysql CFLAGS=-lmysqlclient LDFLAGS=-L/usr/lib64/mysql ;mysql_host= ;mysql_port= ;mysql_login= ;mysql_password= ;mysql_database= ;nomysql_logfile= GLOBAL char Conf_mysql_host[HOST_LENGTH]; GLOBAL UINT16 Conf_mysql_port; GLOBAL char Conf_mysql_login[LOGIN_LENGTH]; GLOBAL char Conf_mysql_password[PASSWORD_LENGTH]; GLOBAL char Conf_mysql_database[DATABASE_LENGTH]; GLOBAL char Conf_nomysql_logfile[LOGFILE_LENGTH]; #define HOST_LENGTH 30 #define LOGIN_LENGTH 20 #define PASSWORD_LENGTH 20 #define DATABASE_LENGTH 50 #define LOGFILE_LENGTH 250 strcpy(Conf_my_host, "localhost"); Conf_ mysql_port = 3306; strcpy(Conf_my_login, "irc"); strcpy(Conf_my_password, ""); strcpy(Conf_my_database, "irclog"); strcpy(Conf_my_logfile, "/var/log/ngircd/messages.log"); if( strcasecmp( Var, "mysql_host" ) == 0 ) { len = strlcpy( Conf_mysql_host, Arg, sizeof( Conf_mysql_host )); if (len >= sizeof( Conf_mysql_host )) Config_Error_TooLong( Line, Var ); return; } ... if( strcasecmp( Var, "mysql_port" ) == 0 ) { port = atol( Arg ); if( port > 0 && port < 0xFFFF ) Conf_mysql_port = (UINT16)port; else Config_Error( LOG_ERR, "%s, line %d (section \"Server\"): Illegal MySQL port number %ld!", NGIRCd_ConfFile, Line, port ); return; } char *mysql_server = "localhost"; UINT16 mysql_port = 3306; char *mysql_user = "mysql_user"; char *mysql_password = "mysql_password"; char *mysql_database = "irclog"; const char *Conf_nomysql_logfile="/var/log/ngircd/msg.log"; char *mysql_server = Conf_mysql_host; UINT16 mysql_port = Conf_mydql_port; char *mysql_user = Conf_mysql_login; char *mysql_password = Conf_mysql_password; char *mysql_database = Conf_mysql_database; char *nomysql_logfile = Conf_nomysql_logfile; CREATE TABLE `irclog`.`table`(id INT NULL AUTO_INCREMENT PRIMARY KEY ,`message` TEXT NULL); CREATE TABLE `irclog`.`table` ( `id` BIGINT unsigned NOT NULL auto_increment, `time` TIMESTAMP NOT NULL , `channel` TINYTEXT NOT NULL , `nick` TINYTEXT NOT NULL , `message` TEXT NOT NULL , PRIMARY KEY ( `id` ) ); Last IRC messages "; echo "id timestamp channel nick message"; while($row=mysql_fetch_array($result)) { if ($color) { echo ""; $color=0; } else { echo ""; $color=1; } echo "".$row['time'].""; echo "".$row['channel'].""; echo "".$row['nick'].""; echo "".$row['message'].""; echo ""; } echo ""; ?> ----------------------------------------------------------------------------------------------------------------- Реализация вывода штрих-кода в Oracle Application Юрий Язев make install ttf2pt1 -a -b Code_128.ttf Code128 Листинг 1. Функция для преобразования набора цифр в формат, пригодный для вывода штрих-кода по стандарту Code 128 FUNCTION GET_BARCODE -- by yurembo (num in varchar2) RETURN varchar2 IS type array_numbers is table of integer; --Массив nums array_numbers:= array_numbers(); --Инициализация массива type string_array is table of varchar2(255); mas string_array := string_array(); result varchar2(255); --Возвращаемый результат chnum varchar2(255); --Преобразованное в строку число – параметр symbolcount Integer; --Количество символов controlsymbol varchar2(255); --Контрольный символ start_code constant integer := 108; --Стартовый код для таблицы C stop_code constant integer := 109; --Завершающий символ divider constant integer := 103; --Делитель s varchar2(10); --Промежуточное значение j Integer; --В процессе программы изменяется (см. комментарии ниже) b boolean := false; --Индикатор: четное или нечетное количество символов: если false, то количество символов четное, если true, то нечетное str varchar2(255) := ''; BEGIN chnum := TO_CHAR(num); symbolcount := Length(chnum); if mod(symbolcount, 2) != 0 then --Нечетное количество символов? chnum := '0' || chnum; --Тогда добавляем лидирующий ноль b := true; --Помечаем, что количество символов нечетное end if; s := ''; j := 1; --Счетчик для массива чисел for i in 1 .. Length(chnum) loop s := s || substr(chnum, i, 1); if (Length(s) = 2) or ((b = true) and (Length(s) = 1)) then nums.extend; nums(j) := TO_Number(s) * j; mas.extend; mas(j) := chr(TO_Number(s)); ---------------- if b = true then b := false; end if; ---------------- j := j + 1; s := ''; end if; end loop; j := start_code; --Сумма for i in nums.first .. nums.last loop j := j + nums(i); end loop; controlsymbol:= mod(j, divider); --Контрольный символ for i in mas.first .. mas.last loop str := str || mas(i); end loop; chnum := chr(start_code) || str || chr(controlsymbol) || chr(stop_code); --Все объединяем в одну строку --chnum := start_code||' '||chr(start_code); result := chnum; RETURN result; --EXCEPTION -- WHEN other THEN -- statements ; END; Листинг 2. Функция для преобразования набора цифр в формат, пригодный для вывода штрих-кода по стандарту Code 39 FUNCTION GET_BARCODE39(num in varchar2) return varchar2 is -- by yurembo result varchar2(255); --Возвращаемый результат chnum varchar2(255); --Преобразованное в строку число – параметр controlsymbol varchar2(255); --Контрольный символ symbol constant char := '*'; --Старт/стоп-символ divider constant integer := 43; --Делитель summa Integer := 0; begin chnum := TO_CHAR(num); for i in 1 .. Length(chnum) loop summa := summa + to_number(substr(chnum, i, 1)); end loop; if mod(summa, divider) != 0 then controlsymbol := chr(mod(summa, divider)); else controlsymbol := '0'; end if; result := symbol || chnum || controlsymbol || symbol; return result; end; ttf2pt1 -a -b Code39.ttf Code39 select ACCOUNTING_EVENT_ID, EVENT_TYPE_CODE, ACCOUNTING_DATE, get_barcode(ACCOUNTING_EVENT_ID) F, get_barcode39(ACCOUNTING_EVENT_ID) V from ap_accounting_events_f1 ----------------------------------------------------------------------------------------------------------------- Дискреционное разграничение прав в Linux. Часть 3. Исследование влияния дополнительных атрибутов Павел Закляков $ yum install gcс # setenforce 0 $ whereis gcc $ whereis g++ $ rpm -qf /usr/bin/gcc $ rpm -qf /usr/bin/g++ $ gcc -c file.c $ gcc -o new_program file.o $ gcc file.c # ls -l /bin/bash #!/bin/bash #include #include // getuid возвращает фактический идентификатор // ID-пользователя в текущем процессе uid_t getuid(void); // geteuid возвращает эффективный идентификатор // ID-пользователя в текущем процессе uid_t geteuid(void); // getgid возвращает действительный идентификатор группы // текущего процесса gid_t getgid(void); // getegid возвращает эффективный идентификатор группы // текущего процесса gid_t getegid(void); // Фактический ID соответствует ID-пользователя, который вызвал процесс. // Эффективный ID соответствует установленному согласно setuid-биту на исполняемом файле. // Действительный идентификатор соответствует идентификатору вызывающего процесса // Эффективный идентификатор соответствует установленному согласно биту setuid на исполняемом файле. // Setreuid устанавливает действительный и фактический идентификаторы владельца текущего процесса // Непривилегированные пользователи могут изменять действительный идентификатор владельца на фактический и наоборот int setreuid(uid_t ruid, uid_t euid); int seteuid(uid_t euid); #include #include #include int main() { uid_t uid = geteuid (); gid_t gid = getegid (); printf ("uid=%d gid=%d\n", uid, gid); return 0; } $ gcc -c simpleid.c $ gcc -o simpleid simpleid.o $ ls -l simpleid $ ./simpleid $ id #include #include #include int main() { uid_t real_uid = getuid (); uid_t e_uid = geteuid (); gid_t real_gid = getgid (); gid_t e_gid = getegid (); printf ("e_uid=%d e_gid=%d\n", e_uid, e_gid); printf ("real_uid=%d real_gid=%d\n", real_uid, real_gid); return 0; } $ gcc -c simpleid2.c $ gcc -o simpleid2 simpleid2.o $ ./simpleid2 # chown root:guest /home/guest/simpleid2 # chmod u+s /home/guest/simpleid2 $ ls -l simpleid2 $ ./simpleid2 $ id #include #include #include #include #include int main (int argc, char* argv[]) { unsigned char buffer[16]; size_t bytes_read; int i; int fd = open (argv[1], O_RDONLY); do { bytes_read = read (fd, buffer, sizeof (buffer)); for (i = 0; i < bytes_read; ++i) printf ("%c", buffer[i]); } while (bytes_read == sizeof (buffer)); close (fd); return 0; } $ gcc -c readfile.c $ gcc -o readfile readfile.o $ ls -l /|grep tmp $ echo test>/tmp/file01.txt $ ls -l /tmp/file01.txt $ chmod o+rw /tmp/file01.txt $ ls -l /tmp/file01.txt $ cat /tmp/file01.txt $ echo test2>>/tmp/file01.txt $ cat /tmp/file01.txt $ echo test3>/tmp/file01.txt $ cat /tmp/file01.txt $ rm /tmp/file01.txt ls $ su – # chmod -t /tmp # exit $ ls -l /|grep tmp $ su – # chmod +t /tmp # exit ----------------------------------------------------------------------------------------------------------------- Машина Тьюринга. Гений, которого вынудили умереть Алексей Вторников X v X -> X (a) X -> X v Y (b) X v Y -> Y v X (c) (X -> Y) -> (Z v X -> Z v Y) (d) ?x F(x) -> F (y) (e) F(y) -> ?x (Fx) (f) Состояние Текущий символ Операция Следующее состояние a - P1, R b b - P1, R c c - P1, R d d - P1, R e e - P1, H Состояние Текущий символ Операция Следующее состояние a - P1, R b b - P0, R a Состояние Текущий символ Операция Следующее состояние a - P0, R b b - R с c - P1, R d d - R a Состояние Текущий символ Операция Следующее состояние a 1 R a a - P1, R b b 1 R b b - L c c 1 E, H ----------------------------------------------------------------------------------------------------------------- Система групповой работы Tine 2.0 Сергей Яремчук $ sudo apt-get install mysql-server mysql-client apache2 $ sudo apt-get install libapache2-mod-php5 php5-mysql php5-gd php5-mcrypt $ sudo service apache2 restart $ mysql -uroot –p mysql> CREATE DATABASE tine20db DEFAULT CHARACTER SET 'UTF8'; mysql> GRANT ALL PRIVILEGES ON tine20db.* TO 'tine20user'@'localhost' IDENTIFIED BY 'tine20pw'; $ wget –c http://www.tine20.org/downloads/2010-03-9/tine20-allinone-2010-03-9.tar.bz2 $ wget –c http://www.tine20.org/downloads/2010-03-9/tine20-activesync-2010-03-9.tar.bz2 $ mkdir /var/www/tine20 $ cd /var/www/tine20 $ sudo tar ~/xjvf tine20-allinone-2010-03-9.tar.bz2 $ sudo tar ~/xjvf tine20-activesync-2010-03-9.tar.bz2 $ sudo mv config.inc.php.dist config.inc.php $ sudo chown -R www-data:www-data /var/www/tine20/* $ sudo nano config.inc.php array( 'host' => 'localhost', // узел, на котором находится сервер MySQL 'dbname' => 'tine20db', // название базы данных // учетные данные для доступа к базе данных 'username' => ' tine20user ', 'password' => 'tine20pw', 'adapter' => 'pdo_mysql', 'tableprefix' => 'tine20_', ), // учетные данные для установки системы 'setupuser' => array( 'username' => 'tine20setup', 'password' => 'setup' ), ); 'pdfexport' => array( 'fontpath' => '/var/www/tine20/unifont.ttf', 'fontpathbold' => '/var/www/tine20/unifont.ttf', 'fontembed' => true ), */5 * * * * php /www/tine/tine20.php --method Tinebase.triggerAsyncEvents >> /var/log/cron.log 'cronuserid' => 'a30bd…37', -----------------------------------------------------------------------------------------------------------------