I had a great question in follow up to the "Secure, Simplified Web Publishing using Microsoft Internet Information Services 7.0" webcast that I delivered the other day, "How you can you programmatically access the quota usage information from the File Server Resource Manager (FSRM)?"
First of all, there is a native API for writing code to access FSRM data detailed at the following URL:
That's a bit of overkill if you're just looking to script something.
There is a WMI interface as well, but it’s only for FSRM events.
So that leaves you with a pair of command-line tools that you can script in order to list your quota usage information:
- storrept.exe - Used to manage storage reports
- dirquota.exe - Used to manage quota usage
Right out of the box the first command-line tool, storrept.exe, can generate a detailed XML report using a user-definable scope. To see this in action, take the following example syntax and modify the scope parameter to your desired paths:
storrept.exe reports generate /Report:QuotaUsage /Format:XML /Scope:"C:\"
You can also specify multiple paths in your scope using a pipe-delimited format like:
When the command has finished, it will tell you the path to your report like the following example:
Storage reports generated successfully in "C:\StorageReports\Interactive".
The XML-based information in the report can then be consumed with whatever method you usually use to parse XML. It should be noted that storrept.exe also supports the following formats: CSV, DHTML, HTML, and TXT.
This XML might be okay for most applications, but for some reason I wanted to customize the information that I received, so I experimented with the second command-line tool, dirquota.exe, to get the result that I was looking for.
First of all, using dirquota.exe quota list returns information in the following format:
Quotas on machine SERVER: Quota Path: C:\inetpub\ftproot Source Template: 100 MB Limit (Matches template) Quota Status: Enabled Limit: 100.00 MB (Hard) Used: 1.00 KB (0%) Available: 100.00 MB Peak Usage: 1.00 KB (10/25/2007 2:15 PM) Thresholds: Warning ( 85%): E-mail Warning ( 95%): E-mail, Event Log Limit (100%): E-mail, Event Log
This information is formatted nicely and is therefore easily parsed, so I wrote the following batch file called "dirquota.cmd" to start things off:
@echo off echo Processing the report... dirquota.exe quota list > dirquota.txt cscript.exe //nologo dirquota.vbs
Next, I wrote the following vbscript application called "dirquota.vbs" to parse the output into some easily-usable XML code:
Option Explicit Dim objFSO, objFile1, objFile2 Dim strLine, strArray(2) Dim blnQuota,blnThreshold ' create objects Set objFSO = WScript.CreateObject("Scripting.FileSystemObject") Set objFile1 = objFSO.OpenTextFile("dirquota.txt") Set objFile2 = objFSO.CreateTextFile("dirquota.xml") ' start the XML output file objFile2.WriteLine "<?xml version=""1.0""?>" objFile2.WriteLine "<Quotas>" ' set the runtime statuses to off blnQuota = False blnThreshold = False ' loop through the text file Do While Not objFile1.AtEndOfStream ' get a line from the file strLine = objFile1.ReadLine ' only process lines with a colon character If InStr(strLine,":") Then ' split the string manually at the colon character strArray(1) = Trim(Left(strLine,InStr(strLine,":")-1)) strArray(2) = Trim(Mid(strLine,InStr(strLine,":")+1)) ' filter on strings with parentheses strLine = strArray(1) If InStr(strLine,"(") Then strLine = Trim(Left(strLine,InStr(strLine,"(")-1)) & "*" End If ' process the inidivdual entries Select Case UCase(strLine) ' a quota path signifies a new record Case UCase("Quota Path") ' close any open threshold collections If blnThreshold = True Then objFile2.WriteLine "</Thresholds>" End If ' close an open quota element If blnQuota= True Then objFile2.WriteLine "</Quota>" End If ' signify a new quota element objFile2.WriteLine "<Quota>" ' output the relelvant information objFile2.WriteLine FormatElement(strArray(1),strArray(2)) ' set the runtime statuses blnQuota= True blnThreshold = False ' these bits of informaiton are parts of a quota Case UCase("Source Template"), UCase("Quota Status"), _ UCase("Limit"), UCase("Used"), _ UCase("Available"), UCase("Peak Usage") ' close any open threshold collections If blnThreshold = True Then objFile2.WriteLine "</Thresholds>" End If ' set the runtime status blnThreshold = False ' output the relelvant information objFile2.WriteLine FormatElement(strArray(1),strArray(2)) ' these bits of informaiton are thresholds Case UCase("Warning*"), UCase("Limit*") ' open a threshold collection if not already open If blnThreshold = False Then objFile2.WriteLine "<Thresholds>" End If ' output the relelvant information objFile2.WriteLine FormatElement( _ Left(strLine,Len(strLine)-1), _ Replace(Mid(strArray(1), _ Len(strLine))," ","") & " " & strArray(2)) ' set the runtime status blnThreshold = True End Select End If Loop ' close any open threshold collections If blnThreshold = True Then objFile2.WriteLine "</Thresholds>" End If ' close an open quota element If blnQuota= True Then objFile2.WriteLine "</Quota>" End If ' end the XML output file objFile2.WriteLine "</Quotas>" objFile1.Close objFile2.Close Set objFSO = Nothing ' format data into an XML element Function FormatElement(tmpName,tmpValue) FormatElement = "<" & Replace(tmpName," ","") & _ ">" & tmpValue & "</" & Replace(tmpName,Chr(32),"") & ">" End Function
When the batch file and vbscript are run, they will create a file named "dirquota.xml" which will resemble the following example XML:
<?xml version="1.0"?> <Quotas> <Quota> <QuotaPath>C:\inetpub\ftproot</QuotaPath> <SourceTemplate>100 MB Limit (Matches template)</SourceTemplate> <QuotaStatus>Enabled</QuotaStatus> <Limit>100.00 MB (Hard)</Limit> <Used>1.00 KB (0%)</Used> <Available>100.00 MB</Available> <PeakUsage>1.00 KB (10/25/2007 2:15 PM)</PeakUsage> <Thresholds> <Warning>(85%) E-mail</Warning> <Warning>(95%) E-mail, Event Log</Warning> <Limit>(100%) E-mail, Event Log</Limit> </Thresholds> </Quota> </Quotas>
I found the above XML much easier to use than the XML that came from the storrept.exe report, but I'm probably comparing apples to oranges. In any event, I hope this helps someone with questions about FSRM reporting.