Управління відкритими файлами на файловому сервері Windows

Адміністратори файлових серверів Windows часто стикаються з необхідністю примусового закриття файлів, відкритих користувачами. Таке завдання виникає при одночасної роботи з одним файлом декількох користувачів. Часто при некоректній роботі ПЗ або не закрито належним чином сесії користувачем, файли в мережевій теці виявляються відкритими і заблокованими, і інші користувачі не можуть вносити в нього зміни. У цій статті ми покажемо, як отримати список відкритих файлів на файловому сервері, дізнатися які користувачі їх використовують, і способи скидання цих файлових сесій.

зміст:

  • Вивести список відкритих файлів на файловому сервері Windows
  • Як визначити який користувач відкрив файл
  • Як закрити відкритий файл
  • Як віддалено закрити відкриті файли за допомогою PowerShell

Вивести список відкритих файлів на файловому сервері Windows

Перелік відкритих користувачами файлів на файловому сервері Windows можна отримати за допомогою стандартної графічної консолі Computer Management (Управління комп'ютером - compmgmt.msc).

Запустіть на файловому сервері консоль Computer Management (або підключіться до нього віддалено консоллю зі свого комп'ютера) і перейдіть в секцію System Tools -> Shared Folders -> Open files (Службові програми -> Загальні папки -> Відкрито файли). У правій частині вікна відображається список файлів сервера, відкритих віддалено. Список містить локальний шлях до файлу, ім'я облікового запису користувача, кількість блокувань і режим, в якому відкрито файл (Read або Write + Read).

Цей же список відкритих файлів можна отримає за допомогою вбудованої консольної утиліти Openfiles. Наприклад, за допомогою такої команди можна отримати id сесії, ім'я користувача і повний локальний шлях до відкритого файлу:

Openfiles / Query / fo csv | more

При віддаленому доступі користувача до папки або файлу в мережевій теці (SMB) на сервері, для користувача створюється нова сесія, яка визначає дане підключення. Управління підключеннями користувачів здійснюється саме через ці ідентифікатори сесій.

Цю ж команду можна виконати віддалено, наприклад, потрібен список відкритих файлів на файловому сервері mskfs01:

Openfiles / Query / s mskfs01 / fo csv

У команди Openfiles є ще одна цікава можливість перегляду списку локально відкритих файлів. Для її використання потрібно включити опцію Maintain Objects List (Побудова списку об'єктів) командою openfiles / local on і перезавантажити сервер. Після цього в список почнуть потрапляти файли, відкриті локальними процесами (цей режим бажано використовувати тільки для налагодження, тому що може негативно позначитися на продуктивності сервера).

Як визначити який користувач відкрив файл

Щоб визначити користувача, який відкрив (заблокував) файл cons.adm на сервері, виконайте команду:

Openfiles / Query / s mskfs01 / fo csv | find / i "cons.adm"

ключ / i використовується, щоб виконувався регістронезавісімий пошук

Природно, можна вказати тільки частина імені файлу. Наприклад, нам потрібно дізнатися хто відкрив xlsx файл, в імені якого є рядок farm, скористаємося таким конвеєром:

Openfiles / Query / s mskfs01 / fo csv | find / i "farm" | find / i "xlsx"

Можна, звичайно знайти файл і в графічній консолі Computer Management, але це менш зручно (консоль не передбачає можливість пошуку).

Як закрити відкритий файл

Щоб закрити відкритий файл, потрібно знайти його в списку файлів секції Open File і в контекстному меню вибрати пункт "Close Open File".

Якщо на файловому сервері сотні відкритих файлів, знайти їх в консолі буде непросто. Зручніше скористатися утилітою Openfiles. Як ми вже говорили, вона повертає ID сесії відкритого файлу. Саме з цього ID сесії, файл можна примусово закрити, скинувши підключення. Знаходимо ID потрібного файлу:

Openfiles / Query / s mskfs01 / fo csv | find / i "farm" | find / i ".xlsx"

Відключаємо від нього користувача за отриманим ідентфікатору:

Openfiles / Disconnect / s mskfs01 / ID 67109098

Як віддалено закрити відкриті файли за допомогою PowerShell

У Windows Server 2012 / Windows 8 в PowerShell з'явилися командлети для роботи з кулями і файлами на SMB сервері. Дані командлети можна використовувати для віддаленого скидання підключень до відкритого файлу.

Список відкритих файлів можна отримати за допомогою командлетів Get-SMBOpenFile , а закрити файл (скинути підключення) за допомогою Close-SmbOpenFile.

Отже, підключаємося до віддаленого сервера:

$ Sessn = New-CIMSession -Computername mskfs01

Знаходимо і закриваємо відкритий файл pubs.docx однією командою:

Get-SMBOpenFile -CIMSession $ sessn | where $ _. Path -like "* pubs.docx" | Close-SMBOpenFile -CIMSession $ sessn

Підтверджуємо закриття файлу, натиснувши Y.

Щоб прибрати підтвердження примусового закриття файлу на сервері, використовуйте ключ -Force

Ці ж команди можна використовувати, наприклад, щоб закрити всі файли, відкриті деяким користувачем (користувач пішов додому і не звільнив файли). Наприклад, щоб скинути всі файлові сесії для користувача ipivanov, виконайте

Get-SMBOpenFile -CIMSession $ sessn | where $ _. ClientUserName -like "* ipivanov *" | Close-SMBOpenFile -CIMSession $ sessn