Как стать автором
Обновить

Серверное администрирование. Управление ресурсами средствами PowerShell

Время на прочтение6 мин
Количество просмотров5.1K
Доброго времени суток.

Сегодня нашему администратору потребовалось отслеживать на сетевых ресурсах, сколько Гб использовали сотрудники в своих личных каталогах (дисковое пространство выделено путем подключения сетевого диска). Предполагаем, что предельно допустимый размер личного ресурса равен 1 Гб. В случае если этот размер превышает предел, необходимо сообщить администратору. Также необходимо контролировать резкое увеличение размеров личных ресурсов. Например, если личный каталог сотрудника увеличивается в размере на 200 Мб за неделю, то необходимо оповестить администратора.


Итак, код Powershell’a, который реализовал все вышеуказанные требования:

Функция отправки почты. Функция не унивирсальная, подстроена под задачу. Т.е. принимаем за факт, что тема сообщения, получатель не меняются. Меняется только тело, его то мы и задаем как входящий параметр для функции:

function EmailNotification($Mail_body)
{
  $Sender = "audit@..."
  $Receipt = "levitskaks@gmail.com"
  $Server = "gmail.com.ua"
  $Object = "DirSize: " + (Get-Date)
  $SMTPclient = new-object System.Net.Mail.SmtpClient $Server
  #Specify SMTP port if needed
  $SMTPClient.port = 25
  #Activate SSL if needed
  #$SMTPclient.EnableSsl = $true
  #Specify email account credentials if needed
  $SMTPAuthUsername = "levitskaks@gmail.com"
  $SMTPAuthPassword = "pass"
  $SMTPClient.Credentials = New-Object System.Net.NetworkCredential($SMTPAuthUsername, $SMTPAuthPassword)
  $Message = new-object System.Net.Mail.MailMessage $Sender, $Receipt, $Object, $Mail_body
  #-$Message.IsBodyHtml = $true;
  $SMTPclient.Send($Message)
}


Переходим к основной функции. Входящие параметры:
— исходный каталог. Каталог в котором перечень каталогов под каждого сотрудника;
— предельно-допустимый размер в байтах;
— путь для сохранения лога работы;

function Check-Size-Directory ($dir, $GB, $Logpath) {


Определяем день недели в году. На момент написания скрипта была 47 неделя.
Также нас интересует выполнение проверки — раз в неделю в понедельник. Логика проверки следующая: в четную неделю сохраняется лог работы «0.log». В нечетную неделю сохраняем файл «1.log». Если дата изменения «0.log» больше даты изменения «1.log», то по логически определяем, что последняя неделя была четная. и сверяем в каком каталоге размер увеличился более чем на 200 Мб.

[Int32]$Monday = (Get-Date -UFormat "%w")
    $Monday
    [Int32]$Week = (Get-Date -UFormat "%W")
    $Week
    if ($week%2 -eq 0 -and $Monday -eq 1){
        
        $LogPathFile = $LogPath + "\" + ($week%2).ToString() + ".log"    
        If (!(Test-Path -path $LogPathFile)){
            Write-Host "Создали элемент"
            New-Item -Path $LogPathFile  -ItemType File
        }
        $ToFile = "" | Out-File $LogPathFile
        Write-Host "Четная неделя"
        Get-ChildItem -path $dir | %{
            $dir_property = dir $_.FullName -recurse | where {-Not $_.PSIsContainer}| Measure-Object -Property length -Sum 


Первая требуемая проверка: проверяем каталог на размер больше, чем 1 Гб.

 if ($dir_property.Sum -gt $GB){
                $Mail_body+= "Размер каталога " + $_.FullName + " превышает размер в 1 Гб.`n"
                $Mail_body+= "Размер каталога " + $_.FullName + " составляет " + (($dir_property.Sum)/1024/1024) + " Мб.`n"
                $Mail_body+= "------------------------------------------------------------------------------------------`n"
                <b>$ToFile = $_.DirectoryName + " " + (($dir_property.Sum)/1024/1024) | Out-File $LogPathFile  -Append</b>
            }
            else {
                Write-Host "Все хорошо с каталогом: " $_.FullName
            }
        }
        EmailNotification -Mail_body $Mail_body


Сохраняем имя каталога и его размер через разделитель "|", в последствии через который будем парсить содержимое файла.

<b>$ToFile = $_.DirectoryName + " " + (($dir_property.Sum)/1024/1024) | Out-File $LogPathFile  -Append</b>


Определяем какой файл считаем новым, чтобы проводить сравнение с файлом недельной давности.

$Mail_body = ""
        If ((Get-Item -Path $LogPath\0.log).LastWriteTime -gt (Get-Item -Path $LogPath\1.log).LastWriteTime){
                $log_content = Get-Content (Get-ChildItem -Path $LogPath\0.log)
                foreach ($data in $log_content) 
                {
                    $x = $data.split("|")
                    $xc1 = $x[0]
                    $xc2 = $x[1]
                    $log_content = Get-Content (Get-ChildItem -Path $LogPath\1.log)
                    foreach ($data in $log_content) 
                    {
                        $y = $data.split("|")
                        if ($xc1 -eq $y[0]){
                            if(([Int32]$xc2 - [Int32]$y[1]) -gt 200){
                                $Mail_body += "Резкое увеличение размера каталога: " + $xc1 + "`n Размер на прошлой неделе составил: " + $y[1] + " Мб." + "`n Размер на текущей неделе составил: " + $xc2 + " Мб.`n"
                            }

                        }
                    }

                } 
           EmailNotification -Mail_body $Mail_body
           } 
    }


Проверка четности\нечетности недель проверяется делением по модулю полученной недели в году:

<b>$week%2</b>


Аналогичные проверки для нечетной недели:

    if ($week%2 -eq 1 -and $Monday -eq 1){
        Write-Host "Нечетная неделя"
        $LogPathFile = $LogPath + "\" + ($week%2).ToString() + ".log"
        If (!(Test-Path -path $LogPathFile)){
            Write-Host "Создали элемент"
            New-Item -Path $LogPathFile  -ItemType File
        }
        $ToFile = "" | Out-File $LogPathFile
        
        Get-ChildItem -path $dir | %{
            $dir_property = dir $_.FullName -recurse | where {-Not $_.PSIsContainer}| Measure-Object -Property length -Sum 
    
            if ($dir_property.Sum -gt $GB){
                $Mail_body+= "Размер каталога " + $_.FullName + " превышает размер в 1 Гб.`n"
                $Mail_body+= "Размер каталога " + $_.FullName + " составляет " + (($dir_property.Sum)/1024/1024) + " Мб.`n"
                $Mail_body+= "------------------------------------------------------------------------------------------`n"
                $ToFile = $_.Name + "|" + (($dir_property.Sum)/1024/1024) | Out-File $LogPathFile  -Append
            }
            else {
                Write-Host "Все хорошо с каталогом: " $_.FullName
            }
        }
        EmailNotification -Mail_body $Mail_body
        $Mail_body = ""
        If ((Get-Item -Path $LogPath\1.log).LastWriteTime -gt (Get-Item -Path $LogPath\0.log).LastWriteTime){
                $log_content = Get-Content (Get-ChildItem -Path $LogPath\1.log)
                foreach ($data in $log_content) 
                {
                    $x = $data.split("|")
                    $xc1 = $x[0]
                    $xc2 = $x[1]
                    $log_content = Get-Content (Get-ChildItem -Path $LogPath\0.log)
                    foreach ($data in $log_content) 
                    {
                        $y = $data.split("|")
                        if ($xc1 -eq $y[0]){
                            if(([Int32]$xc2 - [Int32]$y[1]) -gt 200){
                                $Mail_body += "Резкое увеличение размера каталога: " + $xc1 + "`n Размер на прошлой неделе составил: " + $y[1] + " Мб." + "`n Размер на текущей неделе составил: " + $xc2 + " Мб.`n"
                                $Mail_body
                            }

                        }
                    }

                } 
           EmailNotification -Mail_body $Mail_body
           } 
        
       
    }
        
}


Для запуска определяем входящие параметры и запускаем проверку.

#Провериь каталог: не привышает ли он размер в 1 Гб
$GB = 1073741824
$dir = "D:\Program Files"
Check-Size-Directory -dir $dir -GB 107374 -Logpath "D:"


Результат проверки сообщение на почту:

Тема: DirSize: 11/27/2015 11:32:05
Дата: 27 Nov 2015 11:32:05 +0200
От: sizefoldres@gmail.com
Кому: levitskaks@gmail.com

Размер каталога F:\Shared\PrivateData\BRU превышает размер в 1 Гб.
Размер каталога F:\Shared\PrivateData\BRU составляет 1239.06250095367 Мб.


Размер каталога F:\Shared\PrivateData\Danпревышает размер в 1 Гб.
Размер каталога F:\Shared\PrivateData\Dan составляет 1670.62088680267 Мб.


Размер каталога F:\Shared\PrivateData\DYA превышает размер в 1 Гб.
Размер каталога F:\Shared\PrivateData\DYA составляет 7456.12028884888 Мб.


Размер каталога F:\Shared\PrivateData\GLU превышает размер в 1 Гб.
Размер каталога F:\Shared\PrivateData\GLU составляет 2198.93785953522 Мб.



Содержимое файла 0.log:

ActiveX|2.8662109375
AvPinTool|0.5712890625
BDE|10.4070873260498
<b>drivers|6.512216567993</b>
Drv for SecureТoken 337|0.129350662231445
eclipse-standard-kepler-SR2-win32|545.861120223999
flash|122.166826248169
FTP_Drive|0.252327919006348
Install|431.435597419739
Jabber|55.9909982681274
LibreOffice_4_3_4|215.234375
Liga9|336.688585281372
Mail (address_book)|0.141551971435547
nkicntInit|0.166786193847656
powershell_3.0|14.0534420013428
PowerShell_4_0|46.8222227096558
single|630.298968315125
Total Commander|6.67717361450195
WinImage|1.12846660614014
zabbix|1.37527465820313
Документация|0.584843635559
CSPKeyUtil.exe|0.89208984375
jdk-8u65-windows-i586.exe|181.22908782959
jre-8u65-windows-i586.exe|47.8077087402344
LimeActiveXCrypt.cab|5.14455604553223
npp.6.7.4.Installer.exe|7.59689044952393
SkypeSetupFull_6.21.exe|34.3624038696289
winapcupsd-3.14.12.exe|5.84123229980469


Содержимое файла 1.log:

ActiveX|2.8662109375
AvPinTool|0.5712890625
BDE|10.4070873260498
<b>drivers|276.512216567993</b>
Drv for SecureТoken 337|0.129350662231445
eclipse-standard-kepler-SR2-win32|545.861120223999
flash|122.166826248169
FTP_Drive|0.252327919006348
Install|431.435597419739
Jabber|55.9909982681274
LibreOffice_4_3_4|215.234375
Liga9|336.688585281372
Mail (address_book)|0.141551971435547
nkicntInit|0.166786193847656
powershell_3.0|14.0534420013428
PowerShell_4_0|46.8222227096558
single|630.298968315125
Total Commander|6.67717361450195
WinImage|1.12846660614014
zabbix|1.37527465820313
Документация|205.584843635559
CSPKeyUtil.exe|0.89208984375
jdk-8u65-windows-i586.exe|181.22908782959
jre-8u65-windows-i586.exe|47.8077087402344
LimeActiveXCrypt.cab|5.14455604553223
npp.6.7.4.Installer.exe|7.59689044952393
SkypeSetupFull_6.21.exe|34.3624038696289
winapcupsd-3.14.12.exe|5.84123229980469


Результат сравнения двух файлов:

Резкое увеличение размера каталога: D:\Program Files\drivers
Размер на прошлой неделе составил: 6.512216567993Мб.
Размер на текущей неделе составил: 276.512216567993 Мб.

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

Спасибо за внимание.
Теги:
Хабы:
Всего голосов 26: ↑4 и ↓22-18
Комментарии11

Публикации

Ближайшие события