Я занимаюсь разработкой приложения UWP с библиотекой классов .NET Standard для логики утилит.В этом приложении мне нужно собрать некоторые метаданные, связанные с работой ПК
. Я создал следующую структуру для чтения данных
public static void LoadSystemInfo(this Payload payload)
{
payload.SystemInfo = new SystemInfo
{
Machine = new Machine
{
SerialNumber = SystemInfo("SerialNumber"),
UuId = SystemInfo("UuId"),
},
HostName = SystemInfo("HostName"),
OsVersion = SystemInfo("OsVersion"),
OsManufacturer = SystemInfo("OsManufacturer"),
DeviceId = SystemInfo("DeviceId"),
SystemManufacturer = SystemInfo("SystemManufacturer"),
SystemModel = SystemInfo("SystemModel"),
SystemType = SystemInfo("SystemType"),
SystemLocale = SystemInfo("SystemLocale"),
TimeZone = SystemInfo("TimeZone"),
TotalPhysicalMemory = SystemInfo("TotalPhysicalMemory"),
AvailablePhysicalMemory = SystemInfo("AvailablePhysicalMemory"),
};
}
private static string SystemInfo(string key)
{
switch (key)
{
case "SerialNumber":
return GetMotherBoardId();
case "UuId":
return "";
case "HostName":
return "";
case "OsVersion":
return "";
case "OsManufacturer":
return "";
case "DeviceId":
return "";
case "SystemManufacturer":
return "";
case "SystemModel":
return "";
case "SystemType":
return "";
case "SystemLocale":
return "";
case "TimeZone":
return "";
case "TotalPhysicalMemory":
break;
case "AvailablePhysicalMemory":
return "";
default:
return $"Missing Case for {key}";
}
return null;
}
Я пытался получить идентификатор материнской платы, как показано ниже
public static string GetMotherBoardId()
{
string mbInfo = string.Empty;
ManagementScope scope = new ManagementScope("\\\\" + Environment.MachineName + "\\root\\cimv2");
scope.Connect();
ManagementObject wmiClass = new ManagementObject(scope,
new ManagementPath("Win32_BaseBoard.Tag=\"Base Board\""), new ObjectGetOptions());
foreach (PropertyData propData in wmiClass.Properties)
{
if (propData.Name == "SerialNumber")
mbInfo = $"{propData.Name,-25}{Convert.ToString(propData.Value)}";
}
return mbInfo;
}
Это выдает ошибку как System.Management в настоящее время поддерживается только для настольных приложений Windows.
Как получить все перечисленные выше свойства с локального ПК, который работаетмое приложение UWP.
Также пробовал скрипт PowerShell, как показано ниже
using (PowerShell powerShellInstance = PowerShell.Create())
{
powerShellInstance.AddCommand("get-wmiobject");
powerShellInstance.AddParameter("class", "Win32_ComputerSystemProduct");
//powerShellInstance.AddScript(
// "get-wmiobject Win32_ComputerSystemProduct | Select-Object -ExpandProperty UUID");
Collection<PSObject> psOutput = powerShellInstance.Invoke();
}
, который выдает ошибку, как показано ниже
Термин «get-wmiobject» не распознается какимя командлета, функции, файла сценария или работающей программы.Проверьте правильность написания имени или, если путь был указан, проверьте правильность пути и повторите попытку.
Обновление
Соблюдаетсяэта статья https://docs.microsoft.com/en-us/windows/desktop/wmisdk/retrieving-an-instance и она все еще не работает
string Namespace = @"root\cimv2";
string className = "Win32_LogicalDisk";
CimInstance myDrive = new CimInstance(className, Namespace);
CimSession mySession = CimSession.Create("localhost");
CimInstance searchInstance = mySession.GetInstance(Namespace, myDrive);
Выдает следующее сообщение об ошибке
Доступ к ресурсу CIM не был доступен для клиента.
Когда я пытаюсь это сделать
ManagementObjectSearcher mgmtObjSearcher = new ManagementObjectSearcher("SELECT * FROM Win32_LogicalDisk");
ManagementObjectCollection colDisks = mgmtObjSearcher.Get();
Я получаю эту ошибку
System.Management в настоящее время поддерживается только для настольных приложений Windows.
Когда я пытаюсь это
string command = "Get-Command Write-Output";
using (var ps = PowerShell.Create())
{
var results = ps.AddScript(command).Invoke();
foreach (var result in results)
{
Console.WriteLine(result.ToString());
}
ps.Commands.Clear();
}
Я получаю эту ошибку
Произошла ошибка при создании конвейера.-> Метод не найден: 'System.Text.StringBuilder System.Text.StringBuilder.Append (System.Text.StringBuilder)'.
Любая помощь, которую я очень ценю.