web-dev-qa-db-ja.com

PowerShellを使用してWindows共有フォルダーにアクセスするユーザーを切断する方法

PowerShellを使用して共有フォルダーにアクセスするユーザーを決定する 質問には良い答えがあります。それから続けて、PowerShellスクリプトを使用して共有にアクセスしているユーザーをどのように切断しますか。

OpenFiles というWindowsコマンドラインユーティリティがありますが、PowerShell/WMIソリューションをお勧めします。

テキスト出力を解析するのではなく、接続のリストをファーストクラスのオブジェクトとして処理できるWMI(Win32_ServerConnectionなどに基づく)または.NETオブジェクトソリューションが見つかるまで、-に基づいてこのソリューションを考え出しました。 OpenFiles ユーティリティ。私はそれが壊れやすく、さまざまなニーズに合わせて変更することはそれほど明白ではないことをかなり心配していますが、現時点では私の狭いシナリオでは機能しているようです。オープンファイル/ disconnect(/ A/ID/OP)に異なるパラメーターを使用する必要がある場合の参照として、出力の他の部分の名前付きキャプチャーを使用して正規表現を保持しました。

Select-Stringを繰り返し使用することは完全には理解していませんが、これは名前付きキャプチャにアクセスするために必要であるという事実に関係していることに注意してください。詳細については、この 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の保存をすべて実行してから、それらを1つずつ切断する必要はありませんが、次のように実行できます。

openfiles /Disconnect /ID *

開いているすべての接続を終了します

0
Chazmus