3 административных скрипта

от автора

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

1. Получить сетевые настройки и конфиги доменных компов.

Обходит доменные компьютеры и собирает с них информацию. На выходе выбрасывается полноценный объект. Компьютер должен быть включен конечно же. Сценарий содержит пример работы через WMI. Запускать с домена.

# запрашиваем кредиталы доменного админа $cred = Get-Credential <anchor>habracut</anchor> $Clients = Get-ADComputer -Filter * | Sort-Object name | Select-Object name $CompData = @()  foreach ($cli in $Clients)    {     if (( Test-Connection $cli.Name -Count 2 -Quiet ) -eq 'True')       {         if ($cli.name -ne $env:COMPUTERNAME)        {             #получаем информацию по WMI             $os = Get-WmiObject -ComputerName $cli.name Win32_OperatingSystem -Credential $cred             $net = Get-WmiObject -Class Win32_NetWorkAdapterConfiguration -Filter IPEnabled=TRUE -ComputerName $cli.name  -Credential $cred             $nic = Get-WmiObject -Class Win32_NetWorkAdapter -ComputerName $cli.name  -Credential $cred | where {$_.adaptertype -eq 'Ethernet 802.3'} | where { $_.NetEnabled -eq 'True'}             $disk = Get-WmiObject -Class Win32_DiskDrive -ComputerName $cli.name -Credential $cred               $props = [ordered]@{ Name=$os.CSName                         OSName=$os.Caption                         OSSN=$os.SerialNumber                         OSVersion=$os.Version                         OSSystemDirectory=$os.SystemDirectory                         OSBuild=$os.BuildNumber                         OSMUI=$os.MUILanguages                         OSBootDevice=$os.BootDevice                         NICNetConnectionID=$nic.NetConnectionID                         NICName=$nic.Name                         NICDeviceID=$nic.DeviceID                         NICAdapterType=$nic.AdapterType                         NICIndex=$nic.Index                         NICInterfaceIndex=$nic.InterfaceIndex                         NICMAC=$nic.MACAddress                         NICManufacturer=$nic.Manufacturer                         NICNetEnabled=$nic.NetEnabled                         NICPhysical=$nic.PhysicalAdapter                         NICProductName=$nic.ProductName                         NICServiceName=$nic.ServiceName                         NICSpeed=$nic.Speed                         NetDHCPEnabled=$net.DHCPEnabled                         NetIPAddress=$net.IPAddress                         NetDefaultGateway=$net.DefaultIPGateway                         DiskName=$disk.Caption                          DiskStatus=$disk.Status                          DiskDeviceId=$disk.deviceid                          DiskSerialNumber=$disk.serialnumber                          DiskSize=$disk.size                          }              $obj = New-Object -TypeName PSObject -Property $props             $CompData += $obj         }     } }  $CompData 

2. Поменять шлюз по умолчанию

Модифицируем предыдущий скрипт так чтобы он менял шлюз по умолчанию. (обязательно все проверяйте в своей среде перед запуском на живой системе!) Использует в для смены шлюза вызовы WMI т.к. через повершелл нужно удалить и снова создать адаптер, что приведет к потери связи с компьютером. Проверялся на Powershell 4 и 3, win 2012 и 8

$cred = Get-Credential  $OldGateway = '192.168.30.1' $NewGateway = '192.168.30.50'  $Clients = Get-ADComputer -Filter * | Sort-Object name | Select-Object name $CompData = @()  foreach ($cli in $Clients) {     if (( Test-Connection $cli.Name -Count 2 -Quiet ) -eq 'True')     {         if ($cli.name -ne $env:COMPUTERNAME)         {             $os = Get-WmiObject -ComputerName $cli.name Win32_OperatingSystem -Credential $cred             $net = Get-WmiObject -Class Win32_NetWorkAdapterConfiguration -Filter IPEnabled=TRUE -ComputerName $cli.name  -Credential $cred             $nic = Get-WmiObject -Class Win32_NetWorkAdapter -ComputerName $cli.name  -Credential $cred | where {$_.adaptertype -eq 'Ethernet 802.3'} | where { $_.NetEnabled -eq 'True'}             $disk = Get-WmiObject -Class Win32_DiskDrive -ComputerName $cli.name -Credential $cred               $props = [ordered]@{ Name=$os.CSName                         OSName=$os.Caption                         OSSN=$os.SerialNumber                         OSVersion=$os.Version                         OSSystemDirectory=$os.SystemDirectory                         OSBuild=$os.BuildNumber                         OSMUI=$os.MUILanguages                         OSBootDevice=$os.BootDevice                         NICNetConnectionID=$nic.NetConnectionID                         NICName=$nic.Name                         NICDeviceID=$nic.DeviceID                         NICAdapterType=$nic.AdapterType                         NICIndex=$nic.Index                         NICInterfaceIndex=$nic.InterfaceIndex                         NICMAC=$nic.MACAddress                         NICManufacturer=$nic.Manufacturer                         NICNetEnabled=$nic.NetEnabled                         NICPhysical=$nic.PhysicalAdapter                         NICProductName=$nic.ProductName                         NICServiceName=$nic.ServiceName                         NICSpeed=$nic.Speed                         NetDHCPEnabled=$net.DHCPEnabled                         NetIPAddress=$net.IPAddress                         NetDefaultGateway=$net.DefaultIPGateway                         DiskName=$disk.Caption                          DiskStatus=$disk.Status                          DiskDeviceId=$disk.deviceid                          DiskSerialNumber=$disk.serialnumber                          DiskSize=$disk.size                          }              $obj = New-Object -TypeName PSObject -Property $props              $CompData += $obj         }     } }  #$CompData ################################################################  # Меняем шлюз foreach($Co in $CompData) {          if ($Co.NetDefaultGateway = $OldGateway)       {             $Co.Name             $Co.netdefaultgateway              $NWCards = Get-WmiObject Win32_NetworkAdapterConfiguration -ComputerName $co.Name -Credential $cred | where{ $_.ipenabled -eq $true }             foreach ($nwc in $NWCards)       {                 $gateway = $nwc.defaultipgateway                 if ($gateway -eq $OldGateway)       {                     $nwc.setgateways($NewGateway)                 }             }          } } 

3. Получить статистику по почтовым ящикам

Собирает статистику топ ящиков по размеру, топ ящиков по количеству писем, топ ящиков по удаленым айтемам (purge корзины 2 еще не произошел, только удаление писем пользователем), после формирует «красивый» отчет в HTML и отправляет на почту и складывает в папочку. Использовался как ежемесячный репортер состояния базы, устанавливался в таск шедалер. Запускать на сервере exchange. Проверялось на Exchange 2010.

<#      по умолчанию выбирает по 25 топ мэйлбоксов     сохрание отчета на диск отключено #>  Param (  [int]$TopCount = 25,         [boolean]$SaveReport = $false,         [string]$ReportPath = 'C:\Reports\MailboxReport.html',         [boolean]$SendReport = $true,         [string]$ReportMail1 = 'admin@mail.local'     )  # check snapin present $EX2010 = $false  $snaps = Get-PSSnapin foreach( $snap in $snaps )  {     if ($snap.Name -eq 'Microsoft.Exchange.Management.PowerShell.E2010')   {         $EX2010 = $true     } }  if ($EX2010 -eq $false) {     Add-PSSnapin Microsoft.Exchange.Management.PowerShell.E2010 }  $boxes = Get-Mailbox | Get-MailboxStatistics | sort TotalItemSize -Descending $TotalSize = $boxes | sort TotalItemSize -Descending | select -First $TopCount  # самые толстые ящики $Size = @() foreach ($box in $TotalSize)  {     $propsTotalSize = [ordered]@{   DisplayName=$box.DisplayName                                     User=$box.LastLoggedOnUserAccount                                     Database=$box.Database                                     TotalSize=$box.TotalItemSize                                     ItemCount=$box.ItemCount                                     DeletedItemCount=$box.DeletedItemCount                                     TotalDeletedSize=$box.TotalDeletedItemSize                         }             $obj = New-Object -TypeName PSObject -Property $propsTotalSize             $Size += $obj }  # топ удаленых без purge $Deleted = $boxes | sort TotalDeletedItemSize -Descending | select -First $TopCount $Del = @() foreach ($box in $Deleted)   {     $propsDeleted = [ordered]@{   DisplayName=$box.DisplayName                                   User=$box.LastLoggedOnUserAccount                                   Database=$box.Database                                   TotalSize=$box.TotalItemSize                                   ItemCount=$box.ItemCount                                   DeletedItemCount=$box.DeletedItemCount                                   TotalDeletedSize=$box.TotalDeletedItemSize                         }             $obj = New-Object -TypeName PSObject -Property $propsDeleted             $Del += $obj }  # топ по количеству писем, слишком много индикатор что пользователь сваливает все в кучу и нуждается в автоматических правилах $Top = $boxes | sort ItemCount -Descending | select -First $TopCount $TopItems = @() foreach ($box in $Top)  {     $propsTopItems = [ordered]@{   DisplayName=$box.DisplayName                                    User=$box.LastLoggedOnUserAccount                                    Database=$box.Database                                    TotalSize=$box.TotalItemSize                                    ItemCount=$box.ItemCount                                    DeletedItemCount=$box.DeletedItemCount                                    TotalDeletedSize=$box.TotalDeletedItemSize                         }             $obj = New-Object -TypeName PSObject -Property $propsTopItems             $TopItems += $obj }  ##### HTML generating Write-Verbose 'HTML fragment producing' $fragTopItems = $TopItems | ConvertTo-Html -As table -Fragment -PreContent '<h2>Топ ящиков по количеству писем (items count)</h2>' | Out-String $fragTopSizes =     $Size | ConvertTo-Html -As table -Fragment -PreContent '<h2>Топ ящиков по размеру</h2>' | Out-String $fragTopDelItems =   $Del | ConvertTo-Html -As table -Fragment -PreContent '<h2>Топ ящиков по удаленным письмам (purge еще не было)</h2>' | Out-String  Write-Verbose 'definiting CSS' $head = @' <style> body { background-color:#ffffff; font-family:Tahoma; font-size:12pt; } td, th { border:1px solid black; border-collapse:collapse; } th { color:white; background-color:black; } table, tr, td, th { padding: 2px; margin: 0px } table { font-family: "Lucida Sans Unicode", "Lucida Grande", Sans-Serif; font-size: 14px; border-radius: 10px; border-spacing: 0; text-align: center; } th { background: #BCEBDD; color: white; text-shadow: 0 1px 1px #2D2020; padding: 10px 20px; } th, td { border-style: solid; border-width: 0 1px 1px 0; border-color: white; } th:first-child, td:first-child { text-align: left; } th:first-child { border-top-left-radius: 10px; } th:last-child { border-top-right-radius: 10px; border-right: none; } td { padding: 10px 20px; background: #F8E391; } tr:last-child td:first-child { border-radius: 0 0 0 10px; } tr:last-child td:last-child { border-radius: 0 0 10px 0; } tr td:last-child { border-right: none; } </style> '@  Write-Verbose 'HTML producing' $Date = Get-Date  if ($SaveReport = $true) {     $rep = ConvertTo-HTML -head $head -PostContent $fragTopSizes, $fragTopDelItems, $fragTopItems -PreContent "<h1>Отчет по почтовым ящикам $Date</h1>" | Out-String     $rep | Out-File $ReportPath }  # Sending Email to admins if ($SendReport = $true) {     $encoding = [System.Text.Encoding]::UTF8     $body = ConvertTo-HTML -head $head -PostContent $fragTopSizes, $fragTopDelItems, $fragTopItems -PreContent "<h1>Отчет по почтовым ящикам $Date</h1>" | Out-String      Write-Verbose "Sending e-mail"     $params = @{'To'=$ReportMail1                'From'='bot@geomex.local'                'Subject'="Mailbox report $Date"                'Body'=$Body                'BodyAsHTML'=$True                'SMTPServer'='DC01.geomex.local'}     Send-MailMessage @params -Encoding $encoding } 

всех с майскими праздниками
ссылка на оригинал статьи https://habrahabr.ru/post/327980/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *