I'm trying to use WMI to defrag my C: Drive.
I'm running Windows 7 Pro x64.
Console.WriteLine(SMARTManager.Instance.SMARTHDD.Defrag("C:", ref ERR));
Function:
public string Defrag(string a_DriveName, ref string ERR)
{
try
{
ManagementObject classInstance =
new ManagementObject("root\\CIMV2",
String.Format("Win32_Volume.DeviceID='{0}'", a_DriveName),
null);
// Obtain in-parameters for the method
ManagementBaseObject inParams =
classInstance.GetMethodParameters("Defrag");
// Add the input parameters.
inParams["Force"] = true;
// Execute the method and obtain the return values.
ManagementBaseObject outParams =
classInstance.InvokeMethod("Defrag", inParams, null);
// List outParams
string callback = "Out parameters:\n" + "ReturnValue: " + outParams["ReturnValue"];
return callback;
}
catch (ManagementException err)
{
ERR = "An error occurred while trying to execute the WMI method: " + err.Message;
}
return null;
}
I got this code from WMI Code Creator but when I run it it returns an exeption saying "Not Found".
Has anyone else tried this?
This error is caused because you are passing a wrong object path to the ManagementObject
constructor, a DeviceID looks like \\?\Volume{3a7a882b-8713-11e0-bfc8-806e6f6e6963}\
, So to fix your issue you must pass a valid DeviceID or modify your code to use the Name
property of the Win32_Volume
class.
check this sample code which uses the Name
property instead
using System;
using System.Collections.Generic;
using System.Management;
using System.Text;
namespace GetWMI_Info
{
class Program
{
public static void Defrag(string a_DriveName)
{
try
{
string ComputerName = "localhost";
ManagementScope Scope;
if (!ComputerName.Equals("localhost", StringComparison.OrdinalIgnoreCase))
{
ConnectionOptions Conn = new ConnectionOptions();
Conn.Username = "";
Conn.Password = "";
Conn.Authority = "ntlmdomain:DOMAIN";
Scope = new ManagementScope(String.Format("\\\\{0}\\root\\CIMV2", ComputerName), Conn);
}
else
Scope = new ManagementScope(String.Format("\\\\{0}\\root\\CIMV2", ComputerName), null);
Scope.Connect();
string WQL = String.Format("SELECT * FROM Win32_Volume Where Name='{0}'", a_DriveName);
ObjectQuery Query = new ObjectQuery(WQL);
ManagementObjectSearcher Searcher = new ManagementObjectSearcher(Scope, Query);
foreach (ManagementObject ClassInstance in Searcher.Get())
{
ManagementBaseObject inParams = ClassInstance.GetMethodParameters("Defrag");
ManagementBaseObject outParams= ClassInstance.InvokeMethod("Defrag", inParams ,null);
Console.WriteLine("{0,-35} {1,-40}","DefragAnalysis",outParams["DefragAnalysis"]);
Console.WriteLine("{0,-35} {1,-40}","ReturnValue",outParams["ReturnValue"]);
}
}
catch (Exception e)
{
Console.WriteLine(String.Format("Exception {0} Trace {1}",e.Message,e.StackTrace));
}
}
static void Main(string[] args)
{
//the drive name must be escaped
Defrag("F:\\\\");
Console.WriteLine("Press Enter to exit");
Console.Read();
}
}