Последние записи.

Отправка отчетов с помощью powershell

- Вы не любите powershell? Да вы просто не умеете его готовить!

Речь сегодня пойдет о методиках отправки отчетов средствами powershell т.к. отчеты можно и нужно отправлять, реализуется это довольно просто.

Возможно два варианта.

  1. анонимная отсылка сообщений
  2. авторизованная отправка

Традиционные примеры в виде двух скриптов, код которых по мере возможности прокомментирован.

Скрипт №1
Анонимная отправка сообщения.

# Примем по умолчанию папку в которой будем хранить отчеты C:\TEMP\reports\
# Если ее содержимое вам не нужно то раскомментируйте следующую строку
# Remove-Item C:\TEMP\reports\*.txt -force

# устанавливаем формат даты
$date = ( get-date ).ToString(‘yyyyMMdd’)
# Создаем файлы отчетов
$File1 = New-Item -type file "C:\TEMP\reports\$date-mailbox_storage.txt" -Force
$File2 = New-Item -type file "C:\TEMP\reports\$date-mailbox_report.txt" -Force

# от кого
$FromAddress = "exchange.admin@domain.com"
# кому
$ToAddress = "admin@domain.com"
$MessageSubject = "Exchange Server Daily Report"
$MessageBody = "Attached is the current list of mailbox and DataBases sizes."
# сервер через который будет производиться отправка
$SendingServer = "EXCAS"

# формируем первый отчет
Get-MailboxServer -Identity "EXMBX" | Get-MailboxDatabase | Select Identity, @{Name="Size (GB)";Expression={$objitem = (Get-MailboxDatabase $_.Identity); $path = "`\`\" + $objitem.server + "`\" + $objItem.EdbFilePath.DriveName.Remove(1).ToString() + "$"+ $objItem.EdbFilePath.PathName.Remove(0,2); $size = ((Get-ChildItem $path).length)/1048576KB; [math]::round($size, 2)}}, @{Name="No. Of Mbx";expression={(Get-Mailbox -Database $_.Identity | Measure-Object).Count}} | Sort -Property Identity | Format-table -AutoSize | Out-File $File1

# формируем второй отчет
Get-MailboxServer -Identity "EXMBX" | Get-MailboxStatistics | Sort-Object TotalItemSize -Descending | ft DisplayName,StorageLimitStatus,@{label="TotalItemSize(MB)";expression={$_.TotalItemSize.Value.ToMB()}},ItemCount | Out-File $File2

# Создаем почтовое сообщение
$SMTPMessage = New-Object System.Net.Mail.MailMessage $FromAddress, $ToAddress, $MessageSubject, $MessageBody

# приделываем к нему несколько аттачей
foreach ($File in ($File1, $File2)){
$Attachment = New-Object System.Net.Mail.Attachment $File
$SMTPMessage.Attachments.Add($Attachment)
}
# В случае если отчет всего один то конструкция будет такой
#$Attachment = New-Object System.Net.Mail.Attachment $File1
#$SMTPMessage.Attachments.Add($Attachment)

# Отсылаем сообщение
$SMTPClient = New-Object System.Net.Mail.SMTPClient $SendingServer
$SMTPClient.Send($SMTPMessage)

Стоит сказать что в случае если вам необходим набор отчетов то вы просто добавляете

$File3 = New-Item -type file «C:\TEMP\reports\$date-какойнибудь_report.txt» -Force

Не забываете его сформировать а затем прописать тут

foreach ($File in ($File1, $File2, $File3)){

Скрипт №2
В случае если необходима авторизованная отправка синтаксис немного меняется, но суть остается прежней.

  1. отчет можно выдергивать из заранее сформированного файла
  2. в переменную $mail.Body можно направлять вывод любой команды.
# Считаем что нам необходим файл file01.txt
$file = "C:\TEMP\reports\file01.txt"
$FileExists = Test-Path $file

# проверяем наличие файла
If ($FileExists -eq "False") {
Write-Host "sending mail"
# Создаем почтовое сообщение
$mail = New-Object System.Net.Mail.MailMessage

# Устанавливаем
$mail.From = New-Object System.Net.Mail.MailAddress("exchange.admin@domain.com")
$mail.To.Add("admin@domain.com")

# Устанавливаем тему сообщения
$mail.Subject = "report";
# Создаем тело сообщения из файла
$mail.Body = get-content $file

# Создаем почтовое сообщение
$smtp = New-Object System.Net.Mail.SmtpClient
# Указываем хост через который будем отправлять
$smtp.host = "EXCAS"

# Задаем пользователя от имени которого будет происходить отправка
$Credentials = new-object System.Net.networkCredential
$Credentials.domain = "DOMAIN"
$Credentials.UserName = "user.name"
$Credentials.Password = "P@$$W0rd"
$smtp.Credentials = $Credentials

# Производим отправку
$smtp.Send($mail)
# В случае необходимости удаляем файл
Remove-Item $file
} else {
Write-Host "File $file not found"
}

Операция «Aurora». Экскурс по развалинам.

Атака на инфраструктуру Google состоялась в середине декабря, как позже выяснилось целью была не только Google но и более 30 других крупных компаний США, среди которых Yahoo, Symantec, Juniper Networks, Adobe, Northrop Grumman и Dow Chemical.

McAfee Labs изучала атаку, и теперь это дело принято называть «Aurora» и вроде как это имя является частью файлового пути на компьютере атакующего.

В общем бла-бла-бла…
и много чего еще.

На самом деле вся суть проблемы состоит в том что на множестве компьютеров используется устаревшее ПО, не далее как вчера ко мне обратился знакомый который пренебрегал правилами и следствием этого была произведена успешная атака на компьютеры бухгалтерии со всемы вытекающими обстоятельствами.

Типовая картина для небольших компаний такова – небольшая сетка до пятидесяти компьютеров которые работают под Windows XP (если есть SP2 это хорошо) и IE6, отсутствие обновлений, приходящий сисадмин-универсал который занимается всем включая телефонию и т.д.

В данный момент работа этой компании парализована DDos-атакой которая началась сразу же после завершения атаки на компьютеры бухгалтерии.
В ближайшем будущем придется оперативно провести анализ всех ПК на предмет заражения вредоносным ПО, придумывать WSUS, ставить обновления и пересматривать свои взгляды на вопросы компьютерной безопасности.

Вернемся к Aurora. Использовалась ранее неизвестная уязвимость в браузере Microsoft Internet Explorer. Как оказалось при анализе ей подвержены версии Internet Explorer 5.01, 6 SP1, 7, 8 под управлением Windows 2000, XP, Windows Server 2003, Vista, Windows Server 2008, 7 и Windows Server 2008 R2, но успешная эксплуатация была зафиксирована только на системах с Internet Explorer 6.

Сама уязвимость описана в этом документе

Microsoft оперативно выпустила внеочередное обновление безопасности, полностью закрывающее обнаруженную уязвимость во всех версиях Internet Explorer.

Проверенной методикой будет
1. Загрузить и установить обновление безопасности.
2. Обновить браузер до версии Internet Explorer 8 (или хотя бы до IE7) для обеспечения более высокого уровня безопасности.
3. Обновить операционную систему до уровня Windows XP SP3, Vista или Windows 7 т.к. в них более совершенные механизмы обеспечения защиты от информационных угроз.
4. Установить режим автоматического обновления системы если он выключен то включить.

Update Rollup 2 for Exchange Server 2007 Service Pack 2

Выпущен второй rollup для Exchange Server 2007 SP2 (KB 972076) он доступен для загрузки здесь.

Вроде как добавлены новые правила для Exchange BPA, для получения новых наборов правил необходим доступ в интеренет для серверов на которые вы будуте ставить данный rollup.

Описание того что включено в KB 972076 доступно по ссылке

Вчитываясь в список багов решил проверить наличие некоторых на стенде, подтвердилось три из пяти. Оно не удивительно, раз их нашли значт они есть, но вот это

974312 Unread messages are marked as «read» when Exchange Server 2007 processes the EXAMINE command

проверить так и не получилось.

Список исправленных багов довольно обширен, читайте и если это ваши «жуки» то rollup поможет вам от них избавиться.

PS. Быть или не быть?
Извечная тема мучавшая еще Гамлета. Мое горячее убеждение состоит в том что бы «быть», но сначала быть на стенде, или хотя бы на виртуальной машине а потом уже на продакшене.

О грусном

Выражаю коллегам работающим с продуктами Sun-а свое сочувствие и желаю скорейшей реинкарнации их продуктов в новом виде.

Поглощение завершилось…
Теперь даже sun.com редиректит на сайт Oracle, остался еще ru.sun.com, но судя по всему это вопрос времени.


RIP взят отсюда

Вести с полей

Изучая последние новости тихо обалдеваю от истерии которую разводят вокруг последней уязвимости в IE, если здраво посмотреть на сложившуюся ситуацию то диву даешься как народ разводит панику из-за этого.

Смотрите. Есть бюллетень в котором описана данная уязвимость, есть пачт и статья в базе знаний 979352 где крупно написано «FIX IT». Вчера (22.01.2010) вышел патч который приедет на компьютеры через Windows Update.

Вот пример новости, читая ее вспоминаю последнюю шумиху которую вызвал Conficker, среди воплей которые вызвала уязвимость были слышны вполне здравые вопросы: «В ноябре вышел пачт, что вам мешало его поставить?».

Я сам не скрою что в последний раз использовал IE только для того что бы посмотреть что нового добавили в IE8, но повальный переход на другие браузеры, поверьте не приведет ни к чему хорошему т.к. при повышении к ним интереса поиск дырок в них усилиться и ускориться.

В любом случае выбор браузера личное дело каждого и обнаружение новой уязвимости не повод для паники.

Проверка системных файлов

- «Стоит помнить о том что все что необходимо всегда есть под рукой, надо уметь это находить..»

Когда внезапно возникает подозрение что с компьютером что то «не так», антивирус молчит как партизан, ошибок в журналах нет и несмотря на все усилия понять что именно «не так» невозможно. На помощь приходит утилита для проверки целостности защищенных фалов о которой все знают но стесняются ее использовать.

SFC.EXE и ее традиционные ключи.

  • /Scannow — проверит все защищенные файлы и восстановит ошибочные с диска о чем сообщит в случае если это потребуется.
  • /Scanonce — проверить все защищенные системные файлы при следующей перезагрузке компьютера. При запуске Sfc.exe с параметром /Scanonce в реестре по пути HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon параметру SfcScan типа DWORD присваивается значение 2.
  • /Scanboot — включит проверку защещенных фалов при каждой загрузке компьютера. При запуске Sfc.exe с параметром /Scanboot в реестре по пути HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon параметру SfcScan типа DWORD присваивается значение 1.
  • /Revert — восстановит параметры проверки по умолчанию то есть не будет проверять файлы при каждой загрузке если вы использовали ранее /Scanboot
  • /Purgecache — чистка файлового кэша и запуск проверки.
  • /Cachesize=x — Установить размер файлового кэша равным x мегабайтам (МБ). По умолчанию 50Мб. При запуске Sfc.exe с параметром /Cachesize параметру системного реестра по пути HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon параметру SfcQuota типа DWORD присваивается значение x.

В Windows 7 помимо вышеперечисленных ключей добавились еще и такие

SFC [/SCANNOW] [/VERIFYONLY] [/SCANFILE=] [/VERIFYFILE=]
[/OFFWINDIR= /OFFBOOTDIR=]

  • /VERIFYONLY проверка целостности всех файлов, операции восстановления не производится.
  • /SCANFILE проверка определенного файла, при необходимости производится его восстановление. Обязательный параметр – <имя файла>
  • /VERIFYFILE проверка определенного файла, восстановление не производится. Обязательный параметр – <имя файла>

Анализ и правка CAL на удаленных SQL 2000

Простой скрипт из разряда «в коллекцию» который занимается сбором установленного кол-ва CAL-ов на MS SQL 2000.

$servers = Get-Content "servers.txt"
$cal=50
 
foreach ($server in $servers) {
        Write-Host "Working with Server $server"
        $MachineName = $server
        $reg = [Microsoft.Win32.RegistryKey]::OpenRemoteBaseKey(‘LocalMachine’, $MachineName)
        $regKey= $reg.OpenSubKey("SOFTWARE\\Microsoft\\Microsoft SQL Server\\80\\MSSQLLicenseInfo\\MSSQL8.00", $true )
        $val1 = $regkey.GetValue("ConcurrentLimit")
        Write-Host "Current value = " $val1
        if ($val1 -ne $cal) {
                Write-Host "Set ConcurrentLimit to $cal"
                $regkey.SetValue("ConcurrentLimit", $cal)
                $regKey.flush()
                $regKey.Close()
        } else {
                Write-Host "ConcurrentLimit = " $val1
        }
}

Бэкап svn репозитария на gmail

Получил некоторый заряд бодрости когда на домашнем ПК начал сыпаться диск. :)

Немного подумав проверил бэкапы, перенес их свежие версии на DVD, осталось только понять что делать с SVN репозитарием в котором храняться все скрипты.

Что делать… что делать…
Отсылать по почте на Gmail… вот таким скриптом на перле.

Поясню некоторые детали:
$backup_source – папка где храниться то что надо резервировать
$backup_folder – собственно то что резервируем

При использовании скрипта под windows необходимо только переписать пути.

#!/usr/bin/perl -w
use strict;
use Archive::Tar;
use File::Find;
use MIME::Lite;
use Net::SMTP;

sub sendmail();

my $email = ‘my.email@gmail.com’;
my $message_from = ‘Backup Script <backup.script@example.com>’;
my $message_body = "Here’s the attachment file(s) you wanted";

my $smtp_server = ’smtp.server.com’;
my @archive_list;
my $backup_source = ‘/home/user/bin/’;
my $backup_folder = ’svn’;
my $tar_file = ‘/home/user/temp/gmailtar.tgz’;

chdir($backup_source) || die "cannot change directory ($!)";

find (sub { push @archive_list, $File::Find::name }, $backup_folder);

Archive::Tar->create_archive($tar_file, "9", @archive_list);

sendmail();

unlink ($tar_file);

sub sendmail() {
    my $msg = MIME::Lite->new(To => $email,
        Subject => "Backup email",
        From => $message_from,
        Type => "multipart/mixed" ) or die "Error creating multipart container: $!\n";

    $msg->attach (
        Type => ‘TEXT’,
        Data => $message_body
        ) or die "Error adding the text message part: $!\n";
    $msg->attach(Type => "application/gzip",
        Path => $tar_file,
        Filename => "backup.tgz");
    $msg->send(’smtp’, $smtp_server);
}

PS на следующей неделе буду переносить систему на новый диск… переставлять как то не хочется…

Получение списка баз на удаленном сервере

Простой скрипт позволяющий получить вывод процедуры sp_helpdb с удаленного сервера.

При желании список серверов можно брать из файла (get-Content) и в строку $SqlCmd.CommandText можно помещать необходимые команды.

$SqlConnection = New-Object System.Data.SqlClient.SqlConnection
$SqlConnection.ConnectionString = "Server=SQL01;Database=master;Integrated Security=True"
$SqlCmd = New-Object System.Data.SqlClient.SqlCommand
$SqlCmd.CommandText = "sp_helpdb"
$SqlCmd.Connection = $SqlConnection

$SqlAdapter = New-Object System.Data.SqlClient.SqlDataAdapter
$SqlAdapter.SelectCommand = $SqlCmd

$DataSet = New-Object System.Data.DataSet

$SqlAdapter.Fill($DataSet)

$SqlConnection.Close()
$DataSet.Tables[0]

Настройка Receive Connector-а

В случае если у вас есть несколько коннекторов, и возможно не один HUB-сервер и вдобавок имеется довольно объемистый список устройств в виде принтеров, сетевых сканеров и прочего добра.
По природе своей они чаще всего не умеют отправлять почту так как нам бы этого хотелось.
В этом случае приходится вести несколько списков, руками вносить в каждый коннектор ip-адреса, но когда это надоедает хочется оптимизировать процесс:

  1. список для каждого коннектора хочется в текстовом виде
  2. руками вбивать адреса неохота потому что есть шанс что нибудь пропустить

На помощь приходит powershell.

Шаг №1
Создаем список адресов и сохраняем его под понятным именем, например RC-Printers.txt

Шаг №2
В данном шаге два варианта развития событий, выбираем тот который нам больше подходит.

а. Если мы ведем списки адресов на основе текстовых файлов то приведенной ниже конструкцией мы перезаписываем существующие настройки.

Set-ReceiveConnector -Identity "SERVER\ConnectorName" -RemoteIPRanges (Get-Content .\hosts.txt)

b. В случае если необходимо добавить в существующий список некоторое количество адресов то можно воспользоваться приведенным ниже скриптом. Сразу отмечу что ip уже находящиеся в списке будут проигнорированы.

$rc = Get-ReceiveConnector -Identity "SERVER\ConnectorName"
Get-Content .\hosts.txt | foreach {$rc.RemoteIPRanges += "$_"}
$rc | Set-ReceiveConnector