C# 如何使用C获取碎片整理分析#
我目前正在用C#(.NET4.0)开发一个应用程序,作为其功能的一部分,它应该能够确定特定卷上的碎片百分比。所有其他功能都已经过测试,运行良好,但我在访问这些数据时遇到了障碍。理想情况下,我更喜欢使用WMI,因为它与我用于其他功能的格式相匹配,但在这一点上,我愿意使用可以有效集成到应用程序中的任何东西,即使我必须使用正则表达式来过滤数据。我目前正在Windows7 Professional(x64)计算机上进行开发。我已经使用管理员权限测试了下面的Powershell代码段,它工作得非常完美C# 如何使用C获取碎片整理分析#,c#,powershell,wmi,wql,defragmentation,C#,Powershell,Wmi,Wql,Defragmentation,我目前正在用C#(.NET4.0)开发一个应用程序,作为其功能的一部分,它应该能够确定特定卷上的碎片百分比。所有其他功能都已经过测试,运行良好,但我在访问这些数据时遇到了障碍。理想情况下,我更喜欢使用WMI,因为它与我用于其他功能的格式相匹配,但在这一点上,我愿意使用可以有效集成到应用程序中的任何东西,即使我必须使用正则表达式来过滤数据。我目前正在Windows7 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)
我甚至在app.manifest中添加了以下行,但仍然没有添加任何内容
<requestedExecutionLevel level="requireAdministrator" uiAccess="false" />
有人能告诉我我忽略了什么吗?失败对我来说不是一个选项,所以如果不能用C语言完成,我不介意用另一种语言创建一个DLL(即使我必须学习),这将给我我需要的结果。理想情况下,应用程序应该能够在XP以上的任何操作系统上工作,并且必须对用户完全透明
这些是我已经使用过的资源。我也想在msdn上添加jeffrey_wall博客,但作为一个新用户,我一次只能添加2个超链接。再次感谢
您可以简单地调用您在帖子中提到的PowerShell命令,因为您说过PowerShell代码是有效的。从C#开始,您需要遵循以下工作流程:
打开
运行空间命令
属性希望这有帮助 尝试在“项目属性”的“构建”选项卡上以“任何CPU”为目标构建应用程序。我怀疑您使用的目标是x86。如果我这样做,我会在我的Win7 x64机器上得到相同的错误代码 事实上,在x86版本的PowerShell中运行PowerShell代码段也会得到一组空结果 如果您在没有完全管理员权限的情况下运行任何一段代码(如您所发现的),则会出现相同的错误,因此也请确保您的app.manifest是正确的。UAC提示是一个方便的提示,它正在生效
恐怕不知道为什么此WMI查询不喜欢在WoW64下运行,但希望这能给您一个良好的开端。Win32\u卷的32位WMI提供程序似乎出于任何原因无法启动defragsvc。通过更改代码以添加其他WMI连接选项,您甚至可以在WOW64下运行的32位客户端中强制64位WMI提供程序:
ConnectionOptions mgmtConnOptions = new ConnectionOptions {
EnablePrivileges = true,
Context = new ManagementNamedValueCollection() {
{ "__ProviderArchitecture", 64 }
}
};
这很有趣——我测试了一下,也得到了同样的结果。好建议。事实上,我认为将架构设置为“任意CPU”是解决方案。干得好。非常感谢您这么快的回复。这正是问题的解决办法。谁会想到呢。再次感谢。谢谢Trevor,尽管Dogmang的解决方案对我有效,但您的建议似乎是解决我在ManagementObjectCollection中遇到的其他问题的一个很好的方法。注意到了。老实说,我一般不会推荐它。对于在WMI中执行的大多数(如果不是全部)工作,请坚持使用System.Management命名空间和C#代码。我曾广泛使用WMI,在编写C#代码时,我非常喜欢.NET基类库中的API。另一方面,如果您主要在PowerShell中编写,请继续使用PowerShell结构。:)干杯
ConnectionOptions mgmtConnOptions = new ConnectionOptions {
EnablePrivileges = true,
Context = new ManagementNamedValueCollection() {
{ "__ProviderArchitecture", 64 }
}
};