Skip to main content

Windows 8 System Info

I talked about uniquely identifying a Windows 8 device before. Last week I stumbled over this post by Rene Schulte.  In this post he creates the SystemInformation class. This class gathers some useful information about the current system and dumps it in a string:

using System;
using System.Globalization;
using System.IO;
using System.Net.NetworkInformation;
using System.Runtime.InteropServices.WindowsRuntime;
using System.Text;
using System.Threading.Tasks;
using Windows.ApplicationModel;
using Windows.ApplicationModel.Store;
using Windows.Devices.Enumeration;
using Windows.Devices.Input;
using Windows.Graphics.Display;
using Windows.Networking.Connectivity;
using Windows.Security.ExchangeActiveSyncProvisioning;
using Windows.Storage;
using Windows.System.Profile;
using Windows.System.UserProfile;
using Windows.UI.Xaml;

namespace Schulte.Xaml.Windows
{
public class SystemInformation
{
public static async Task<string> Dump(bool shouldDumpCompleteDeviceInfos = false)
{
var builder = new StringBuilder();
var packageId = Package.Current.Id;
var clientDeviceInformation = new EasClientDeviceInformation();

// Get hardware Id
var token = HardwareIdentification.GetPackageSpecificToken(null);
var stream = token.Id.AsStream();
string hardwareId;
using (var reader = new BinaryReader(stream))
{
var bytes = reader.ReadBytes((int)stream.Length);
hardwareId = BitConverter.ToString(bytes);
}

builder.AppendLine("***** System Infos *****");
builder.AppendLine();
#if DEBUG
builder.AppendLine("DEBUG");
builder.AppendLine();
#endif
builder.AppendFormat("Time: {0}", DateTime.Now.ToUniversalTime().ToString("r"));
builder.AppendLine();
builder.AppendFormat("App Name: {0}", packageId.Name);
builder.AppendLine();
builder.AppendFormat("App Version: {0}.{1}.{2}.{3}", packageId.Version.Major, packageId.Version.Minor, packageId.Version.Build, packageId.Version.Revision);
builder.AppendLine();
builder.AppendFormat("App Publisher: {0}", packageId.Publisher);
builder.AppendLine();
builder.AppendFormat("Supported Package Architecture: {0}", packageId.Architecture);
builder.AppendLine();
builder.AppendFormat("Installed Location: {0}", Package.Current.InstalledLocation.Path);
builder.AppendLine();
builder.AppendFormat("Store App Id: {0}", CurrentApp.AppId);
builder.AppendLine();
if (CurrentApp.LicenseInformation.IsActive)
{
var listingInformation = await CurrentApp.LoadListingInformationAsync();
builder.AppendFormat("Store Current Market: {0}", listingInformation.CurrentMarket);
builder.AppendLine();
}
builder.AppendFormat("Culture: {0}", CultureInfo.CurrentCulture);
builder.AppendLine();
builder.AppendFormat("OS: {0}", clientDeviceInformation.OperatingSystem);
builder.AppendLine();
builder.AppendFormat("System Manufacturer: {0}", clientDeviceInformation.SystemManufacturer);
builder.AppendLine();
builder.AppendFormat("System Product Name: {0}", clientDeviceInformation.SystemProductName);
builder.AppendLine();
builder.AppendFormat("System Sku: {0}", clientDeviceInformation.SystemSku);
builder.AppendLine();
builder.AppendFormat("System Name: {0}", clientDeviceInformation.FriendlyName);
builder.AppendLine();
builder.AppendFormat("System ID: {0}", clientDeviceInformation.Id);
builder.AppendLine();
builder.AppendFormat("Hardware ID: {0}", hardwareId);
builder.AppendLine();
builder.AppendFormat("User Display Name: {0}", await UserInformation.GetDisplayNameAsync());
builder.AppendLine();
builder.AppendFormat("Window Bounds w x h: {0} x {1}", Window.Current.Bounds.Width, Window.Current.Bounds.Height);
builder.AppendLine();
builder.AppendFormat("Current Orientation: {0}", DisplayProperties.CurrentOrientation);
builder.AppendLine();
builder.AppendFormat("Native Orientation: {0}", DisplayProperties.NativeOrientation);
builder.AppendLine();
builder.AppendFormat("Logical DPI: {0}", DisplayProperties.LogicalDpi);
builder.AppendLine();
builder.AppendFormat("Resolution Scale: {0}", DisplayProperties.ResolutionScale);
builder.AppendLine();
builder.AppendFormat("Is Stereo Enabled: {0}", DisplayProperties.StereoEnabled);
builder.AppendLine();
builder.AppendFormat("Supports Keyboard: {0}", IsKeyboardPresent());
builder.AppendLine();
builder.AppendFormat("Supports Mouse: {0}", IsMousePresent());
builder.AppendLine();
builder.AppendFormat("Supports Touch (contacts): {0} ({1})", IsTouchPresent(), new TouchCapabilities().Contacts);
builder.AppendLine();
builder.AppendFormat("Is Network Available: {0}", NetworkInterface.GetIsNetworkAvailable());
builder.AppendLine();
builder.AppendFormat("Is Internet Connection Available: {0}", NetworkInformation.GetInternetConnectionProfile() != null);
builder.AppendLine();
builder.AppendFormat("Network Host Names: ");
foreach (var hostName in NetworkInformation.GetHostNames())
{
builder.AppendFormat("{0} ({1}), ", hostName.DisplayName, hostName.Type);
}
builder.AppendLine();
builder.AppendFormat("Current Memory Usage: {0:f3} MB", GC.GetTotalMemory(false) / 1024f / 1024f);
builder.AppendLine();
builder.AppendFormat("App Temp Folder: {0}", ApplicationData.Current.TemporaryFolder.Path);
builder.AppendLine();
builder.AppendFormat("App Local Folder: {0}", ApplicationData.Current.LocalFolder.Path);
builder.AppendLine();
builder.AppendFormat("App Roam Folder: {0}", ApplicationData.Current.RoamingFolder.Path);
builder.AppendLine();
builder.AppendLine();

if (shouldDumpCompleteDeviceInfos)
{
var devInfos = await DeviceInformation.FindAllAsync();
//builder.AppendLine("CPU Info:");
//foreach (var devInfo in devInfos.Where(d => d.Name.ToLower().Contains("cpu")))
//{
// builder.AppendFormat("Name: {0} Id: {1} - Properties: ", devInfo.Name, devInfo.Id);
// foreach (var pair in devInfo.Properties)
// {
// builder.AppendFormat("{0} = {1}, ", pair.Key, pair.Value);
// }
// builder.AppendLine();
//}

builder.AppendLine();
builder.AppendLine("Complete Device Infos:");
foreach (var devInfo in devInfos)
{
builder.AppendFormat("Name: {0} Id: {1} - Properties: ", devInfo.Name, devInfo.Id);
foreach (var pair in devInfo.Properties)
{
builder.AppendFormat("{0} = {1}, ", pair.Key, pair.Value);
}
builder.AppendLine();
}
}

return builder.ToString();
}

public static bool IsTouchPresent()
{
return new TouchCapabilities().TouchPresent == 1;
}

public static bool IsMousePresent()
{
return new MouseCapabilities().MousePresent == 1;
}

public static bool IsKeyboardPresent()
{
return new KeyboardCapabilities().KeyboardPresent == 1;
}
}
}

Popular posts from this blog

Podman– Command execution failed with exit code 125

After updating WSL on one of the developer machines, Podman failed to work. When we took a look through Podman Desktop, we noticed that Podman had stopped running and returned the following error message: Error: Command execution failed with exit code 125 Here are the steps we tried to fix the issue: We started by running podman info to get some extra details on what could be wrong: >podman info OS: windows/amd64 provider: wsl version: 5.3.1 Cannot connect to Podman. Please verify your connection to the Linux system using `podman system connection list`, or try `podman machine init` and `podman machine start` to manage a new Linux VM Error: unable to connect to Podman socket: failed to connect: dial tcp 127.0.0.1:2655: connectex: No connection could be made because the target machine actively refused it. That makes sense as the podman VM was not running. Let’s check the VM: >podman machine list NAME         ...

Azure DevOps/ GitHub emoji

I’m really bad at remembering emoji’s. So here is cheat sheet with all emoji’s that can be used in tools that support the github emoji markdown markup: All credits go to rcaviers who created this list.

VS Code Planning mode

After the introduction of Plan mode in Visual Studio , it now also found its way into VS Code. Planning mode, or as I like to call it 'Hannibal mode', extends GitHub Copilot's Agent Mode capabilities to handle larger, multi-step coding tasks with a structured approach. Instead of jumping straight into code generation, Planning mode creates a detailed execution plan. If you want more details, have a look at my previous post . Putting plan mode into action VS Code takes a different approach compared to Visual Studio when using plan mode. Instead of a configuration setting that you can activate but have limited control over, planning is available as a separate chat mode/agent: I like this approach better than how Visual Studio does it as you have explicit control when plan mode is activated. Instead of immediately diving into execution, the plan agent creates a plan and asks some follow up questions: You can further edit the plan by clicking on ‘Open in Editor’: ...