Управление файловым сервером с помощью PowerShell

2,196 views

Published on

Руководство по управлению файловым сервером от Джефри Хикса

Published in: Technology
0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total views
2,196
On SlideShare
0
From Embeds
0
Number of Embeds
1
Actions
Shares
0
Downloads
0
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

Управление файловым сервером с помощью PowerShell

  1. 1. СодержаниеВведение ......................................................................................................................................................3Получаем отчеты по сетевым папкам с помощью PowerShell ................................................................4Получаем все сетевые папки..................................................................................................................4Получаем размер сетевой папки ...........................................................................................................5Получаем файлы по владельцу..............................................................................................................7Управляем сетевыми папками с помощью PowerShell..........................................................................12Создаем новые папки ...........................................................................................................................12Расширенные настройки папки............................................................................................................13Удаляем сетевые папки ........................................................................................................................14Сводим воедино....................................................................................................................................15
  2. 2. ВведениеPowerShell позволяет упростить ряд задач управления файловыми серверами. В этом руководствеДжеффри Хикс рассматривает как с помощью простых интерактивных команд можно построитьотчеты по файлам и сетевым папкам на файлом сервере, а также осуществить такие простыеоперации как создание и удаление папки и задание разрешений.
  3. 3. Получаем отчеты по сетевым папкам спомощью PowerShellДанный раздел посвящен созданию отчетов по файловым серверам. В нем будут рассмотреныследующие вопросы:Как вывести список всех сетевых папок на компьютере (компьютерах)Создаем отчеты о размерах сетевых папокОпределяем владельцев файловНаходим дату создания файлов выявляем «старые» файлы и файлы, созданные заопределенный промежуток времени)Получаем все сетевые папкиНачнем с того, что определим, что же расшарено. Задача проста: просто осуществляем запроскласса Win32_Share, чтобы использовать Windows Management Instrumentation (WMI). Вам дажене нужно логиниться на файловом сервере. Вы можете запустить эту команду откуда угодно.Get -WmiObject - class -Win32_Share -computername chi-fp01Вместо chi-fp01 укажем имя интересующего нас компьютераЗапустив эту команду Вы получите все сетевые папки, включая принтеры (если таковыеимеются). Но так как мы говорим о файловых шарах, то давайте ограничим запрос. Всеэкземпляры Win32_Share имеют свойство Type, как показано в таблице 1.Добавим фильтр в первоначальную команду:Get -WmiObject - class -Win32_Share -computername chi-fp01 – filter "Type=0"Тем самым мы выводим только нужную информацию.
  4. 4. Но если вы ищите также и скрытые папки – те, которые заканчиваются знаком доллара ($) –фильтр придется слегка переписать:Get -WmiObject - Class win32_share -computername chi-fp01 – filter "Type=0 AND name like %$"В WMI знак процента (%) используется вместо знака подстановки (wildcard). Вывести все папки,кроме тех, которые скрыты чуть сложнее.Get -WmiObject - Class win32_share -computername chi-fp01– filter "type=0 AND name like %[^$]"Команда выведен все объекты Win32_Share, у которых свойство Type равно 0 и имя незаканчивается на $.Получаем размер сетевой папкиДовольно часто необходима информация о том, сколько места занимают файловые шары.Используем Get-ChildItem, или его сокращение dir, и передадим результаты в Measure-Object:dir c:shares public -recurse | where {- Not $_.PSIsContainer}| Measure-Object - Property length -Sum -Minimum -MaximumВ итоге вы получите информацию об общем числе объектов, размер в байтах, наименьшие инаибольшее размерах файлов. В предыдущей команде, применил фильтр. В PowerShell 3.0 то жесамое можно сделать проще, однако та команда, которую я использовал, работает как v2.0, так и3.0. Ее лучше всего запускать локально. Код в примере 1 комбинирует эту команду с нашейтехникой WMI, чтобы получить отчет о размере высокоуровневых папок.Пример 1: Отчет о размерах высокоуровневых сетевых папок$share= Get -WmiObject - Class Win32_Share -ComputerNameCHI-FP01 - filter "name=Sales"
  5. 5. $sb={Param ($path)dir $path | where {$_.PSIscontainer} |foreach {$stats=dir $_.Fullname -recurse -errorAction"SilentlyContinue" | where {- NOT $_.PSIscontainer} |Measure-object - Property Length -sumNew -Object - TypeName PSObject - Property @{Computername=$env:ComputernamePath=$_.NameFullname=$_.FullnameSizeKB=[math]:: Round (($stats.sum/ 1 KB), 2 )NumberFiles=$stats.count} # property} #foreach} #sb$results=Invoke-Command -ScriptBlock $sb -ComputerName$share.__ SERVER -ArgumentList @($share.path)-HideComputerNameВы можете форматировать или обрабатывать $results как вашей душе будет угодно. Нужнаудобоваримая таблица? Просто используйте следующую команду:$results | Format-Table Computername,Fullname,SizeKB,NumberFiles -autosizeТем самым можно сделать полный отчет по использованию всех папок на файловом сервере несоставляет труда. Сэкономьте время, воспользуетесь примером 2.Пример 2: Отчет об использовании файловых шар$sb={# Get the file shares locally.$shares= Get -WmiObject - Class Win32_Share - filter "type=0"foreach ($share in $shares) {#Suppress any access denied error messages.
  6. 6. 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:ComputernamePath=$share.pathShare=$share.NameSizeKB=[math]:: Round (($stats.sum/ 1 KB), 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 -ComputerNameCHI-FP01 -HideComputerNameИ снова я слегка отформатирую таблицу.$results | sort SizeKB –Descending | Select Computername,Share,SizeKB,Files | ft -autoПолучаем файлы по владельцуДвигаемся дальше – найдем владельцев файлов. Если вы используете квоты, отчеты уженаверняка получаете. В противном случае, все, что вам нужно – это извлечь ACL файла, которыйвключает в себя владельца, и агрегировать результаты. Лучше всего добавить владельца файлав качестве кастомного свойства$data=dir | where {- not $_.PSIsContainer} | select name, @{Name= "Owner" ;Expression={( Get -ACL$_.fullname).Owner}}, length
  7. 7. Мы можем группировать по свойству нового владельца и затем обрабатывать новый объект.$data | group owner | Select Name,Count,@{Name= "Size" ;Expression={($_.Group | Measure-Object -Property Length -sum).Sum}}Пара усилий и вы можете применить тот же подход к файловой шаре, как указано в кодепримера 3.Пример 3: Группируем файловые шары по владельцу$sb={Param($path)$data=dir $path |where {- not $_.PSIsContainer} |select name, @{Name= "Owner" ;Expression={( Get -ACL $_.fullname).Owner}},length$data | group - property owner |Select @{Name= "Computername" ;Expression={$env:computername}},@{Name= "Path" ;Expression={$path}},Name,Count,@{Name="Size" ;Expression={($_.Group | Measure-Object - Property Length -sum).Sum}}} #sb<#Run the command remotely and suppress the RunspaceID since wedon t really need it.#>Invoke-Command -ScriptBlock $sb -ComputerName CHI-FP01-ArgumentList @( "c:sharespublic" ) -HideComputerName |Select * -ExcludeProperty RunspaceIDЯ также должен указать на то, что могут проблемы: с файлами, имя которых более 260 символовили содержит необычные символы, особенно если вы пытаетесь запустить Get-ACL. В PowerShell3.0 этот командлет имеет параметр -LiteralPath, что помогает решить вышеуказанные проблемы.Опять выведем читаемую таблицу.$data | Sort Size | ft -auto
  8. 8. Получаем файлы по дате созданияПоследняя техника создания отчетов, которую я хочу продемонстрировать – это создание отчетас последними созданными файлами. Фактически, мы создаем коллекцию объектов, которуюможем использовать несколькими способами. Возможно вы захотите использовать объекты илиудалить или переместить файлы, или может захотите построить отчет, который можно отправитьруководству. Всегда создавайте команды PowerShell так, чтобы потом их можно использовать.Определить возраст файл не так просто. В PowerShell файловый объект (объект типа файл) имеетнесколько свойств, которые вы возможно захотите использовать. Например, команда:get -item c:workwishlist.txt | Format-List Name,* timeдает вывод, представленный на скриншоте ниже.Лично я считаю, что лучше использовать LastWriteTime, который обозначает, когда к файлу впоследний раз обращались. Мне встречались ситуации, когда LastAccessTime обновлялся черезсторонние программы, например, антивирус, что само по себе уже не означает правды.И LastAccessTime был деактивировал еще со времени Windows Vista, хотя вы можете еговключить. Вам также нужно быть осторожным, потому что эти значения могут меняться взависимости от того, копируете ли вы или перемещаете файлы между дисками (betweenvolumes). Но вы можете решить это сами. Используя этот файл как пример, мы может заставитьPowerShell сказать нам, насколько стар файл. См. пример 4.
  9. 9. Пример 4. Определяем возраст файловPS C:work> get -item wishlist.txt | format-list name,CreationTime,LastWriteTime,>> @{Name= "Age" ;Expression={( Get - Date )-$_.LastWriteTime}},>> @{Name= "Days" ;Expression={(( Get - Date )-$_.LastWriteTime).TotalDays}}>>Name : wishlist.txtCreationTime : 11 / 23 / 2010 10 : 31 : 10 PMLastWriteTime : 2 / 15 / 2011 7 : 36 : 34 AMAge : 511.06 : 42 : 17.4251748Days : 511.279372271039Свойство Age является объектом TimeSpan, и свойство Days является простосвойством TotalDays этого объекта. Но так как мы можем этом сделать для одного файла, мыможем сделать и для других Давайте взглянем на мою общую папку и найдем все файлы,которые не менялись за последние 400 дней.dir c:shares public -recurse | Select Fullname,CreationTime,LastWriteTime,@{Name= "Age" ;Expression={( Get - Date )-$_.LastWriteTime}},@{Name= "Days" ;Expression={[ int ](( Get - Date ) -$_.LastWriteTime).TotalDays}},@{Name= "Owner" ;Expression={( Get -ACL $_.fullname).Owner}} | Where {$_.Days -ge 400 } | Sort Days-DescendingЯ пойду дальше и включу еще и владельца файла. На скриншоте ниже показаны результаты отзапуска этого код в удаленной сессии на моем файловом сервере.Я могу сохранить эти результаты в переменную и использовать их в любое время. Так как у меняесть полное имя файла, передать в другую команду, например, Remove-Item, не составит труда.Одной из моих любимых техник является определение того, сколько файлов было изменено загод.
  10. 10. dir c:sharessales -recurse | Select Fullname,LastWriteTime,@{Name= "Age" ;Expression={( Get - Date )-$_.LastWriteTime}},@{Name= "Year" ;Expression={$_.LastWriteTime. Year }} | Group-Object Year | Sort NameКак вы можете видеть на скриншоте, все выглядит причесано. Нужны детали? Можнопроанализировать свойство Group, которое представляет собой коллекцию файлов.Полезно знать, сколько файлов не изменялось за 30, 90 или 180 дней. К сожалению, простогоспособа использовать Group-Object для этого не существует, поэтому мне необходимо придется«пойти иным путем»; смотрите пример 5.Пример 5: Определяем период изменения файлов$path= "c:scripts"# Get some other properties in case we want to further#break down each bucket.$files=dir $path -recurse |Select Fullname,CreationTime,LastWriteTime,Length,@{Name= "Age" ;Expression={( Get - Date )-$_.LastWriteTime}},@{Name= "Days" ;Expression={[ int ](( Get - Date )-$_.LastWriteTime).TotalDays}}$hash=@{Path=$pathOver= ($files | Where {$_.Days -gt 365 } | Measure-Object).Count365Days= ($files | Where {$_.Days -gt 180 -AND$_.Days -le 365 } | Measure-Object).Count180Days= ($files | Where {$_.Days -gt 90 -AND$_.Days -le 180 } | Measure-Object).Count90Days= ($files | Where {$_.Days -gt 30 -AND$_.Days -le 90 } | Measure-Object).Count30Days= ($files | Where {$_.Days -gt 7 -AND$_.Days -le 30 } | Measure-Object).Count7Days= ($files | Where {$_.Days -gt 0 -AND
  11. 11. $_.Days -le 7 } | Measure-Object).Count}New -Object - TypeName PSObject - Property $hash |Select Path,Over, 365 Days, 180 Days, 90 Days, 30 Days, 7 DaysНа рисунке ниже показан результат, когда я запустил этот код для папки с моими скриптами,которая, как я знаю, имеет плотное распределение по возрасту (decent age distribution). Мой кодне включает в себя актуальные файлы, но это было бы слишком сложно изменить мой пример.Управляем сетевыми папками с помощьюPowerShellВ этом разделе в зоне нашего внимания находятся такие вопросы как создание сетевой папки,делегирование прав доступа к ней и прекращение совместного доступа.Создаем новые папкиТеперь давайте взглянем на то, как можно использовать PowerShell для создания файлов и папоки управления ими. Все, что я продемонстрирую, Вы можете использовать в PS 2.0 и 3.0 (хотя вPS 3.0 приводимые мною примеры можно упростить). Управление файловым сервером вPowerShell 2.0 требует обращения к WMI и написанию сложных скриптов. В PowerShell 3.0,особенно если у вас Windows Server 2012, этот тип управления значительно упрощен. Именно егоя и собираюсь рассмотреть.Все, что нам необходимо, уже имеется в модуле SMBShare, который по умолчанию установленна моей машине Windows 8. Команды в этом модуле позволят нам локально и удаленно управлятьпапками. Я не собираюсь останавливаться на каждой команде подробно – они довольнооднотипны; рекомендую прочитать справку и примеры. Мы же начнем с использованиякоманды New-SMBShare, чтобы создать новую папку.Сделать это нужно за пару шагов. Так как папка должна быть на удаленном сервере, яустановлю удаленную сессию PowerShell:$session= New -PSSession -ComputerName SRV2K12RCЯ, конечно, могу использовать интерактивную сессию, однако передо нами стоит задачаавтоматизации, так что использую команду Invoke-Command. Для начала я создам новуюпапку:invoke-command -ScriptBlock {mkdir c:sharescompanyfiles}-Session $sessionА сейчас сложная часть. Я хочу установить такие NTFS разрешения, чтобы JDHLABDomainUsers имела разрешения на изменения (Change). Для этого необходимо создать новое правилодоступа, изменяющего список правил доступа и заново применяющих их к папке. В примере 6
  12. 12. приведен пример скрипта:Пример 6: Создание, изменение и применение правила доступа$sb={Param($path)$du= new -object System.Security.AccessControl.FileSystemAccessRule "jdhlabdomain users" , "Modify" , "allow"$acl = Get -ACL $path$acl.AddAccessRule($du)Set -Acl -Path $path -AclObject $acl}В примере 6 я сделал так, чтобы параметр пути можно было заново использовать.Invoke-Command -ScriptBlock $sb -Session $session -ArgumentListc:sharescompanyfilesСуществует способы упростить этот процесс, но для целей ясности мы сохраним все так как есть.Сейчас мы готовы создать новую папку.Я могу использовать эту сессию, но я хочу продемонстрировать, как можно использоватькоманду New-SmbShare, чтобы удаленно подключиться к файловому серверу:New -SmbShare -Name Files -Path c:sharescompanyfiles-CimSession SRV2K12RC -FullAccess "jdhlabdomain admins"-ChangeAccess Everyone -Description "Company files"Право доступа к папке по умолчанию стоит “Только чтение” (ReadOnly). Я выдал доменнымадминам Полный контроль (Full Control) на папку, и всем остальным выдал права на изменение(Change). Этот путь относителен к удаленному компьютеру, который должен работать под PS 3.0.Расширенные настройки папкиПолучить информацию о папке можно в любое время, использовав команду Get-SMBShare, каквы можете видеть на рисунке 9. Можно сделать еще парочку вещей с нашими папками,например, зашифровать SMB соединение, какой режим перечисления (enumeration mode) и типкеширования использовать для папки. Я собираюсь использовать Set-SMBShare, чтобосуществить гибкую настройку для только что созданной папки. Посмотрим это на примере 7.Пример 7: Гибкая настройка папкиPS C:> Set -SmbShare -Name Files -EncryptData $ True-FolderEnumerationMode AccessBased -CachingModeDocuments -CimSession SRV2K12RCConfirmAre you sure you want to perform this action?SRV2K12RC: Performing operation Modify on Target *,Files.[Y] Yes [A] Yes to All [N] No [L] No to All [S] Suspend [?]Help ( default is "Y" ):
  13. 13. Указанное выше применяется к одной единственной папке, но вы с легкостью можетеиспользовать Get-SMBShare для извлечение всех папок и их последующей передачи в Set-SMBShare и применения изменений к ним всем:Get -SMBShare -CimSession SRV2K12RC -Special $ False | Set -SmbShare -EncryptData $ True -Confirm:$ falseЭта команда извлечет все папки (кроме административных папок) на компьютере SRV2K12RC иустановим свойствоEncryptData в значении True. Мне не хочется подтверждать каждоедействие, поэтому переключатель Confirm установлен в значение False. Set-SMBshare незапишет ничего в конвейер, в том случае если вы не используете –Passthru. Как видите, я смогизменить все с помощью одной единственной команды.Удаляем сетевые папкиНапоследок удалим сетевую папку. Код в примере 8 полностью отключает совместный доступ кпапке, которую я только что создал. Можно ли это сделать проще? Конечно, структура папок досих пор на файловом сервере.Пример 8: Удаляем сетевую папкуPS C:> Remove-SmbShare -Name Files -CimSession SRV2K12RCConfirmAre you sure you want to perform this action?SRV2K12RC: Performing operation Remove-Share on Target*,Files.[Y] Yes [A] Yes to All [N] No [L] No to All [S] Suspend [?]Help ( default is "Y" ):
  14. 14. Сводим воединоА теперь давайте сведем все в одном скрипте. Не вдаваясь с детали кода, отмечу, что командымогут быть запущены параллельно. Например, после создания папки, создаю сетевую папку иустанавливаю NTFS разрешения в то же время, см. пример 9.Пример 9: Создаем сетевую папку и устанавливаем NTFS разрешенияWorkflow New-FileShare {Param([string]$Name,[string]$Path,[string]$Principal,[string]$Right="Modify")#Это делаем в первую очередь.Sequence {#создаем папкуWrite-Verbose -Message "Creating new folder $path on$pscomputername"$newfolder = New-Item -Path $path -ItemType Directory}#Идем дальше.Sequence {Parallel {#эти команды могут быть запущены параллельноInlineScript {Write-Verbose -Message "Modifying NTFS permissions"Write-Verbose -Message "Creating entry for$using:principal with a right of $using:Right"$entry=New-Object -typename System.Security.AccessControl.FileSystemAccessRule -argumentlist$using:Principal,$using:Right,"allow"#получаем существующий ACL$acl = Get-ACL -path $using:path#добавляем новую запись$acl.AddAccessRule($entry)Write-Verbose -Message "Applying the new ACL"Set-Acl -Path $using:path -AclObject $acl} #inline#Создаем сетевую папку.Write-Verbose -message "Creating the file share $name"$newshare = New-SmbShare -Name $name -Path $path-Description "File share for $principal" -EncryptData $True-FolderEnumerationMode AccessBased -CachingModeDocuments -FullAccess "$env:userdomaindomain admins"-ChangeAccess $Principal} #Parallel} #sequence#Получаем результаты.Sequence {Parallel {
  15. 15. Write-Verbose -Message "Getting the new share"Get-SmbShare -Name $nameWrite-Verbose -Message "Getting the new share access"Get-SmbShareAccess -Name $name}}Этот скрипт создает новую сетевую папку, присваивает разрешения пользователю или группе. Ямогу запустить ее из-под Windows 8 или на файловом сервере Windows Server 2012, использовавследующую команду (которая должна быть введена в одну строчку):New -FileShare -Name adeco -Path c:sharesadeco -Principal jdhlabadeco - Right "FullControl" -PSComputerName SRV2K12RCПроцесс займет пару секунд. Результаты на скриншоте ниже.Нет ничего плохого в том, чтобы использовать обыкновенный графический интерфейс для тогоже самого. Однако если Вам нужны специализированные отчеты или же вы желаетеавтоматизировать этот процесс, PowerShell подойдет как нельзя лучше.

×