2012-08-08 7 views
1

WMI를 사용하여 C : 드라이브 조각 모음을 수행하려고합니다.C#에서 WMI 조각 모음 메서드를 찾을 수 없습니다.

저는 Windows 7 Pro x64를 사용하고 있습니다.

Console.WriteLine(SMARTManager.Instance.SMARTHDD.Defrag("C:", ref ERR)); 

기능 :

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; 
} 

나는 WMI 코드 작성자에서이 코드를 가지고 있지만 그것을 실행할 때 그것은 "찾을 수 없음"말하는 exeption를 반환합니다.

다른 사람이 사용해 보았습니까? 당신이 ManagementObject 생성자에 잘못된 개체 경로를 전달하기 때문에이 오류가 발생

+0

당신은 어떤 OS를에 실행중인 Name 속성을 사용하여이 샘플 코드? WMI 공급자는 Windows 버전마다 다릅니다. – Dai

+0

Windows 7 Pro x64 –

답변

3

는의 DeviceID는 유효한의 DeviceID를 통과하거나 Win32_VolumeName 속성을 사용하는 코드를 수정해야합니다 그래서 당신의 문제를 해결하기 위해, \\?\Volume{3a7a882b-8713-11e0-bfc8-806e6f6e6963}\처럼 보인다 수업.

검사 대신

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(); 
     } 

} 
+0

다른 사람들의 코드를 소화하는 것을 좋아합니다. 정말 고마워요! –

+0

반환 오류가 발생합니다. 11 알 수없는 오류가 발생했습니다. 왜 그런지에 대한 어떤 생각? 나는 대답을 찾으면 게시 할 것이다. –

관련 문제