0
  • 我在这里阅读了所有相关答案都没有帮助。
  • 另请注意:如果我在 VS 2012 调试器中运行该程序,它就像一个魅力。但是,如果我在没有调试的情况下运行(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);
            }
        }
    }
}
4

2 回答 2

0

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

于 2014-07-03T16:14:51.983 回答
0

这是因为“选项”设置为默认模拟。

尝试以下

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();
于 2016-09-10T01:47:46.153 回答