Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/powershell/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何使用C获取碎片整理分析#_C#_Powershell_Wmi_Wql_Defragmentation - Fatal编程技术网

C# 如何使用C获取碎片整理分析#

C# 如何使用C获取碎片整理分析#,c#,powershell,wmi,wql,defragmentation,C#,Powershell,Wmi,Wql,Defragmentation,我目前正在用C#(.NET4.0)开发一个应用程序,作为其功能的一部分,它应该能够确定特定卷上的碎片百分比。所有其他功能都已经过测试,运行良好,但我在访问这些数据时遇到了障碍。理想情况下,我更喜欢使用WMI,因为它与我用于其他功能的格式相匹配,但在这一点上,我愿意使用可以有效集成到应用程序中的任何东西,即使我必须使用正则表达式来过滤数据。我目前正在Windows7 Professional(x64)计算机上进行开发。我已经使用管理员权限测试了下面的Powershell代码段,它工作得非常完美 $

我目前正在用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#开始,您需要遵循以下工作流程:

  • 实例化PowerShell运行空间
  • 打开
    运行空间
  • 将脚本添加到
    命令
    属性
  • 调用命令列表
  • 下面是一个如何实现这一点的示例,并处理结果对象输出

    对于Windows XP和Windows Vista,您必须确保PowerShell安装在要在其上运行程序的每个系统上。这不是一个不好的先决条件,但作为一个依赖项需要记住一些东西


    希望这有帮助

    尝试在“项目属性”的“构建”选项卡上以“任何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 }
        }
    };