Кто подрывает монополию 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',
-----------------------------------------------------------------------------------------------------------------