Отримуємо звіти з мережних папок за допомогою PowerShell, SavePearlHarbor

Ще одна копія хабора

Отримуємо звіти з мережних папок за допомогою PowerShell

  • Як вивести список всіх папок мережі на комп'ютері (комп'ютерах)
  • Створюємо звіти про розмір мережевих папок
  • Визначаємо власників файлів
  • Знаходимо дату створення файлів виявляємо «старі» файли та файли, створені за певний проміжок часу)

Отримуємо всі мережеві папки

Почнемо з того, що визначимо, що розшарено. Завдання просте: просто здійснюємо запит класу Win32_Share, щоб використовувати Windows Management Instrumentation (WMI). Вам навіть не потрібно логінуватись на файловому сервері. Ви можете запустити цю команду будь-де.

Замість chi-fp01 вкажемо ім'я комп'ютера, що цікавить нас.

Запустивши цю команду Ви отримаєте всі папки мережі, включаючи принтери (якщо такі є). Але оскільки ми говоримо про файлові кулі, то обмежимо запит. Усі екземпляри Win32_Share мають властивість Type, як показано в таблиці 1.

мережних

Додамо фільтр до початкової команди:

Тим самим ми виводимо лише необхідну інформацію.

отримуємо

Але якщо ви шукайте також і приховані папки - ті, які закінчуються знаком долара ($) - фільтр доведеться трохи переписати:

У WMI знак відсотка (%) використовується замість символу підстановки (wildcard). Вивести всі папки, крім тих, що приховані трохи складніше.

Команда виведена усі об'єктиWin32_Share, у яких властивістьTypeдорівнює 0 і ім'я не закінчується на $.

Отримуємо розмір мережевої папки

Досить часто потрібна інформація про те, скільки місця займають файлові кулі. ВикористовуємоGet-ChildItem, або його скороченняdir, і передамо результати вMeasure-Object:

У результаті ви отримаєте інформацію про загальну кількість об'єктів, розмір в байтах, найменші та найбільші розміри файлів. У попередній команді застосував фільтр. У PowerShell 3.0 те саме можна зробити простіше, проте та команда, яку я використовував, працює як v2.0, так і 3.0. Її найкраще запускати локально. Код у прикладі 1 комбінує цю команду з нашою технікою WMI для отримання звіту про розмір високорівневих папок.

Приклад 1: Звіт про розміри високорівневих папок мережі

Ви можете форматувати або обробляти$resultsяк у вашій душі буде завгодно. Потрібна зручна таблиця? Просто використовуйте наступну команду:

звіти

Тим самим можна зробити повний звіт щодо використання всіх папок на файловому сервері не складає труднощів. Заощаджуйте час, скористаєтеся прикладом 2.

Приклад 2: Звіт про використання файлової кулі

І знову я трохи відформатую таблицю.

отримуємо

Отримуємо файли за власником

Рухаємось далі – знайдемо власників файлів. Якщо ви використовуєте квоти, звіти вже, напевно, отримуєте. В іншому випадку, все, що вам потрібно – це отримати ACL файл, який включає в себе власника, і агрегувати результати. Найкраще додати власника файлу як кастомну властивість

Ми можемо групувати за властивістю нового власника, а потім обробляти новий об'єкт.

Пара зусиль і можна застосувати той самий підхід до файлової кулі, як зазначено в коді прикладу 3.

Приклад 3: Групуємо файлові кулі за власником

Я також повинен вказати на те, що можуть бути проблеми: з файлами, ім'я яких більше 260 символів або містить незвичайні символи, особливо якщо ви намагаєтеся запустити Get-ACL. У PowerShell 3.0 цей командлет має параметр-LiteralPath, що допомагає вирішити вищезгадані проблеми.

Знову виведемо таблицю, що читається.

звіти

Отримуємо файли за датою створення

Остання техніка створення звітів, яку хочу продемонструвати – це створення звіту з останніми створеними файлами. Фактично ми створюємо колекцію об'єктів, яку можемо використовувати кількома способами. Можливо, ви захочете використати об'єкти або видалити або перемістити файли, або можете захочете побудувати звіт, який можна надіслати керівництву. Завжди створюйте команди PowerShell так, щоб потім їх можна використовувати. Визначити вік файл не так просто. У PowerShell файловий об'єкт (об'єкт типу файл) має кілька властивостей, які ви, можливо, захочете використовувати. Наприклад, команда:

дає висновок, представлений на скріншоті нижче.

отримуємо

Особисто я вважаю, краще використовуватиLastWriteTime, який позначає, коли до файлу востаннє зверталися. Мені зустрічалися ситуації, колиLastAccessTimeоновлювався через сторонні програми, наприклад, антивірус, що саме собою вже не означає правди. ІLastAccessTimeбув деактивований ще з часу Windows Vista, хоча ви можете його увімкнути. Вам також потрібно бути обережним, тому що ці значення можуть змінюватися в залежності від того, чи ви копіюєте або переміщаєте файли між дисками (between volumes). Але ви можете це вирішити самі. Використовуючи цей файл як приклад, ми може змусити PowerShell сказати нам, наскільки старий файл. Див. Приклад 4.

Приклад 4. Визначаємо вік файлів

ВластивістьAgeє об'єктомTimeSpan, і властивістьDaysє просто властивістюTotalDaysцього об'єкта. Але так як ми можемо це зробити для одногофайл, ми можемо зробити і для інших Давайте поглянемо на мою спільну папку і знайдемо всі файли, які не змінювалися за останні 400 днів.

Я піду далі і увімкну ще й власника файлу. На скріншоті нижче показані результати від запуску цього коду у віддаленій сесії на моєму файловому сервері.

мережних

Я можу зберегти ці результати у змінну та використовувати їх у будь-який час. Так як у мене є повне ім'я файлу, передати в іншу команду, наприклад, Remove-Item, не важко. Однією з моїх улюблених технік є визначення того, скільки файлів було змінено протягом року.

Як ви можете бачити на скріншоті, все виглядає зачесано. Потрібні деталі? Можна проаналізувати властивістьGroup, яка є колекцією файлів.

звіти

Корисно знати, скільки файлів не змінювалося за 30, 90 чи 180 днів. На жаль, простого способу використовуватиGroup-Objectдля цього не існує, тому мені необхідно доведеться піти іншим шляхом; дивіться приклад 5.

Приклад 5: Визначаємо період зміни файлів

Нижче наведено результат, коли я запустив цей код для папки з моїми скриптами, яка, як я знаю, має щільний розподіл за віком (decent age distribution). Мій код не включає актуальні файли, але це було б занадто складно змінити мій приклад.

мережних

За основу посту використано першу частину статті File Server Management with Windows PowerShell.

До речі, про те, як знайти файли за допомогою PowerShell та WMI Джеффрі Хікс пише у своєму блозі (частина 1 та 2).