So trennen Sie Benutzer, die mit PowerShell auf einen freigegebenen Windows-Ordner zugreifen

7

Die Frage " Benutzer ermitteln, die mit PowerShell auf einen freigegebenen Ordner zugreifen" hat eine gute Antwort. Fahren Sie fort. Wie trennen Sie die Benutzer, die mit einem Powershell-Skript auf die Freigabe zugreifen?

Es gibt ein Windows-Befehlszeilenprogramm namens OpenFiles, aber ich würde eine PowerShell / WMI-Lösung bevorzugen.

Martin Hollingsworth
quelle
alle Benutzer von der Freigabe oder einfach einen Benutzer löschen?
Tony Roth
Warum die Abneigung gegen die Verwendung eines eingebauten Windows-Befehls? Entweder OpenFiles oder net filesscheinen ohne großen Aufwand Ihren Bedürfnissen zu entsprechen.
MattB
1
Ich habe in der Zwischenzeit OpenFiles verwendet, aber da ich auswählen möchte, welche Verbindungen ich trenne, verwende ich am Ende Select-String, um zu versuchen, die Ausgabe von openfiles / query / v zu analysieren. Ich denke, meine zwielichtigen Skriptfähigkeiten machen dies ein bisschen fragil und es wäre einfacher für mich, wenn ich in der Lage wäre, die Verbindungen als Objekte zu behandeln, anstatt die Zeichenfolge zu übergeben.
Martin Hollingsworth

Antworten:

5

Bis ich eine WMI-Lösung (z. B. basierend auf Win32_ServerConnection) oder eine .NET-Objektlösung finde, mit der ich die Liste der Verbindungen als erstklassige Objekte behandeln kann, anstatt die Textausgabe zu analysieren, habe ich diese Lösung basierend auf den OpenFiles entwickelt Nützlichkeit. Ich bin ziemlich besorgt, dass es fragil und nicht so offensichtlich ist, für unterschiedliche Bedürfnisse zu modifizieren, aber es scheint im Moment für mein enges Szenario zu funktionieren. Ich habe den regulären Ausdruck mit benannten Erfassungen für die anderen Teile der Ausgabe als Referenz beibehalten, wenn Sie für OpenFiles / Disconnect (/ A / ID / OP) andere Parameter verwenden müssen.

Beachten Sie, dass die wiederholte Verwendung von Select-String etwas ist, das ich nicht vollständig verstehe, aber damit zu tun hat, dass dies erforderlich ist, um Zugriff auf die genannten Captures zu erhalten. Weitere Informationen finden Sie in dieser RegEx Named Groups mit Select-String- Veröffentlichung. Gerne ändern, wenn mir jemand sagen kann wie!

$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 `"$_`"}
Martin Hollingsworth
quelle
2
Sie sollten diese Antwort als "akzeptiert" markieren. Es ist akzeptabel, sogar ermutigt, Ihre eigenen Fragen zu beantworten.
Jscott
0

Openfiles funktioniert gut für mich. Obwohl Sie nicht alle offenen Dateien / Abfragen speichern und dann einzeln trennen müssen, da der Platzhalter "*" verwendet werden kann, um alle offenen Sitzungen zu trennen, können Sie Folgendes tun:

openfiles /Disconnect /ID *

Dadurch werden alle offenen Verbindungen beendet

Chazmus
quelle