Всем привет.
Джеффри Хикс в свое время публиковал статью по PowerShell, посвященную управлению папками на файловых серверах. В оригинале статья была разбита на две части: построение отчетов по файловому серверу и непосредственно управление файловыми шарами. В первой части были рассмотрено построение отчетов.
Вчера я провел аудит первой части, подумав, зачем мне изобретать велосипед, если такую задачу наверняка уже решали. Так ревизии подвергнулалсь первая часть в разрезе:
- список всех сетевых папок на компьютере;
- отчет о размерах высокоуровневых сетевых папок;
- отчет об использовании файловых шар;
- отчет который сгруппировал файловые шары по владельцу.
Собственно подход и продвижение по пунктам, даже в переводе (оригинал я уже не нашел), вы можете найти здесь. Мой результат после ревизии кода получился следующий:
$ServerName = 'Имя сервера'
$share = Get-WmiObject -Class Win32_Share -ComputerName $ServerName –filter "type=0 AND name like '%[^$]'"
$share.path
Отчет 1: про размеры высокоуровневых сетевых папок.
$sb={
$shares=Get-WmiObject -Class Win32_Share -filter "type=0 AND name like '%[^$]'"
foreach ($share in $shares) {
dir $share.path | where {$_.PSIscontainer} | `
foreach {
$stats = dir $_.Fullname -recurse -errorAction 'SilentlyContinue' | where {-NOT $_.PSIscontainer} | `
Measure-object -Property Length -sum
New-Object -TypeName PSObject -Property @{
Computername=$env:Computername
Path=$_.Name
Fullname=$_.Fullname
SizeMB=[math]::Round(($stats.sum/1MB),2)
NumberFiles=$stats.count
} #property
} #foreach stats
}
} #sb
$results = Invoke-Command -ScriptBlock $sb -ComputerName $ServerName -HideComputerName
$results | Format-Table Computername,Fullname,SizeMB,NumberFiles -autosize
Отчет 2: про использование файловых шар.
$sb={
$shares=Get-WmiObject -Class Win32_Share -filter "type=0 AND name like '%[^$]'"
foreach ($share in $shares) {
#Suppress any access denied error messages.
Write-Host "Measuring $($share.path)" -ForegroundColor Green
$stats=dir $share.path -Recurse -ErrorAction SilentlyContinue |
Where {-Not $_.PSIscontainer} |
Measure-Object -Property Length -Sum
$hash=@{
Computername=$env:Computername
Path=$share.path
Share=$share.Name
SizeMB=[math]::Round(($stats.sum/1MB),2)
Files=$stats.count
}
#Write a custom object to the pipeline for each share.
New-Object -TypeName PSObject -Property $hash
} #foreach $share
}#sb
$results = Invoke-Command -ScriptBlock $sb -ComputerName $ServerName -HideComputerName
$results | sort SizeKB –Descending | Select Computername,Share,SizeMB,Files | ft -auto
Пример 3: группируем файловые шары по владельцу.
$sb={
$shares = Get-WmiObject -Class Win32_Share -filter "type=0 AND name like '%[^$]'"
foreach ($share in $shares) {
#Suppress any access denied error messages.
Write-Host "Measuring $($share.path)" -ForegroundColor Green
$data = dir $share.path | where {-not $_.PSIsContainer} | select name, @{Name="Owner";Expression={(Get-ACL -LiteralPath $_.fullname).Owner}},length
$data | group -property owner | Select @{Name="Computername";Expression={$env:computername}},@{Name="Path";Expression={$share.path}},Name,Count,@{Name="Size";Expression={($_.Group | Measure-Object -Property Length -sum).Sum}}
}
} #sb
$results = Invoke-Command -ScriptBlock $sb -ComputerName $ServerName -HideComputerName | Select * -ExcludeProperty RunspaceID
$results | Sort Size | ft -auto
По последнему отчету замечание - увы, но запрос не учитывает вложенность и считает только первый уровень файловой шары.
На сегодня все.
Слава Украине!
No comments:
Post a Comment
А что вы думаете по этому поводу?