OK, so this drives me nuts.
The code below worked just fine in Windows 7 with .NET 3.5.
In Windows 8.1 and .NET 4.5.1 I get an empty result, but using the WMI Code Creator I can get the results.
I cannot find anything about this online.
I want to get the friendly names of any COM ports, e.g. "Communications Port (COM1)".
Just using System.IO.Ports.SerialPort.GetPortNames() wont do.
I really hope someone know how to do this. Thanks!
using System;
using System.Collections.Generic;
using System.Management;
namespace OakHub
{
public class SerialMgmt
{
static public List<String> GetCOMDevices()
{
List<String> list = new List<String>();
ManagementScope scope = new ManagementScope(#"\\" + Environment.MachineName + #"\root\CIMV2");
SelectQuery sq = new SelectQuery("SELECT Caption FROM Win32_PnPEntity");
ManagementObjectSearcher searcher = new ManagementObjectSearcher(scope, sq);
ManagementObjectCollection moc = searcher.Get();
foreach (ManagementObject mo in moc)
{
String name = mo.ToString();
if (name.ToString().Contains("(COM"))
{
list.Add(name);
}
}
return list;
}
}
}
First of all I dont know why this code is even working for you (with .Net 3.5).
You just selected the property Caption. (Use * to select all, if needed)
I think you want the name of the Win32_PnPEntity-Devices, you cant get it with this line of code
String name = mo.ToString();
Because the Name is a property. You First have to load the Property with the WMI-String :
SELECT Name,Caption FROM Win32_PnPEntity //Get Name and Caption Property
or
SELECT * FROM Win32_PnPEntity //Load all the Propertys of that WMI-Obj
And than you have to check if value is null else --> return the value
Code:
public List<String> GetLocalCOMDevices()
{
List<String> list = new List<String>();
ManagementScope scope = new ManagementScope(#"\\" + Environment.MachineName + #"\root\CIMV2");
SelectQuery sq = new SelectQuery("SELECT Name,Caption FROM Win32_PnPEntity");
ManagementObjectSearcher searcher = new ManagementObjectSearcher(scope, sq);
ManagementObjectCollection moc = searcher.Get();
foreach (ManagementObject mo in moc)
{
object propName = mo.Properties["Name"].Value;
if (propName == null) { continue; }
list.Add(propName.ToString());
}
return list;
}
Related
How does GetMonitorBrightness http://msdn.microsoft.com/en-us/library/ms775205.aspx work? Can someone give me an actual working implementation calling this code in C#?
I'm trying to retrieve the allowed brightness levels my laptop supports.
I have the following working code that sets the brightness from 1 to ~150. But I'm looking for the allowed input values (min max values).
static void SetBrightness(byte targetBrightness)
{
ManagementScope scope = new ManagementScope("root\\WMI");
SelectQuery query = new SelectQuery("WmiMonitorBrightnessMethods");
using (ManagementObjectSearcher searcher = new ManagementObjectSearcher(scope, query))
{
using (ManagementObjectCollection objectCollection = searcher.Get())
{
foreach (ManagementObject mObj in objectCollection)
{
mObj.InvokeMethod("WmiSetBrightness",
new Object[] { UInt32.MaxValue, targetBrightness });
break;
}
}
}
}
While using Interop should be possible this function is also available through WMI. Changing my original code a bit resulted in the following code that should work:
ManagementScope scope;
SelectQuery query;
scope = new ManagementScope("root\\WMI");
query = new SelectQuery("SELECT * FROM WmiMonitorBrightness");
using (ManagementObjectSearcher searcher = new ManagementObjectSearcher(scope, query))
{
using (ManagementObjectCollection objectCollection = searcher.Get())
{
foreach (ManagementObject mObj in objectCollection)
{
Console.WriteLine(mObj.ClassPath);
foreach (var item in mObj.Properties)
{
Console.WriteLine(item.Name + " " +item.Value.ToString());
if(item.Name =="CurrentBrightness")
//Do something with CurrentBrightness
}
}
}
}
Now I'm really curious how to handle 'special' cases like non laptop Screen's and if they implement any way to influence brightness.
The function has an output of the minimum and maximum values:
LPDWORD pdwMinimumBrightness=NULL;
LPDWORD pdwMaximumBrightness=NULL;
HANDLE pmh = pPhysicalMonitors[0].hPhysicalMonitor;
GetMonitorBrightness(pmh, pdwMinimumBrightness, pdwMaximumBrightness);
This is assuming that you want the values for the first monitor.
Is it possible get it using WMI query?
my current code:
ManagementObjectSearcher searcher = new ManagementObjectSearcher(
"SELECT * FROM Win32_NetworkAdapte");
foreach (ManagementObject queryObj in searcher.Get())
{
Console.WriteLine(queryObj[??]);
}
I'm tried get the connections name from:
Control Panel \ Network and Internet \ Network Connections
Using code below you would be able dump all properties of the Network Adapter, you need Name property:
ManagementObjectSearcher searcher = new ManagementObjectSearcher(
"SELECT * FROM Win32_NetworkAdapter");
foreach (ManagementObject adapter in searcher.Get())
{
StringBuilder propertiesDump = new StringBuilder();
foreach (var property in adapter.Properties)
{
propertiesDump.AppendFormat(
"{0} == {1}{2}",
property.Name,
property.Value,
Environment.NewLine);
}
}
OR simply using LINQ (add using System.Linq):
foreach (ManagementObject adapter in searcher.Get())
{
string adapterName = adapter.Properties
.Cast<PropertyData>()
.Single(p => p.Name == "Name")
.Value.ToString();
}
PS: Also be aware you've typo in WMI query - forgot r in Adapter: Win32_NetworkAdapte_r_
Let's change the code a little more and shorten it. ManagementClass class shortens the WMI query.
ManagementClass mc = new ManagementClass("Win32_NetworkAdapter");
ManagementObjectCollection results = mc.GetInstances();
foreach (var result in results)
{
foreach (PropertyData data in result.Properties)
Console.WriteLine($"{data.Name} == {data.Value}");
}
I want to turn off disks (WMI). So far, I have the following code:
ManagementScope scope = new ManagementScope("\\\\.\\ROOT\\cimv2");
ObjectQuery query = new ObjectQuery("SELECT * FROM CIM_DiskDrive");
//create object searcher
ManagementObjectSearcher searcher =
new ManagementObjectSearcher(scope, query);
ManagementObjectCollection queryCollection = searcher.Get();
//enumerate the collection.
foreach (ManagementObject m in queryCollection)
{
Console.WriteLine("in set power state for: " + m.Path);
ManagementOperationObserver obs = new ManagementOperationObserver();
obs.Progress += new ProgressEventHandler(obs_Progress);
obs.Completed += new CompletedEventHandler(obs_Completed);
m.InvokeMethod(obs, "SetPowerState", new object[]{"7"});
}
however, disk activity keeps on happening. Any ideas on what is going on will be appreciated.
SetPowerState is not implemented by WMI:
http://msdn.microsoft.com/en-us/library/aa387254(v=VS.85).aspx
checking CompletedEventArgs.Status will also return MethodNotImplemented telling us that this is the case. If you want to use that method you must implement your own provider.
This is my code, I can get name, description...
ManagementClass MgmtClass = new ManagementClass("Win32_SystemDriver");
foreach (ManagementObject mo in MgmtClass.GetInstances())
{
name=mo["Name"];
Dis=mo["Description"];
...
}
How can I get the date and version of drivers?
You should start from researching Win32_PnPSignedDriver Class and Win32_PnPEntity Class
EXAMPLE
ManagementObjectSearcher searcher =
new ManagementObjectSearcher("root\\CIMV2",
"SELECT * FROM Win32_PnPSignedDriver");
ManagementObjectCollection moc = searcher.Get();
foreach (var manObj in moc)
{
Console.WriteLine("Device Name: {0}\r\nDeviceID: {1}\r\nDriverDate: {2}\r\nDriverVersion: {3}\r\n==============================\r\n", manObj["FriendlyName"], manObj["DeviceID"], manObj["DriverDate"], manObj["DriverVersion"]);
}
I am trying create a simple WQL query where I only return mounted drives on a server. These are drives that do not have a drive letter associated with them.
I tried the following sytnax and it does not return a result set:
SELECT * FROM Win32_Volume WHERE DriveLetter = ""
Here is the complete code sample in C#:
string ManagementPath = string.Format(#"\\{0}\root\CIMV2", txtServerName.Text);
ConnectionOptions DriveConnOptions = new ConnectionOptions();
ObjectQuery oq = new ObjectQuery(#"SELECT * FROM Win32_Volume WHERE DriveLetter = """"");
ManagementScope Scope = new ManagementScope(ManagementPath, DriveConnOptions);
ManagementObjectSearcher Searcher = new ManagementObjectSearcher(Scope, oq);
ManagementObjectCollection collection = Searcher.Get();
foreach (ManagementObject mo in collection)
{
//do something...
}
I need to change my WQL statement to:
SELECT * FROM Win32_Volume WHERE DriveLetter IS NULL