The work I do for AT&T deals extensively with performing data migrations; moving user and group data from one server to another. To make the data transition easier for the active share users I send emails to them indicating when a share is going to move, and what its new location will be?
Q:How do I capture that active user information?
A: I use a WMI query using the class Win32_ServerConnection.
With Powershell you can easily query a remote server to find out what accounts are connected to all shares, or a specific share.
One of the very nice things about Powershell is that you can create a “one-liner” to grab the information quickliy. This would be used as a quick reference. Here is an example of a one liner to find all of the employees connected to server ServerBravo1
Get-WmiObject Win32_ServerConnection -ComputerName ServerBravo1 | select username, sharename, computername | sort sharename | Format-Table -AutoSize
Here is the break down of that command:
Get-WmiObject Win32_ServerConnection: Performs the WMI query using the Get-WMIObject cmdlet.
-ComputerName ServerBravo1: Runs the query on the remote server ServerBravo1. If the -ComputerName property is excluded then the command is run on the local computer.
selectusername, sharename, computername: This determines which properties are returned from the query. I find these to be the most useful properties, but there are a lot more that can be returned.
Here is a list of the properties that could be useful:
Name MemberType
—- ———-
ActiveTime Property
Caption Property
ComputerName Property
ConnectionID Property
Description Property
InstallDate Property
Name Property
NumberOfFiles Property
NumberOfUsers Property
ShareName Property
Status Property
UserName Property
sort sharename: This sorts the results based on the value of the ShareName property.
Format-Table-AutoSize: This formats the output in columns. The -autosize option places the columns in a nice compact presentation. Other output options include format-list, and my personal favorite out-gridview.
The one-liner is nice but you have to type the full text each time. Since I use this command so much, I prefered to make a function where I can type the function name followed by a server name. The required typing is a lot less for each use, and you don’t really need to remember the specific property names.
Here is how that funtion would look:
Function to Find Active Share Users on a Server
function get-ShareUsers
{
<#
.SYNOPSIS
Determine which shares are actively being used by employees.
.DESCRIPTION
This provides a live time view of shares currently being accessed by employees. The output can be to the Powershell screen, the out-gridview window, a CSV file, or all of the above.
.PARAMETER <paramName>
ServerName – Used to determine the server to scan.
GridView – Enables the output to the gridview.
Export – Enables the output to a CSV file using the export-csv cmdlet.
.EXAMPLE
get-ShareUsers S47715C014001
Description
———–
This command scans a server called S47715C014001 for active share users. The result is sent to the Powershell screen.
.EXAMPLE
get-ShareUsers S47715C014001 -Gridview
Description
———–
This command scans a server called S47715C014001 for active share users. The result is sent to the Powershell screen, and to the out-gridview window.
.EXAMPLE
get-ShareUsers S47715C014001 -Gridview -Export
Description
———–
This command scans a server called S47715C014001 for active share users. The result is sent to the Powershell screen, to the out-gridview window, and to a CSV file called S47715C014001 _Share_Users.csv
#>
[CmdletBinding()]
Param
(
#First parameter
[parameter(Mandatory=$true, #Makes this a required parameter. The user will be prompted for this item if it is not provided.
ValueFromPipeline=$true)] #Allows the server name to be “Piped” into the function.
[String[]] $ServerName, #The name against which to run the query.
#Second parameter – Sends the output to the out-gridview display.
[switch] $Gridview,
#Third parameter – Sends the output to a CSV file for later used.
[switch] $Export
)
#Default output to the Powershell interface.
Get-WmiObject Win32_ServerConnection -ComputerName $ServerName | select username, sharename, computername | sort sharename | Format-Table -AutoSize
if ($Gridview -eq $true) #Use this switch if you want to output to the Out-Gridview window.
{
Get-WmiObject Win32_ServerConnection -ComputerName $ServerName | select username, sharename, computername | sort sharename | Out-GridView -Title “$computername Share Users”
}
if ($Export -eq $true) #Use this switch if you want to output to a CSV file.{
[string]$filename = $ServerName+ “_Share_Users.csv”
Get-WmiObject Win32_ServerConnection -ComputerName $ServerName | select username, sharename, computername | sort sharename | Export-Csv -Path $filename -NoTypeInformation
}
}
A few final comments:
- To make this function available all of the time when you are using PowerShell, paste the function into your PowerShell profile document. When you do that it will load each time you start PowerShell.
- Once it is loaded into your PowerShell session, you can find help on this function by typing the following in the PowerShell command line window:
help get-shareusers -Full
This will give examples of how to use the function, and also give detailed information on each of the parameters.
- Finally, to make it easier to use this function, I have uploaded the text of the script here at my Google page:
I hope this is a helpful utility for you.
Please let me know if you have any questions about this, or any of my other posts.
Have a good day.
Patrick