В Определение пользователей, получающих доступ к общей папке с помощью PowerShell вопрос имеет хороший ответ. Продолжая с этого, как отключить пользователей, имеющих доступ к общему ресурсу, с помощью сценария PowerShell.
Существует утилита командной строки Windows под названием OpenFiles но я бы предпочел решение PowerShell / WMI.
Пока я не найду WMI (например, основанный на чем-то вроде Win32_ServerConnection) или объектное решение .NET, которое позволяет мне обрабатывать список подключений как объекты первого класса, а не анализировать текстовый вывод, я придумал это решение, основанное на OpenFiles утилита. Меня беспокоит то, что это хрупко и не так очевидно, что его можно модифицировать для разных нужд, но, похоже, на данный момент он работает для моего узкого сценария. Я сохранил регулярное выражение с именованными захватами для других частей вывода в качестве справки, если вам нужно использовать другие параметры для openfiles / disconnect (/ A / ID / OP).
Обратите внимание, что повторное использование Select-String - это то, что я не совсем понимаю, но связано с тем, что это необходимо для получения доступа к именованным захватам. Посмотри это Именованные группы RegEx со строкой выбора размещение подробностей. Рад поменять его, если кто-нибудь подскажет как!
$computerName = 'ServerName'
$pattern = '^.+ (?<FileId>\d+) (?<User>[^ ]+).+ (?<OpenFile>C:.+\\SpecificFolder\\.*)$'
$openfiles = openfiles /query /s $computerName /v | Select-String -Pattern $pattern | ForEach-Object {[void]($_.Line -match $pattern); $matches['OpenFile']}
$openfiles | Sort-Object -Unique | ForEach-Object { openfiles /disconnect /s $computerName /a * /op `"$_`"}
Openfiles мне подходит. Хотя вам не нужно делать все это сохранение файлов openfiles / query, а затем отключать их один за другим, поскольку для отключения всех открытых сеансов можно использовать подстановочный знак «*», вы можете сделать что-то вроде:
openfiles /Disconnect /ID *
Что завершит все открытые соединения