ManagementObjectSearcher Get() 方法: "Insufficient memory to continue the execution of the program."


  • 我阅读了这里所有的相关答案,两者都没有帮助
  • 另外请注意:如果我在VS2012调试器中运行该程序,它的工作方式就像一个魅力。但是,如果我在没有调试的情况下运行(ctrl F5)或在VS 2012 ID之外运行.exe,它会引发异常
  • 我关闭了防火墙
  • 我以管理员身份运行exe
  • 我重新启动了WMI服务

相同。。

这是代码。异常是由调用的.Get()方法引发的

注意:调试屏幕是运行调试模式下的而不是,它是运行可执行文件和在连接调试器崩溃后的屏幕。

http://screencast.com/t/nfvrfz2Hq6Q

同样,如果我在调试中运行程序更多,它会像魅力一样运行。

internal static class Program
{
    private static void Main(string[] args)
    {
        var objSearcher = new ManagementObjectSearcher(
            "SELECT * FROM Win32_SoundDevice");
        var objCollection = objSearcher.Get();
        foreach (var obj in objCollection)
        {
            foreach (var property in obj.Properties)
            {
                Debug.WriteLine("{0}:{1}", property.Name, property.Value);
            }
        }
    }
}

是的,我可以复制它,你的问题应该是权限,以管理员身份运行程序,在我的情况下它有效。

这是因为"选项"设置为默认模拟

尝试以下

internal static class WmiQuery
{
    public static ManagementScope getWmiConnection(string ipAddress, string username = "", string password = "", string domain = "")
    {
        //New ConnectionOptions.
        ConnectionOptions options = new ConnectionOptions();
        bool isLocalhost = (ipAddress.ToLower() == "localhost" || ipAddress == "127.0.0.1");
        //ConnectionOptions'Properties invullen.
        options.Impersonation = isLocalhost ? ImpersonationLevel.Default : ImpersonationLevel.Impersonate;
        options.Username = string.Format(@"{0}{1}", domain, username);
        options.Password = password;
        ManagementScope scope = isLocalhost
            ? new ManagementScope("\\" + ipAddress + "\root\cimv2")
            : new ManagementScope("\\" + ipAddress + "\root\cimv2", options);
        return scope;
    }
    public static ManagementObjectCollection SearcherGet(this ManagementScope scope, string query)
    {
        //Query system for Operating System information
        if (!scope.IsConnected) scope.Connect();
        var queryResult = new ManagementObjectSearcher(scope, new ObjectQuery(query)).Get();
        return queryResult;
    }
    public static void DoWork()
    {
        var wmiConn = WmiQuery.getWmiConnection("localhost");
        ManagementObjectCollection results = wmiConn.SearcherGet("SELECT * FROM Win32_SoundDevice");
        foreach (var soundDevice in results)
            foreach (var sdProperty in soundDevice.Properties)
                Console.WriteLine("{0}:{1}", sdProperty.Name, sdProperty.Value);
    }
}

现在只需拨打:

WmiQuery.DoWork();

相关内容

最新更新