Адміністратори файлових серверів 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
Цю ж команду можна виконати віддалено, наприклад, потрібен список відкритих файлів на файловому сервері mskfs01:
Openfiles / Query / s mskfs01 / fo csv
openfiles / local on
і перезавантажити сервер. Після цього в список почнуть потрапляти файли, відкриті локальними процесами (цей режим бажано використовувати тільки для налагодження, тому що може негативно позначитися на продуктивності сервера).Як визначити який користувач відкрив файл
Щоб визначити користувача, який відкрив (заблокував) файл cons.adm на сервері, виконайте команду:
Openfiles / Query / s mskfs01 / fo csv | find / i "cons.adm"
Природно, можна вказати тільки частина імені файлу. Наприклад, нам потрібно дізнатися хто відкрив 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