Viewing open files on a file server from powershell.
So this is a situation you should all be aware of in an SBC / VDI environment, despite all warnings, you’ve redirected folders to your network drive and your file servers are screaming in agony?
Having been in this situation recently, I needed to audit and report on the types of files open on the file server, my hunch was a certain select number of users were running applications (like *gulp* lotus notes) from the network share.
Disappointed with the powershell scripts on the interwebs, I decided to write my own function to perform this task:
function get-openfiles{ param( $computername=@($env:computername), $verbose=$false) $collection = @() foreach ($computer in $computername){ $netfile = [ADSI]"WinNT://$computer/LanmanServer" $netfile.Invoke("Resources") | foreach { try{ $collection += New-Object PsObject -Property @{ Id = $_.GetType().InvokeMember("Name", 'GetProperty', $null, $_, $null) itemPath = $_.GetType().InvokeMember("Path", 'GetProperty', $null, $_, $null) UserName = $_.GetType().InvokeMember("User", 'GetProperty', $null, $_, $null) LockCount = $_.GetType().InvokeMember("LockCount", 'GetProperty', $null, $_, $null) Server = $computer } } catch{ if ($verbose){write-warning $error[0]} } } } Return $collection }
The function above (get-openfiles) has been written to accept an array of servers to the command line and it will return the following items:
- The ID of the open file.
- The server it’s open from.
- The username who has the file open.
- The amount of locks the file has.
A couple of quick examples for using this command are below:
Retrieving open files from server1:
get-openfiles -computername server1 | select server,itempath,lockcount
Retrieve a count of open files that end with the nsf file type (Lotus Notes):
(get-open files -computername server1,server2 | ? {$_.itempath -like "*.nsf*"}).count()
Retrieve a report of total open files on a number of file servers:
get-openfiles -computername server1,server2,server3,server4,server5 | group -property server
Hello Andrew,
This is an excellent post, I did not realize you could get information on processes via the [ADSI] type adapter. I knew you could access Local User and Group information for example but not seen it used for processes, I normally use WMI for processes and services etc, but [ADSI] appears to work faster especially when getting related information like members of a local group as the GetRelated() method of WMI can be slow. Do you know what else you can access on a local or remote computer user the [ASDI] type adapter? Documentation can be hard to find especially when it comes to the correct syntax to use for its various methods
Thanks
Ernie
I would also like to add you to my LinkedIN contacts please?
Thanks Ernest.
I’m not an expert in adsi by any stretch, actually I’m the furthest thing from one 🙂
Feel free to add me on LinkedIn. There’s a link above.
A