Option Explicit
'//on error resume next

Dim objArgs
Dim objVolume, objSet, obj
Dim strQuery, strVolume, strHost, strNamespace

set objArgs = wscript.Arguments

if objArgs.count < 2 then
   wscript.echo "Usage rwprop <host> <volumePath>"
   wscript.quit(1)
end if

strHost = objArgs(0)
strVolume = Replace(objArgs(1), "\", "\\")
strNamespace = "winmgmts://" & strHost & "/root/cimv2"

'// Get the volume
strQuery = "select * from Win32_Volume where Name = '" & strVolume & "'"
set objSet = GetObject(strNamespace).ExecQuery(strQuery)
for each obj in objSet
    set objVolume = obj
	exit for
next

wscript.echo "Volume: " & objVolume.Name

wscript.echo "----------------------------------------------"
wscript.echo "--DriveLetter tests"
wscript.echo "----------------------------------------------"
Call DriveLetter(objVolume)
wscript.echo "----------------------------------------------"
wscript.echo "--Label tests"
wscript.echo "----------------------------------------------"
Call Label(objVolume)
wscript.echo "----------------------------------------------"
wscript.echo "--IndexingEnabled tests"
wscript.echo "----------------------------------------------"
Call IndexingEnabled(objVolume)

sub DriveLetter(ByRef objVolume)
    'on error resume next
    Dim rc
    Dim strOrigDriveLetter

    strOrigDriveLetter = objVolume.DriveLetter
    wscript.echo "DriveLetter= " & objVolume.DriveLetter
   
    if IsNull(objVolume.DriveLetter) then
       call SetVerifyProperty(objVolume, "DriveLetter", "M:")
    else
       call SetVerifyProperty(objVolume, "DriveLetter", Null)
    end if

   call SetVerifyProperty(objVolume, "DriveLetter", "N:")
   
   call SetVerifyProperty(objVolume, "DriveLetter", "P:")
   
   call SetVerifyProperty(objVolume, "DriveLetter", Null)
   
   wscript.echo "EXPECT FAILURE - assigning SuperBogusDriveLetter string"
   call SetVerifyProperty(objVolume, "DriveLetter", "SuperBogusDriveLetter")
   
   wscript.echo "EXPECT FAILURE - assigning -1"
   call SetVerifyProperty(objVolume, "DriveLetter", -1)

   call SetVerifyProperty(objVolume, "DriveLetter", strOrigDriveLetter)
   
end sub

sub Label(ByRef objVolume)
    on error resume next
    Dim rc, strOrigLabel

    strOrigLabel = objVolume.Label
    wscript.echo "Label= " & objVolume.Label
    
    if IsNull(objVolume.Label) then
       call SetVerifyProperty(objVolume, "Label", "superbad")
    else
       call SetVerifyProperty(objVolume, "Label", Null)
    end if
    
   call SetVerifyProperty(objVolume, "Label", "sexmachine")

   call SetVerifyProperty(objVolume, "Label", "getonup")

   call SetVerifyProperty(objVolume, "Label", "")

   call SetVerifyProperty(objVolume, "Label", Null)

   wscript.echo "EXPECT FAILURE - assigning SuperLongBogusLabelString..."   
   call SetVerifyProperty(objVolume, "Label", "SuperLongBogusLabelStringThatShouldBeWayTooLongForSuccess")

   wscript.echo "EXPECT FAILURE - assigning -1"   
   call SetVerifyProperty(objVolume, "Label", -1)
   
   call SetVerifyProperty(objVolume, "Label", strOrigLabel)

end sub

sub IndexingEnabled(ByRef objVolume)
    on error resume next
    Dim rc, fIndex

    fIndex = objVolume.IndexingEnabled
    
    if fIndex = True then
       call SetVerifyProperty(objVolume, "IndexingEnabled", False)
    else
       call SetVerifyProperty(objVolume, "IndexingEnabled", True)
    end if
    
   call SetVerifyProperty(objVolume, "IndexingEnabled", False)

   call SetVerifyProperty(objVolume, "IndexingEnabled", 0)

   call SetVerifyProperty(objVolume, "IndexingEnabled", True)

   call SetVerifyProperty(objVolume, "IndexingEnabled", 1)

   wscript.echo "EXPECT FAILURE - assigning perLongBogusLabelString..."   
   call SetVerifyProperty(objVolume, "IndexingEnabled", "SuperLongBogusLabelStringThatShouldBeWayTooLongForSuccess")

   wscript.echo "EXPECT FAILURE - assigning -102331"   
   call SetVerifyProperty(objVolume, "IndexingEnabled", -102331)

   call SetVerifyProperty(objVolume, "IndexingEnabled", fIndex)
   
end sub

sub SetVerifyProperty(ByRef objInOut, ByRef strProp, ByRef Value)
    on error resume next
    dim objPropSet, objProp, RefreshValue, rc
    set objPropSet = objInOut.Properties_
    set objProp = objPropSet.Item(strProp)
    wscript.echo "setting " & objInOut.Path_.Class & "." & strProp & "="   & Value
    objProp.Value = Value
    objInOut.Put_
    rc = ReportIfErr(Err, "FAILED - " & objInOut.Path_.Class & " put operation")
    set objInOut = RefreshObject(objInOut)
    rc = ReportIfErr(Err, "FAILED - " & objInOut.Path_.Class & " refresh operation")
    set objPropSet = objInOut.Properties_
    set objProp = objPropSet.Item(strProp)
    RefreshValue = objProp.Value
    wscript.echo "refreshed " & objInOut.Path_.Class & "." & strProp & "="   & RefreshValue
end sub

Function MapErrorCode(ByRef strClass, ByRef strMethod, ByRef intCode)
    Dim objClass, objMethod
    Dim values
    set objClass = GetObject(strNamespace).Get(strClass, &h20000)
    set objMethod = objClass.methods_(strMethod)
    values = objMethod.qualifiers_("values")
    if ubound(values) < intCode then
       wscript.echo " FAILED - no error message found for " & intCode & " : " & strClass & "." & strMethod
       MapErrorCode = ""
    else
       MapErrorCode = values(intCode)
    end if
End Function


Function ReportIfErr(ByRef objErr, ByRef strMessage)
  Dim strError
  ReportIfErr = objErr.Number
  if objErr.Number <> 0 then
     strError = strMessage & " : " & Hex(objErr.Number) & " : " & objErr.Description
     wscript.echo (strError)
     objErr.Clear
     Set objLastError = CreateObject("wbemscripting.swbemlasterror")
     wscript.wcho("Provider: " & objLastError.ProviderName)
     wscript.wcho("Operation: " & objLastError.Operation)
     wscript.wcho("Description: " & objLastError.Description)
     wscript.wcho("StatusCode: 0x" & Hex(objLastError.StatusCode))
  end if  
End Function

Function RefreshObject(ByRef objIn)
    on error resume next
    Dim strRelPath, rc
    set RefreshObject = GetObject(strNamespace).Get(objIn.Path_)
    rc = ReportIfErr(Err, "FAILED - " & objIn.Path_.Class & ".Get operation")
End Function