Powershell
[Скачать archive.ps1] # Архивация устаревших данных
Содержимое archive.ps1
# Архивация устаревших данных # Архивация данных из одного каталога, в другой по дате последнего изменения # Передать в переменную $sc каталог-источник $sc=$args[0] # Передать в переменную $ds каталог-назначение $ds=$args[1] # Передать в переменную $tl срок актуальности данных (в днях) $tl=$args[2] # Передать в переменную $lg журнал действий $lg=$args[3] # Построить массив данных $s из файлов старше $tl (все файлы, включая системные, исключая дирректории) $s=Get-ChildItem $sc -Filter * -Recurse -Attributes !d,!d+h | where { $_.LastWriteTime -lt (get-date).addDays($tl*(-1)) } # Перместить файлы из массива $s в $d (идентичный каталог $sc в расположении $ds) # Если каталог $d не существует - создать его # Удалить временные файлы (~$.* и Thumbs.db) # Создать запись в журнале для каждого файла (удаление или перемещение) Foreach ($f in $s) { $dt = (get-date -f "yyyy.MM.dd HH:mm:ss") $d=$ds+($f.DirectoryName -ireplace ([regex]::escape($sc)), "") if (!(Test-Path ($d))) { md $d } if ($f -like "~$*" -Or $f -like "Thumbs.db") { Write-Output "${dt}: Delete $f" | Out-File -filepath $lg -encoding "UTF8" -Append Remove-Item $f.FullName -Force -Confirm:$false } else { Write-Output "${dt}: Move $f to $d" | Out-File -filepath $lg -encoding "UTF8" -Append Move-Item $f.FullName $d -Force -Confirm:$false } } # Пример использования: # %SystemRoot%\system32\WindowsPowerShell\v1.0\powershell.exe C:\Service\A004.ps1 "D:\FileServer" "X:\Backup" "365" "X:\Log\archive.log" # Где: # "C:\Service\A004.ps1" - путь до скрипта # "D:\FileServer" - раздел с данными # "X:\Backup" - раздел с архивными данными # "365" - срок актуальности данных (в днях) # "X:\Log\archive.log" - журнал с действиями # Архивация данных из одного каталога, в другой по дате последнего изменения
[Скачать audit.ps1] # Аудит локальной системы (сбор информации)
Содержимое audit.ps1
# Аудит локальной системы (сбор информации) # Опрос системы на установленное ПО, аппаратную конфигурацию, наличие обновлений, сетевую конфигурацию и пр. #version: 0.3beta $hm=hostname $spath=split-path -parent $MyInvocation.MyCommand.Definition $mpath="$spath\report" $dt=Get-Date -f yyyy.MM.dd $dtf=Get-Date -f yyyy-MM-dd-HH-mm $mfile=$hm+"_"+$dtf+".txt" write-host "Checking service path..." if (test-path $mpath) {write-host "Service path exists."} else {md $mpath;write-host "Service path created."} write-host "Write headers." Write-Output "Inv date: $dt" | Out-File $mpath\$mfile Write-Output "---------------------------------" | Out-File $mpath\$mfile -Append Write-Output "" | Out-File $mpath\$mfile -Append Write-Output "Step: IPCONFIG /ALL" | Out-File $mpath\$mfile -Append Write-Host "Step: IPCONFIG /ALL" ipconfig /all | Out-File $mpath\$mfile -Append Write-Output "---------------------------------" | Out-File $mpath\$mfile -Append Write-Output "" | Out-File $mpath\$mfile -Append Write-Output "Step: ROUTE PRINT" | Out-File $mpath\$mfile -Append Write-Host "Step: ROUTE PRINT" route print | Out-File $mpath\$mfile -Append Write-Output "---------------------------------" | Out-File $mpath\$mfile -Append Write-Output "" | Out-File $mpath\$mfile -Append Write-Output "Step: SYSTEMINFO" | Out-File $mpath\$mfile -Append Write-Host "Step: SYSTEMINFO" systeminfo | Out-File $mpath\$mfile -Append Write-Output "---------------------------------" | Out-File $mpath\$mfile -Append Write-Output "" | Out-File $mpath\$mfile -Append Write-Output "Step: NETSTAT -A" | Out-File $mpath\$mfile -Append Write-Host "Step: NETSTAT -A" netstat -a | Out-File $mpath\$mfile -Append Write-Output "---------------------------------" | Out-File $mpath\$mfile -Append Write-Output "" | Out-File $mpath\$mfile -Append Write-Output "Step: ARP -A" | Out-File $mpath\$mfile -Append Write-Host "Step: ARP -A" arp -a | Out-File $mpath\$mfile -Append Write-Output "---------------------------------" | Out-File $mpath\$mfile -Append Write-Output "" | Out-File $mpath\$mfile -Append Write-Output "Step: NET USE" | Out-File $mpath\$mfile -Append Write-Host "Step: NET USE" net use | Out-File $mpath\$mfile -Append Write-Output "---------------------------------" | Out-File $mpath\$mfile -Append Write-Output "" | Out-File $mpath\$mfile -Append Write-Output "Step: NETSH ADVFIREWALL FIREWALL SHOW RULE ALL" | Out-File $mpath\$mfile -Append Write-Host "Step: NETSH ADVFIREWALL FIREWALL SHOW RULE ALL" netsh advfirewall firewall show rule all | Out-File $mpath\$mfile -Append Write-Output "---------------------------------" | Out-File $mpath\$mfile -Append Write-Output "" | Out-File $mpath\$mfile -Append Write-Output "Step: NET LOCALGROUP" | Out-File $mpath\$mfile -Append Write-Host "Step: NET LOCALGROUP" net localgroup | Out-File $mpath\$mfile -Append Write-Output "---------------------------------" | Out-File $mpath\$mfile -Append Write-Output "" | Out-File $mpath\$mfile -Append Write-Output "Step: NET USER" | Out-File $mpath\$mfile -Append Write-Host "Step: NET USER" net user | Out-File $mpath\$mfile -Append Write-Output "---------------------------------" | Out-File $mpath\$mfile -Append Write-Output "" | Out-File $mpath\$mfile -Append Write-Output "Step: Test-Connection ipatron.ru -Count 10 -BufferSize 1024" | Out-File $mpath\$mfile -Append Write-Host "Step: Test-Connection ipatron.ru -Count 10 -BufferSize 1024" Test-Connection ipatron.ru -Count 10 -BufferSize 1024 | Out-File $mpath\$mfile -Append Write-Output "---------------------------------" | Out-File $mpath\$mfile -Append Write-Output "" | Out-File $mpath\$mfile -Append Write-Host "Copy cygwin1.dll to Windows dir." Copy-Item $spath\cygwin1.dll $env:windir Write-Host "Register library cygwin1.dll." regsvr32 cygwin1.dll -silentcontinue Write-Output "Step: IPERF3 -p 65001 -c l2tp.mcprombez.ru -i 10 -t 60" | Out-File $mpath\$mfile -Append Write-Host "Step: IPERF3 -p 65001 -c l2tp.mcprombez.ru -i 10 -t 60" & "$spath\iperf3.exe" -p 65001 -c l2tp.mcprombez.ru -i 10 -t 60 | Out-File $mpath\$mfile -Append Write-Output "---------------------------------" | Out-File $mpath\$mfile -Append Write-Output "" | Out-File $mpath\$mfile -Append Write-Output "Step: DISKS DATA" | Out-File $mpath\$mfile -Append Write-Host "Get local disks." $ld=Get-WMIObject -Class Win32_logicaldisk -Filter "DriveType=3" | Select-Object DeviceID $ld=$ld.DeviceID Write-Host "Get disks data." Foreach ($dl in $ld) { $colItems = (Get-ChildItem $dl\ -force -ErrorAction SilentlyContinue | Where-Object {$_.PSIsContainer -eq $True} | Sort-Object) foreach ($i in $colItems) { $subFolderItems = (Get-ChildItem $i.FullName -force -recurse -ErrorAction SilentlyContinue | Measure-Object -property length -sum -ErrorAction SilentlyContinue) $i.FullName + " -- " + "{0:N2}" -f ($subFolderItems.sum / 1MB) + " MB" | Out-File $mpath\$mfile -Append if ($i.Name -match "Users") { $colIUtems = (Get-ChildItem $i -force -ErrorAction SilentlyContinue | Where-Object {$_.PSIsContainer -eq $True} | Sort-Object) foreach ($iu in $colIUtems) { $subFolderIUtems = (Get-ChildItem $iu.FullName -force -recurse -ErrorAction SilentlyContinue | Measure-Object -property length -sum -ErrorAction SilentlyContinue) $iu.FullName + " -- " + "{0:N2}" -f ($subFolderIUtems.sum / 1MB) + " MB" | Out-File $mpath\$mfile -Append } } } } Write-Output "---------------------------------" | Out-File $mpath\$mfile -Append Write-Output "" | Out-File $mpath\$mfile -Append Write-Output "Step: Get-Disk | Get-StorageReliabilityCounter (DISK HEALTH)" | Out-File $mpath\$mfile -Append Write-Host "Step: Get-Disk | Get-StorageReliabilityCounter (DISK HEALTH)" Get-Disk | Get-StorageReliabilityCounter | Out-File $mpath\$mfile -Append # Опрос системы на установленное ПО, аппаратную конфигурацию, наличие обновлений, сетевую конфигурацию и пр.
[Скачать backup_v1.ps1] # Резервирование файлового сервера (v.1)
Содержимое backup_v1.ps1
# Резервирование файлового сервера (v.1) # Создание архивных копий актуальных данных файлового сервера # Назначение переменной $spath (рабочий каталог = каталог скрипта) $spath=split-path -parent $MyInvocation.MyCommand.Definition # Назначение перменной = дата ($dt.d) и время ($dt.h) $dt=New-Object PsObject -Property @{d=Get-Date -f "yyyyMMdd";h=Get-Date -f "HHmmss";} # Назначение нового массива $opath = содержимого каталога ранее заданного $opath (с исключением директорий, без рекурсии) $opath = "c:\Service\temp\test\" $opath = Get-ChildItem $opath -filter * | where {$_.PSIsContainer -eq $false} # Назначение переменной $npath = каталог постоянного хранения резервных копий $npath = "c:\Service\temp\npath\" # Цикл для каждого $i из массива $opath выполнить: Foreach ($i in $opath) { # Назначение проходной переменной = дата ($a.d) и время ($a.h) $a=New-Object PsObject -Property @{d=Get-Date $i.LastWriteTime -f "yyyyMMdd";h=Get-Date $i.LastWriteTime -f "HHmmss";} # Получение разницы от $dt.d и $a.d (текущая дата и дата текущего в проходе файла, результат преобразован в целочисленное значение), если разница больше 1 выполнить: if ([int]($dt.d-$a.d) -ge 1) { # Перемещение текущего в проходе файла в каталог $npath в принудительном режиме, подавляя запрос на замену уже существующего одноименного файла Move-Item $i.FullName $npath -Force -Confirm:$false } } # Создание архивных копий актуальных данных файлового сервера
[Скачать backup_v2.ps1] # Резервирование файлового сервера (v.2)
Содержимое backup_v2.ps1
# Резервирование файлового сервера (v.2) # Создание архивных копий актуальных данных файлового сервера # Назначение переменной $s для исключения из пути-источника (используется далее) $s="D:\\fs\\" # Назначение переменной $spth - каталог скрипта (базовый) $spth = split-path -parent $MyInvocation.MyCommand.Definition # Назначение переменной $cA - Каталог с актуальными копиями (далее - 'A') $cA = "D:\fs\01-Общие\" # Назначение переменной $cB - Каталог постоянного хранения (далее - 'B') $cB = "\\domain\fs\08-Backup\01-B00\02-FS" # Назначение переменной $ht и $htD (путь и файл таблицы хешей) $ht="$spth\hashtable.csv" $htD="$spth\hashtable_dup.csv" # Создание комплексной переменной на основе даты (раздельные значения для "год"=$dt.y, "месяц"=$dt.m, "день"=$dt.d) $dt = New-Object PsObject -Property @{y=Get-date -f "yyyy"; m=Get-Date -f "MM"; d=Get-Date -f "dd"; f=Get-Date -f "yyyyMMdd"; h=Get-date -f "hh"; mm=Get-date -f "mm";} # ПО для выполнения архивации (7zip) $7z = "C:\Program Files\7-Zip\7z.exe" # Проверка существования и загрузка текущей таблицы хешей в массив $hta (создание массива в случае отсутсвия) if(Test-Path ($ht)) { [psobject[]]$hta=import-csv "$ht" -Encoding UTF8 } else { $hta=@() } # Проверка существования и загрузка текущей таблицы хешей дубликатов в массив $htb (создание массива в случае отсутсвия) if(Test-Path ($htD)) { [psobject[]]$htb=import-csv "$htD" -Encoding UTF8 } else { $htb=@() } # Создание полного списка файлов для хеширования и проверки $toCheck = Get-ChildItem $cA -R | where {! $_.PSIsContainer -eq $true} # Назначение функции Calc-Hash для хеширования Function Calc-Hash { Param ( [parameter(Position=0, Mandatory=$true, ValueFromPipeline=$false)] $file ) Begin { $md5 = New-Object -TypeName System.Security.Cryptography.MD5CryptoServiceProvider } Process { $hash = [System.BitConverter]::ToString($md5.ComputeHash([System.IO.File]::ReadAllBytes($file))) Write-Output $hash } } # Создание массива $toBackup из файлов к резервированию $toBackup=@() # Цикл создания хешей в массив $hta (в случае отсутсвия) и формирование списка файлов к резервированию Foreach ($f in $toCheck) { $h=Calc-Hash $f.FullName # Пропустить обработку текущего файла, если хэш не создан (например, изза недостатка прав) if (!($h)) { Write-Output "File '$f' Locked" | Out-File -filepath "$cB\locked.log" -encoding "UTF8" -Append Continue } $uid=($h+$f.FullName) if ($hta.hash -notcontains $h) { # Пополнение массива хешей (таблицы) новым уникальным значением $hta+=New-Object PsObject -Property @{hash=$h;file=$f.FullName;uid=$uid;} # Формирование списка файлов для резервирования с дополнительными параметрами (стандартные для файла + хеш) $toBackup+=$f | select @{n='Extension';e={$f.Extension}},@{n='FullName';e={$f.FullName}},@{n='BaseName';e={$f.BaseName}},@{n='Name';e={$f.Name}},@{n='Directory';e={$f.DirectoryName}},@{n='Hash';e={$h}} } elseif ($hta.uid -notcontains $uid) { if ($htb.uid -notcontains $uid) { # Назначение переменных для текущего и существующего файла $CurrentFile=$f.FullName $ExistFile=($hta -match $h).file # Переменная для лог-файла (полная дата и время) $dtf=$dt.y+"-"+$dt.m+"-"+$dt.d+" "+$dt.h+":"+$dt.mm $htb+=New-Object PsObject -Property @{hash=$h;fileA=$CurrentFile;fileB=$ExistFile;uid=$uid;} # Формирование лог-файла с сопоставлением дубликат = оригинал $duplog="$cB\dublicates.log" Write-Output "[$dtf] $CurrentFile = $ExistFile" | Out-File -filepath $duplog -encoding "UTF8" -Append } } } # Цикл резервирования файлов по списку массива $toBackup Foreach ($b in $toBackup) { # Формирование каталога размещения копии из замены $s в пути-источника на $cB (размещение идентично начальному, внутри каталога назначения) $bD=($b.Directory -replace $s,$cB) $bF=$bD+"\"+($b.Name) # Проверка существования каталога (создание, если отсутствует) if(!(Test-Path ($bD))) { md $bD } # Копирование файла # Проверка существование старой версии файла (архивация, если существует) if(Test-Path ($bF)) { # Назначение переменной для имени будущего архива $bFn=$bD+"\"+$b.BaseName+$b.Extension+"_"+$dt.f+".7z" # Архивация старой версии файла & $7z @('a','-t7z',$bFn,$bF) # Удалить старую версию файла Remove-Item $bF # Скопировать новую Copy-Item $b.FullName $bD } else { Copy-Item $b.FullName $bD } } # Выгрузить новые значения для таблиц с хешами архивированных файлов $hta | export-csv $ht -NoTypeInformation -Encoding UTF8 $htb | export-csv $htD -NoTypeInformation -Encoding UTF8 # Создание архивных копий актуальных данных файлового сервера
[Скачать block.ps1] # Блокировка исходящих соединений (Windows Firewall)
Содержимое block.ps1
# Блокировка исходящих соединений (Windows Firewall) # Создание правила в Windows Firewall для каждого приложения (.exe) в заданном каталоге # Передать в переменную $s каталог с приложениями $s=$args[0] # Получить из каталога $s список *.exe файлов в массив $d $d=Get-ChildItem $s -Filter *.exe -Recurse -Attributes !d,!d+h # Для каждого $f в массиве $d создать запрещающее исходящее соединение правило Foreach ($f in $d) { New-NetFirewallRule -DisplayName "Block: $f" -Direction Outbound -Program $f.FullName -Action Block } # Пример использования: # %SystemRoot%\system32\WindowsPowerShell\v1.0\powershell.exe C:\Service\A005.ps1 "c:\Program Files (x86)\TeamViewer\" # Где: # C:\Service\A005.ps1 - путь до скрипта # "c:\Program Files (x86)\TeamViewer\" - раздел с приложением(ями) # Создание правила в Windows Firewall для каждого приложения (.exe) в заданном каталоге
[Скачать filter_eml.ps1] # Парсер и фильтрация почтовых адресов
Содержимое filter_eml.ps1
# Парсер и фильтрация почтовых адресов # Разделение базы email адресов по популярным доменам, фильтр недействующих и битых адресов $file = Read-Host -Prompt 'Enter list name' $spth = split-path -parent $MyInvocation.MyCommand.Definition $mpth = "$spth\list" if(!(Test-Path ($mpth))) { Write-Output "Result folder and address list didnt exist" Break } $flst = "$mpth\$file" $md5 = New-Object -TypeName System.Security.Cryptography.MD5CryptoServiceProvider $hash = [System.BitConverter]::ToString($md5.ComputeHash([System.IO.File]::ReadAllBytes($flst))) $path = "$mpth\$hash" if(Test-Path ($path)) { } else { md $path $ListSkip = Get-Content "$spth\skip" $WhiteListRE = Get-Content "$spth\whiteskip" $ListDomains = Get-Content "$spth\domain-exclude" $WhiteList = Get-Content "$spth\whitelist" $BlackList = Get-Content "$spth\addr-exclude" $SelfList = Get-Content "$spth\selflist" $global:ListValidDomains = @() $global:ListValidDomains += "@mail.ru", "@bk.ru", "@list.ru", "@yandex.ru", "@ya.ru" $global:ListInvalidDomains = @() $global:ListInvalidDomains += "@domain.ru", "@domain.com", "@test.ru", "@example.ru", "@example.com", "@test.com", "@mail.gmail.com" Function Clean-List { Param ( [parameter(Position=0, Mandatory=$true, ValueFromPipeline=$false)] $array ) Begin { $ListInput = $array } Process { ForEach ($addr in $ListInput) { if ($WhiteList -contains $addr) { Write-Output $addr | Out-File -filepath "$path\$file" -encoding "UTF8" -Append Continue } $mod_skip = 0 $addr_domn = ("@" + ($addr -split "@")[-1]) ForEach ($checkre in $WhiteListRE) { if ($addr -match $checkre) { Write-Output $addr | Out-File -filepath "$path\$file" -encoding "UTF8" -Append $mod_skip = 1 Break } } if ($mod_skip -eq 0) { ForEach ($check in $SelfList) { if ($addr -match $check) { Write-Output $addr | Out-File -filepath "$path\exclude_self.log" -encoding "UTF8" -Append $mod_skip = 1 Break } } } if ($mod_skip -eq 0) { ForEach ($scheck in $ListSkip) { if ($addr -match $scheck) { Write-Output $addr | Out-File -filepath "$path\exclude_skip.log" -encoding "UTF8" -Append $mod_skip = 1 Break } } } if ($mod_skip -eq 0) { if ($BlackList -contains $addr) { Write-Output $addr | Out-File -filepath "$path\exclude_bl.log" -encoding "UTF8" -Append Continue } } if ($mod_skip -eq 1) { Continue } elseif ($addr.length -gt 40) { Write-Output $addr | Out-File -filepath "$path\exclude_length.log" -encoding "UTF8" -Append } elseif ($ListDomains -contains $addr_domn) { Write-Output $addr | Out-File -filepath "$path\exclude_domains.log" -encoding "UTF8" -Append } elseif ($ListValidDomains -notcontains $addr_domn) { if ($ListInvalidDomains -notcontains $addr_domn) { $domain_dns = ($addr_domn -replace "@","") $domain_lkp = Resolve-DnsName $domain_dns -Type mx if ($domain_lkp) { $mx = $domain_lkp."NameExchange" $global:ListValidDomains += $addr_domn Write-Output $addr | Out-File -filepath "$path\$file" -encoding "UTF8" -Append } else { $global:ListInvalidDomains += $addr_