- 我阅读了这里所有的相关答案,两者都没有帮助
- 另外请注意:如果我在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();