Viewing open files on a file server from powershell.

https://andymorgan.files.wordpress.com/2011/03/windows_powershell_icon.png?w=58&h=58&h=58So 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:


full

get-openfiles -computername server1 | select server,itempath,lockcount



Retrieve a count of open files that end with the nsf file type (Lotus Notes):


count

(get-open files -computername server1,server2 | ? {$_.itempath -like "*.nsf*"}).count()



Retrieve a report of total open files on a number of file servers:


report

 

get-openfiles -computername server1,server2,server3,server4,server5 | group -property server

 

  1. Ernest Brant
    March 19, 2013 at 9:38 pm

    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?

    • March 22, 2013 at 7:01 pm

      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

  1. No trackbacks yet.

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s

%d bloggers like this: