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:
http://msdn2.microsoft.com/en-us/library/bb625489.aspx
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:
/Scope:"C:\Inetpub|D:\Inetpub"
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.
Have fun!
Note: This blog was originally posted at http://blogs.msdn.com/robert_mcmurray/