нужно оживить паблик поэтому немного административных скриптов
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:ReportsMailboxReport.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'='mail.domain.local'}
Send-MailMessage @params -Encoding $encoding
}
всех с майскими праздниками
Автор: pak-nikolai