Получить список компьютеров которые используют общую папку public передать полученный список в файл

Обновлено: 06.07.2024

Управление файловыми серверами воспринимается как скучное и неблагодарное занятие многими специалистами по ИТ. Но так быть не должно. С помощью Windows Powershell вы научитесь эффективно управлять общими файловыми ресурсами и, может быть, даже найдете в этом интерес

. Причем это не потребует написания сценариев. Все, что я собираюсь показать, потребует всего несколько интерактивных команд. Конечно, если вам придется запускать эти команды часто, сохранить их в виде сценария или функции будет логично.

Особенность Powershell заключается в том, что вы можете взять результаты команд, которые я собираюсь показать, и сделать с ними все, что захотите. Необходимо сохранить результат в файл. csv? Используйте Export-CSV. Нужен отчет в формате HTML? Вам поможет ConvertTo-HTML. Кроме того, все, что я собираюсь продемонстрировать, масштабируется; если вы можете применить команду для одного компьютера, она может быть использована для 10, 100 или 1000 систем.

Сначала я покажу вам, как управлять тем, что уже находится в общих папках. Затем мы рассмотрим процесс создания и удаления общих папок.

Получение списка общих папок

Давайте начнем с определения того, что находится в общих папках. Просто создайте запрос к классу Win32_Share инструментария управления WMI. Вам даже не нужно регистрироваться на файловом сервере, вы можете запустить эту команду со своего рабочего места:

После выполнения данной команды вы получите список общих ресурсов, включая принтеры (если они есть). Поскольку мы говорим об общих файловых ресурсах, давайте изменим запрос соответствующим образом. Каждый объект Win32_Share имеет свойство «Тип», см. таблицу. Таким образом, чтобы ограничить наш запрос, мы можем добавить фильтр к первоначальной команде.

Типы общих ресурсов и их свойства

Таким образом, мы исключили административные общие ресурсы. Это можно увидеть на экране 1.

Вывод неадминистративных общих ресурсов с?помощью WMI
Экран 1. Вывод неадминистративных общих ресурсов с? помощью WMI

Для получения списка скрытых общих ресурсов – тех, что заканчиваются значком доллара ($), — вам нужно лишь немного изменить фильтр:

В WMI символ % используется как знак подстановки. Поэтому получить список общих ресурсов, за исключением скрытых, немного сложнее, нам потребуется сравнение с использованием подстановочного символа:

Эта команда возвращает все объекты Win32_Share, у которых свойство «Тип» равно 0 и имя не заканчивается на $.

Определение размера папки

В результате вы получите объект, который показывает общее количество элементов, общий объем в байтах, наименьший и наибольший файлы. В предыдущей команде я исключил папки. В Powershell 3.0 предусмотрен лучший способ сделать это, но команда, которую я использовал, работает как в Powershell 2.0, так и в Powershell 3.0. Эта команда относится к тому типу, который лучше запускать локально (хороший повод удаленно использовать Powershell). Код в Листинге 1 задействует эту команду совместно с нашим механизмом WMI для получения отчета о размере папок верхнего уровня. Вы можете форматировать или обрабатывать $results так, как хотите. Как насчет удобной для чтения таблицы? Просто используйте команду:

На экране 2 показан приблизительный результат.

Вывод в виде таблицы
Экран 2. Вывод в виде таблицы

Для создания полного отчета об используемом дисковом пространстве для всех общих файловых ресурсов не потребуется много усилий. Я сэкономлю ваше время: взгляните на листинг 2. Как и в прошлый раз, я могу отформатировать $results так, как хочу. Результат использования этой техники показан на экране 3.

Получение списка файлов по владельцу

Другая вариация на эту тему — поиск файлов по их владельцу. Если вы применяете квоты, то вероятно уже составляете отчеты об их использовании. Если нет, то все, что вам нужно, это получить список управления доступом ACL для файла, который включает владельца, и обработать результаты. Мне кажется, лучший способ — это добавить владельца как настраиваемое свойство:

Мы можем сгруппировать полученный результат по владельцу, а затем обработать полученный объект.

Приложив лишь немного усилий, вы сможете использовать эту же технику и для общих файловых ресурсов, как это делает код, указанный в листинге 3. Также необходимо отметить, что вы можете столкнуться с проблемами, если длина пути к файлу превышает 260 символов или если имена файлов содержат необычные символы, особенно при выполнении команды Get-Acl. В Powershell 3.0 эта команда поддерживает параметр – LiteralPath, который поможет в данном случае.

Нужно признать, что некоторые из приведенных примеров требуют набора довольно большого количества текста, и это не единственный способ выполнения задач, но они демонстрируют, что вы можете сделать. Для разовых отчетов можно обойтись меньшей детализацией. На экране 4 показан пример кода, который представляет результаты в виде таблицы.

Получение файлов по возрасту

Определение возраста файла — нетривиальная задача. В Powershell объект «файл» имеет несколько свойств, которые вы можете использовать. Например:

выводит результат, показанный на экране 5.

Свойства файла
Экран 5. Свойства файла

Лично мне свойство LastWriteTime кажется наиболее подходящим для определения времени, когда предоставлялся доступ к файлу. Мне встречались ситуации, когда свойство LastAccessTime обновлялось сторонним приложением, например антивирусом, что может приводить к ошибочным заключениям. Кроме того, LastAccessTime по умолчанию отключено со времен WindowsVista, но вы можете включить его. Нужно быть осторожным, так как значения этих свойств могут меняться, в зависимости от того, копируете вы или перемещаете файлы с тома на том. Однако окончательное решение остается за вами. Используя данный файл в качестве примера, мы можем с помощью Powershell определить возраст файла, как показано в листинге 4.

Параметр Age — это объект типа TimeSpan, а параметр Days — это просто значение параметра TotalDays данного объекта. Поскольку мы можем выполнить эту процедуру для одного файла, можем и для всех файлов. Давайте взглянем на мой общий ресурс Public и найдем все файлы, которые не изменялись 400 дней.

Я продолжил и включил владельца файла. На экране 6 показан результат выполнения этого кода в удаленной сессии на моем сервере.

Выполнение кода в удаленной сессии
Экран 6. Выполнение кода в удаленной сессии

Я мог сохранить эти результаты в переменную и использовать их повторно по своему усмотрению. Поскольку у меня было полное имя файла, перенаправление переменной в такую команду, как, например, Remove-Item, не составило бы труда.

Еще один подход — создание отчета или коллекции объектов. Для этого потребуется немного больше усилий; после того, как мы посчитаем или определим возраст элемента, потребуется добавить немного логики, чтобы что-нибудь с ним сделать.

Одна из моих любимых техник — это выяснение, сколько файлов было изменено с группировкой по годам (экран 7). И снова для демонстрации я буду использовать интерактивную удаленную сессию на своем файловом сервере.

Поиск времени последнего изменения файлов с?группировкой по годам
Экран 7. Поиск времени последнего изменения файлов с?группировкой по годам

Если мне понадобится больше деталей, то я всегда могу проанализировать параметр Group, который является набором файлов.

Может пригодиться информация о том, сколько файлов не изменялись за последние 30, 90 или 180 дней. К сожалению, нет простого способа использовать для этого Group-Object, поэтому мне пришлось решать задачу «в лоб», как показано в листинге 5. На экране 8 показан результат, который получился в результате обработки этим кодом моей папки со сценариями, в которой, как я знал, располагаются файлы различного «возраста». Мой код не выводит сами файлы, но модифицировать его будет несложно.

Дата последнего изменения файлов
Экран 8. Дата последнего изменения файлов

Создание общих файловых ресурсов

Теперь давайте посмотрим, как можно использовать Powershell для создания общих файловых ресурсов и управления ими. Все, что я продемонстрировал до настоящего момента, будет работать как в Powershell 2.0, так и в Powershell 3.0 (хотя при использовании Powershell 3.0 мои примеры в некоторых местах можно упростить). Управление файловым сервером с помощью Powershell 2.0 требует применения WMI и написания сложных сценариев. Но в Powershell 3.0, особенно если вы используете Windows Server 2012, этот тип управления реализован очень удачно. Я собираюсь переключить передачу и управлять файловым сервером на базе WindowsServer 2012 с компьютера с установленной Windows 8. Таким образом, мне будут доступны некоторые дополнительные функции.

Все, что нам нужно, встроено в модуль SMBShare, который устанавливается в Windows 8 по умолчанию. Команды, входящие в этот модуль, позволяют с легкостью управлять общими файловыми ресурсам как на локальных, так и на удаленных серверах. Я не буду рассматривать каждую команду, но все они имеют схожий формат, и я настоятельно рекомендую прочитать подсказку и просмотреть примеры. Мы начнем с использования команды New-SMBShare, для того чтобы создать новый общий файловый ресурс.

Нам нужно указать путь к папке и, в отличие от того, как это происходит в случае использования графического интерфейса, команда не создает папку, если она не существует. Поэтому мы создадим ее и назначим разрешения NTFS. Это процедура состоит из нескольких шагов. Поскольку их нужно выполнить на удаленном сервере, я создам удаленную сессию Powershell.

Я мог бы использовать эту сессию интерактивно, но я собираюсь запускать команды, используя Invoke-Command, которые более предпочтительны, когда вы настраиваете автоматический процесс. Я создам новую папку:

Теперь более сложная часть. Я хочу назначить разрешения NTFS так, чтобы группа JDHLABDomainUsers имела разрешения на изменения Change. Для этого потребуется создать новое правило доступа, изменить список правил доступа и применить измененный список к папке. Я написал эту команду так, что она использует параметр в качестве пути, что делает возможным ее повторное использование:

Существует возможность ускорить этот процесс, но для ясности я предпочитаю выполнять каждый шаг отдельно. Теперь мы можем создать общую папку.

Я мог бы использовать существующую удаленную сессию, но мне хотелось продемонстрировать, что команду New-SmbShare можно задействовать для подключения к удаленному файловому серверу.

По умолчанию на общий ресурс предоставляются разрешения на чтение ReadOnly. Я предоставил администратором домена полные разрешения FullControl, а всем остальным разрешения на изменения Change. Путь, указанный в параметре path, локальный для удаленного компьютера, на котором должен быть установлен Powershell 3.0

Дополнительные параметры общего ресурса

Мы можем в любое время просмотреть свойства общего ресурса, используя команду Get-SMBShare, как показано на экране 9.

Использование команды Get-SMBShare для?просмотра свойств общей папки
Экран 9. Использование команды Get-SMBShare для? просмотра свойств общей папки

Я применил изменения к одной общей папке, но было бы также просто с помощью Get-SMBShare получить список всех общих папок и затем с помощью Set-SMBShare применить изменение ко всем.

Эта команда получает список всех общих папок (за исключением административных) на сервере SRV2K12RC и устанавливает значение параметра EncryptData, равное True. Мне не хотелось подтверждать каждое изменение, поэтому я установил значение ключа –Confirm равным False. Set-SMBshare ничего не передает дальше по конвейеру, если только не указать параметр –Passthru. Но мне удалось изменить сразу все одной простой командой.

Удаление общих папок

Последнее, что осталось рассмотреть, это удаление общих папок. Код в листинге 8 удаляет общий ресурс, который я только что создал. Может ли быть что-то проще? Конечно, сама папка осталось на сервере нетронутой.

Собираем все вместе

Давайте завершим наш обзор, собрав все части процесса управления в одном месте: рабочем процессе PowerShell Workflow. Я не могу в одной статье описать это огромное дополнение Powershell или приводить примеры кода, но должен сказать, что самое замечательное в Powershell Workflow то, что несколько команд могут выполняться параллельно. Например, после создания папки можно создать общий ресурс и назначить разрешения NTFS, см. листинг 9.

Этот процесс создает новую папку и новый общий ресурс, назначает права пользователю или группе. Я могу запустить его на своем компьютере с Windows 8, чтобы он отработал на удаленном сервере с WindowsServer 2012, следующей командой (ее нужно вводить одной строкой)

Выполнение занимает всего несколько секунд. Результат показан на экране 10.

Создание общей папки с помощью Powershell Workflow
Экран 10. Создание общей папки с помощью Powershell Workflow

Нет ничего плохого в использовании графического интерфейса для управления файловыми серверами. Но если вам нужны специальные отчеты или автоматизация, Powershell — лучшее, что может быть.

Листинг 1. Получение отчета о размере папок верхнего уровня

Листинг 2. Создание отчета об использовании общих ресурсов на файловом сервере

Листинг 3. Группируем вывод по владельцу файла

Листинг 4. Определяем возраст файла

Листинг 5. Определяем время последнего изменения файла

Листинг 6. Создание, изменение и применение правила доступа

Листинг 7. Настройка общего ресурса

Листинг 8. Удаление общего ресурса

Листинг 9. Создание общего ресурса и установка прав NTFS

На моем сервере Windows 2008 у меня есть сетевой ресурс. Я вошел на сервер с полными правами администратора. Я хотел бы знать, какие пользователи имеют активные подключения к этой папке.

Как мне найти эту информацию?

Есть два способа сделать это, если я знаю. Один ненадежен, но, вероятно, достаточно хорош для большинства сценариев. Один из них обширный, но его трудно реализовать в любом масштабе, который превышает несколько пользовательских подключений.

Путь Kinda-Sorta: Выберите Системные инструменты >> Общие папки >> Открыть файлы, чтобы увидеть, какие файлы открыты на файловом сервере. Оттуда вы можете соотнести учетные записи пользователей с открытыми файлами с общими папками, к которым они подключены.

Обширный, но сложный для масштабирования способ. Выполните действия net share [sharename] для каждой рассматриваемой общей папки, чтобы получить список пользователей, которые к ней подключены. В моем тестировании даже пользователи, у которых нет открытого файла, перечислены.

Вы также можете использовать административный инструмент Share and Storage Manager в Server 2008 и более поздних версиях вместо управления компьютером. Найдите общий ресурс в списке общих ресурсов, а затем в области действий щелкните правой кнопкой мыши «Управление сеансами». Вы увидите список сессий, включая те, которые имеют ноль открытых файлов.

Но . но . Я хочу найти конкретного пользователя, не запрашивая каждую акцию! Если у вас есть конкретный пользователь, которого вы хотите отследить, похоже, что единственным способом найти эту информацию является запрос каждого ресурса и просмотр его, чтобы найти нужного пользователя. И глазного яблока я имею в виду выход трубы на findstr или select-string . Можно экстраполировать рабочий процесс на сценарий, который перечисляет все доступные общие ресурсы, запрашивает подключенных пользователей и ищет выходные данные для рассматриваемого пользователя, но это, по-видимому, упражнение для читателя, а не то, что Microsoft включила в качестве нативной функции. ,

Начнем с того, что определим, что же расшарено. Задача проста: просто осуществляем запрос класса 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, что помогает решить вышеуказанные проблемы.

Опять выведем читаемую таблицу.


Получаем файлы по дате создания

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


Лично я считаю, что лучше использовать 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).

date

27.07.2021

directory

Windows 10, Windows Server 2012 R2, Windows Server 2016

comments

комментариев 39

Если вы администрируете общие сетевые папки Windows, скорее всего вы периодически сталкиваетесь с просьбами пользователей принудительно закрыть файлы, открытые (заблокированные) в сетевых папках другими пользователями. Обычно это связано с некорректной работой программы, неправильном завершении сессии пользователя или ситуациях, когда пользователь открыл файл и забыл закрыть его (ушел домой, в отпуск и т.д.). Во всех этих случаях файл в сетевой папке оказывается заблокированным, и другие пользователи не могут вносить в него изменения.

В этой статье мы покажем, как получить список открытых файлов на файловом сервере Windows, узнать какие пользователи их используют, и способы сброса файловых сессий для разблокировки открытых файлов.

Вывод списка открытых файлов в сетевой папке Windows

Список открытых по сети файлов в Windows можно получить с помощью стандартной графической консоли Computer Management (Управление компьютером — compmgmt.msc ).

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

Открыты файлы на файловом сервере Windows

Этот же список открытых файлов можно получит с помощью встроенной консольной утилиты Openfiles. Например, с помощью следующей команды можно получить id сессии, имя пользователя и полный локальный путь к открытому файлу:

Openfiles /Query /fo csv |more

Openfiles /Query

При удаленном доступе пользователя к папке или файлу в сетевой папке (SMB) на сервере, для пользователя создается новая сессия. Вы можете управлять открытыми файлами с помощью идентификаторов этих сессий.

Вы можете вывести список открытых файлов на сервере удаленно. Например, чтобы вывести все открытые по сети файлы на сервере mskfs01, выполните:

Openfiles /Query /s mskfs01 /fo csv

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

Определяем пользователя, который открыл файл в сетевой папке с помощью Openfiles

Чтобы удаленно определить пользователя, который открыл (заблокировал) файл cons.adm в сетевой папке на сервере mskfs01, выполните команду:

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, но это менее удобно (в консоли нет возможности поиска).

Как принудительно закрыть открытый файл в Windows?

Чтобы закрыть открытый файл, нужно найти его в списке файлов секции Open Files и в контекстном меню выбрать пункт “Close Open File”.

Закрыть открытые файлы в сетевой папке

Если на файловом сервере сотни открытых файлов, найти их в консоли будет непросто. Удобнее воспользоваться утилитой Openfiles. Как мы уже говорили, она возвращает ID сессии открытого файла. Вы можете принудительно закрыть файл и сбросить подключение пользователя по ID SMB сессии. Сначала нужно определить ID сессии открытого файла:

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

Теперь можно принудительно отключить пользователя по полученному идентификатору SMB сессии:

Openfiles /Disconnect /s mskfs01 /ID 67109098

Openfiles Disconnect - отключение файла по id сессии


Можно принудительно сбросить все сессии и освободить все файлы, открытые определённым пользователем:
openfiles /disconnect /s mskfs01 /u corp\aivanova /id *

Обратите внимание, что принудительное закрытие файла, открытого клиентом на SMB сервере, вызывает потерю несохраненных данных. Поэтому команду openfiles /disconnect и командлет Close-SMBOpenFile (рассматривается ниже) нужно использовать с осторожностью.

Get-SMBOpenFile: вывод списка открытых по сети файлов в PowerShell

В версии PowerShell в Windows Server 2012/Windows 8 появились командлеты для управления сетевыми файлами и папками на SMB сервере. Эти командлеты можно использовать чтобы удаленно закрыть открытые по сети файлы.

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

Для вывода полного списка открытых файлов на сервере, выполните команду:

Get-SMBOpenFile вывод списка открытых файлов на SMB сервере с помощью powershell

Команда возвращает ID файла, ID сессии и полное имя файла.

Можно вывести список открытых файлов с именами пользователей и компьютеров (IP адресами):

poweshell вывод список пользователей, которые открыли файлы в сетевой папке windows

Можно вывести все файлы, открытые определенным пользователем:

Get-SMBOpenFile –ClientUserName "corp\aaivanov" |select ClientComputerName,Path

или с определенного компьютера (сервера):

Get-SMBOpenFile –ClientComputerName 192.168.12.170| select ClientUserName,Path

Можно вывести список открытых файлов по шаблону. Например, все открытые по сети exe файлы:

или файлы с определенным именем:

Чтобы закрыть файл используется командлет Close-SmbOpenFile . Закрыть файл можно по ID:

Close-SmbOpenFile -FileId 4123426323239

Но обычно удобнее закрыть файл по имени:

Get-SmbOpenFile | where | Close-SmbOpenFile -Force

С помощью Out-GridView можно сделать простую графическую форму для поиска и закрытия файлов. Следующий скрипт выведет список открытых файлов. Администратор должен с помощью фильтров в таблице Out-GridView найти, выделить нужные файлы и нажать ОК. В результате выбранные файлы будут принудительно закрыты.

Get-SmbOpenFile|select ClientUserName,ClientComputerName,Path,SessionID| Out-GridView -PassThru –title “Select Open Files”|Close-SmbOpenFile -Confirm:$false -Verbose

Get-SmbOpenFile вместе с out-gridview - powershell скрипт с графическим интерефейсом по выбору и принудительному закрыттию заблокированных (открытых) файлов в windows

Как удаленно закрыть открытые SMB файлы с помощью PowerShell?

Командлеты Get-SMBOpenFile и Close-SmbOpenFile можно использовать чтобы удаленно найти и закрыть открытые файлы. Сначала нужно подключиться к удаленному SMB серверу Windows через CIM сессию:

$sessn = New-CIMSession –Computername mskfs01

Также вы можете подключаться к удаленному серверам для запуска команд через командлеты PSRemoting: Enter-PSSession или Invoke-Command .

Следующая команда найдет SMB сессию для открытого файла *pubs.docx и завершит ее.

Get-SMBOpenFile -CIMSession $sessn | where | Close-SMBOpenFile -CIMSession $sessn

Подтвердите закрытие файла, нажав Y . В результате вы разблокировали открытый файл. Теперь его могут открыть другие пользователи.

Get-SMBOpenFile - удаленное управление открытых файлов

Чтобы убрать подтверждение закрытия файла на сервере, используйте ключ –Force .

С помощью PowerShell вы можете закрыть и разблокировать на файловом сервере все файлы, открытые определенным пользователем (пользователь ушел домой и не освободил файлы). Например, чтобы сбросить все файловые сессии для пользователя ipivanov, выполните:

Get-SMBOpenFile -CIMSession $sessn | where |Close-SMBOpenFile -CIMSession $sessn

Читайте также: