我目前正在使用 C# (.NET 4.0) 开发一个应用程序,该应用程序应该具有确定特定卷上碎片百分比的能力作为其功能的一部分。所有其他功能都已经过测试并且工作正常,但我在尝试访问这些数据时遇到了障碍。理想情况下,我更喜欢使用 WMI,因为它与我用于其他功能的格式相匹配,但此时我愿意使用任何可以有效集成到应用程序中的东西,即使我必须使用 RegEx 过滤数据。我目前正在 Windows 7 Professional (x64) 机器上进行开发。我已经使用管理员权限测试了以下 Powershell 代码段,它可以完美运行。
$drive = Get-WmiObject -Class Win32_Volume -Namespace root\CIMV2 -ComputerName . | Where-Object { $_.DriveLetter -eq 'D:' }
$drive.DefragAnalysis().DefragAnalysis
这是我在 C# 中用来完成同样事情的方法,但 InvokeMethod 不断返回 11 (0xB)。
public static Fragmentation GetVolumeFragmentationAnalysis(string drive)
{
//Fragmenation object initialization removed for simplicity
try
{
ConnectionOptions mgmtConnOptions = new ConnectionOptions { EnablePrivileges = true };
ManagementScope scope = new ManagementScope(new ManagementPath(string.Format(@"\\{0}\root\CIMV2", Environment.MachineName)), mgmtConnOptions);
ObjectQuery query = new ObjectQuery(string.Format(@"SELECT * FROM Win32_Volume WHERE Name = '{0}\\'", drive));
scope.Connect();
using (ManagementObjectSearcher searcher = new ManagementObjectSearcher(scope, query))
{
object[] outputArgs = new object[2];
foreach (ManagementObject moVolume in searcher.Get())
{
// Execution stops at this line as the result is always 11
UInt32 result = (UInt32)moVolume.InvokeMethod("DefragAnalysis", outputArgs);
if (result == 0)
{
Console.WriteLine("Defrag Needed: = {0}\n", outputArgs[0]);
ManagementBaseObject mboDefragAnalysis = outputArgs[1] as ManagementBaseObject;
if (null != mboDefragAnalysis)
{
Console.WriteLine(mboDefragAnalysis["TotalPercentFragmentation"].ToString());
}
}
else
{
Console.WriteLine("Return Code: = {0}", result);
}
}
}
}
catch (Exception ex)
{
Console.WriteLine("Could not acquire fragmentation data.\n" + ex);
}
return result;
}
我什至在 app.manifest 中添加了以下行,但仍然没有。
<requestedExecutionLevel level="requireAdministrator" uiAccess="false" />
有人可以告诉我我忽略了什么吗?失败不是我的选择,所以如果不能使用 C# 完成,我不介意用另一种语言创建 DLL(即使我必须学习它),这会给我我需要的结果。理想情况下,应用程序应该能够在 XP 以上的任何操作系统上运行,并且必须对用户完全透明。
这些是我已经使用的资源。我也想在 msdn 上添加 jeffrey_wall 博客,但作为新用户,我一次只能添加 2 个超链接。再次感谢。
http://www.codeproject.com/Messages/2901324/Re-the-result-of-DefragAnalysis-method-in-csharp.aspx