The .NET Framework provides numerous ways to obtain system information. Visual Basic.NET makes it even easier, but the ultimate power still lies within Windows itself, as you will soon see. Today, you will learn several ways to obtain information about your computer during runtime.
The ComputerInfo Class
The ComputerInfo class provides various properties for getting information about the computer’s Operating System, memory, name, and loaded assemblies. The ComputerInfo class has the following Properties:
- AvailablePhysicalMemory: Gets the amount of free physical memory.
- AvailableVirtualMemory: Gets the amount of free virtual memory.
- InstalledUICulture: Gets the current UI culture installed.
- OSFullName: Gets the full Operating System name.
- OSPlatform: Gets the platform of the Operating System.
- OSVersion: Gets the Operating System version.
- TotalPhysicalMemory: Gets the total physical memory for the computer.
- TotalVirtualMemory: Gets the total virtual memory available for the computer.
- System.Management Namespace: Provides access management information and events about the system, devices, and all applications instrumented to the WMI (Windows Management Instrumentation) infrastructure.
Practical
Your practical example today will make use of the ComputerInfo class to get some of the system information. Later, you will make use of the System.Management namespace to get more advanced system information.
Start Visual Studio and create a new Visual Basic Windows Forms application. You may name your project anything you desire, but, as always, keep in mind that my objects might be named differently. Your project will consist of for forms, with the first form having the most interaction. So, let’s design the forms one by one as shown next.
Form 1
Figure 1: Design of Form 1
Design your other three forms to look similar to Figure 2, of Form 2. It simply contains one Multi-line textbox.
Figure 2: The design of Forms 2-4
Add the following code for the button labeled ‘Available Physical Memory‘:
Private Sub btnAvailablePhysicalMemory_Click(sender As Object, _ e As EventArgs) Handles btnAvailablePhysicalMemory.Click MessageBox.Show("Available Physical Memory: " & _ My.Computer.Info.AvailablePhysicalMemory) End Sub
This code simply displays the amount of physical memory on your computer. Add the following code:
Private Sub btnAvailableVirtualMemory_Click(sender As Object, _ e As EventArgs) Handles btnAvailableVirtualMemory.Click MessageBox.Show("Available Virtual Memory: " & _ My.Computer.Info.AvailableVirtualMemory) End Sub Private Sub btnInstalledUICulture_Click(sender As Object, _ e As EventArgs) Handles btnInstalledUICulture.Click MessageBox.Show("UI Culture Name: " & _ My.Computer.Info.InstalledUICulture.DisplayName) End Sub Private Sub btnOSFullName_Click(sender As Object, _ e As EventArgs) Handles btnOSFullName.Click MessageBox.Show("Operating System Name: " & _ My.Computer.Info.OSFullName) End Sub Private Sub btnOSPlatform_Click(sender As Object, _ e As EventArgs) Handles btnOSPlatform.Click MessageBox.Show("Operating System Platform: " & _ My.Computer.Info.OSPlatform) End Sub Private Sub btnOSVersion_Click(sender As Object, _ e As EventArgs) Handles btnOSVersion.Click MessageBox.Show("Operating System Version: " & _ My.Computer.Info.OSVersion) End Sub Private Sub btnTotalPhysicalMemory_Click(sender As Object, _ e As EventArgs) Handles btnTotalPhysicalMemory.Click MessageBox.Show("Available Physical Memory: " & _ My.Computer.Info.TotalPhysicalMemory) End Sub Private Sub btnTotalVirtualMemory_Click(sender As Object, _ e As EventArgs) Handles btnTotalVirtualMemory.Click MessageBox.Show("Available Virtual Memory: " & _ My.Computer.Info.TotalVirtualMemory) End Sub
By making use of the ComputerInfo class, you now are able to detect the physical memory, virtual memory, and get basic Operating System details.
The remaining three buttons simply need to load the appropriate form, so let’s put those in now:
Private Sub Button1_Click(sender As Object, e As EventArgs) _ Handles Button1.Click Dim f2 As New Form2 f2.Show() End Sub Private Sub Button2_Click(sender As Object, e As EventArgs) _ Handles Button2.Click Dim f3 As New Form3 f3.Show() End Sub Private Sub Button3_Click(sender As Object, e As EventArgs) _ Handles Button3.Click Dim f4 As New Form4 f4.Show() End Sub
Each form must show different properties for different aspects of the Operating System. For example: Form 2 should show details that pertain to the Processor, Form 3 has to show information on the Logical Disks, and Form 4 has to show properties and details of the keyboard. All of this is possible through the management namespace and WMI Service Management.
What follows is an alphabetical list of Win32 classes we can tap into:
- Win32_1394Controller
- Win32_1394ControllerDevice
- Win32_AccountSID
- Win32_ActionCheck
- Win32_ActiveRoute
- Win32_AllocatedResource
- Win32_ApplicationCommandLine
- Win32_ApplicationService
- Win32_AssociatedProcessorMemory
- Win32_AutochkSetting
- Win32_BaseBoard
- Win32_Battery
- Win32_Binary
- Win32_BindImageAction
- Win32_BootConfiguration
- Win32_Bus Win32_CacheMemory
- Win32_CDROMDrive
- Win32_CheckCheck
- Win32_CIMLogicalDeviceCIMDataFile
- Win32_ClassicCOMApplicationClasses
- Win32_ClassicCOMClass
- Win32_ClassicCOMClassSetting
- Win32_ClassicCOMClassSettings
- Win32_ClassInforAction
- Win32_ClientApplicationSetting
- Win32_CodecFile
- Win32_COMApplicationSettings
- Win32_COMClassAutoEmulator
- Win32_ComClassEmulator
- Win32_ComponentCategory
- Win32_ComputerSystem
- Win32_ComputerSystemProcessor
- Win32_ComputerSystemProduct
- Win32_ComputerSystemWindowsProductActivationSetting
- Win32_Condition
- Win32_ConnectionShare
- Win32_ControllerHastHub
- Win32_CreateFolderAction
- Win32_CurrentProbe
- Win32_DCOMApplication
- Win32_DCOMApplicationAccessAllowedSetting
- Win32_DCOMApplicationLaunchAllowedSetting
- Win32_DCOMApplicationSetting
- Win32_DependentService
- Win32_Desktop
- Win32_DeviceBus
- Win32_DeviceMemoryAddress
- Win32_Directory
- Win32_DirectorySpecification
- Win32_DiskDrive
- Win32_DiskDrivePhysicalMedia
- Win32_DiskDriveToDiskPartition
- Win32_DiskPartition
- Win32_DiskQuota
- Win32_DisplayConfiguration
- Win32_DisplayControllerConfiguration
- Win32_DMAChanner
- Win32_DriverForDevice
- Win32_DuplicateFileAction
- Win32_Environment
- Win32_EnvironmentSpecification
- Win32_ExtensionInfoAction
- Win32_Fan
- Win32_FileSpecification
- Win32_FloppyDrive
- Win32_FontInfoAction
- Win32_Group
- Win32_GroupDomain
- Win32_GroupUser
- Win32_HeatPipe
- Win32_IDEControllerDevice
- Win32_ImplementedCategory
- Win32_InfraredDevice
- Win32_IniFileSpecification
- Win32_InstalledSoftwareElement
- Win32_IP4PersistedRouteTable
- Win32_IP4RouteTable
- Win32_IRQResource
- Win32_Keyboard
- Win32_LaunchCondition
- Win32_LoadOrderGroupServiceDependencies
- Win32_LoadOrderGroupServiceMembers
- Win32_LocalTime
- Win32_LoggedOnUser
- Win32_LogicalDisk
- Win32_LogicalDiskRootDirectory
- Win32_LogicalDiskToPartition
- Win32_LogicalFileAuditing
- Win32_LogicalFileGroup
- Win32_LogicalFileOwner
- Win32_LogicalFileSecuritySetting
- Win32_LogicalProgramGroup
- Win32_LogicalProgramGroupDirectory
- Win32_LogicalProgramGroupItem
- Win32_LogicalProgramGroupItemDataFile
- Win32_LogicalShareAccess
- Win32_LogicalShareAuditing
- Win32_LogicalShareSecuritySetting
- Win32_LogonSession
- Win32_MappedLogicalDisk
- Win32_MemoryArray
- Win32_MemoryArrayLocation
- Win32_MemoryDevice
- Win32_MemoryDeviceArray
- Win32_MemoryDeviceLocation
- Win32_MIMEInfoAction
- Win32_MotherboardDevice
- Win32_MoveFileAction
- Win32_NamedJobObjectActgInfo
- Win32_NamedJobObjectLimit
- Win32_NamedJobObjectLimitSetting
- Win32_NamedJobObjectProcess
- Win32_NamedJobObjectSecLimit
- Win32_NamedJobObjectSecLimitSetting
- Win32_NetworkAdapter
- Win32_NetworkAdapterConfiguration
- Win32_NetworkAdapterSetting
- Win32_NetworkClient
- Win32_NetworkConnection
- Win32_NetworkLoginProfile
- Win32_NetworkProtocol
- Win32_NTDomain
- Win32_NTLogEvnetLog
- Win32_NTLogEventUser
- Win32_ODBCAttribute
- Win32_ODBCDataSourceAttribute
- Win32_ODBCDataSourceSpecification
- Win32_ODBCDriverAttribute
- Win32_ODBCDriverSoftwareElement
- Win32_ODBCDriverSpecification
- Win32_ODBCTranslatorSpecification
- Win32_OnBoardDevice
- Win32_OperatingSystem
- Win32_OperatingSystemAutochkSetting
- Win32_OperatingSystemQFE
- Win32_OSRecoveryConfiguración
- Win32_PageFileElementSetting
- Win32_PageFileSetting
- Win32_PageFileUsage
- Win32_ParallelPort
- Win32_PatchFile
- Win32_PatchPackage
- Win32_PCMCIAControler
- Win32_PerfFormattedData_ASP_ActiveServerPages
- Win32_PerfFormattedData_ASPNET_ASPNET
- Win32_PerfFormattedData_ASPNET_ASPNETApplications
- Win32_PerfFormattedData_aspnet_state_ASPNETStateService
- Win32_PerfFormattedData_ContentIndex_IndexingService
- Win32_PerfFormattedData_DTSPipeline_SQLServerDTSPipeline
- Win32_PerfFormattedData_Fax_FaxServices
- Win32_PerfFormattedData_InetInfo_InternetInformationServicesGlobal
- Win32_PerfFormattedData_ISAPISearch_HttpIndexingService
- Win32_PerfFormattedData_MSDTC_DistributedTransactionCoordinator
- Win32_PerfFormattedData_NETCLRData_NETCLRData
- Win32_PerfFormattedData_NETCLRNetworking_NETCLRNetworking
- Win32_PerfFormattedData_NETDataProviderforOracle_NETCLRData
- Win32_PerfFormattedData_NETDataProviderforSqlServer_NETDataProviderforSqlServer
- Win32_PerfFormattedData_NETFramework_NETCLRExceptions
- Win32_PerfFormattedData_NETFramework_NETCLRInterop
- Win32_PerfFormattedData_NETFramework_NETCLRJit
- Win32_PerfFormattedData_NETFramework_NETCLRRemoting
- Win32_PerfFormattedData_NETFramework_NETCLRSecurity
- Win32_PerfFormattedData_Outlook_Outlook
- Win32_PerfFormattedData_PerfDisk_LogicalDisk
- Win32_PerfFormattedData_PerfDisk_PhysicalDisk
- Win32_PerfFormattedData_PerfNet_Browser
- Win32_PerfFormattedData_PerfNet_Redirector
- Win32_PerfFormattedData_PerfNet_Server
- Win32_PerfFormattedData_PerfNet_ServerWorkQueues
- Win32_PerfFormattedData_PerfOS_Cache
- Win32_PerfFormattedData_PerfOS_Memory
- Win32_PerfFormattedData_PerfOS_Objects
- Win32_PerfFormattedData_PerfOS_Processor
- Win32_PerfFormattedData_PerfOS_System
- Win32_PerfFormattedData_PerfProc_FullImage_Costly
- Win32_PerfFormattedData_PerfProc_Image_Costly
- Win32_PerfFormattedData_PerfProc_JobObject
- Win32_PerfFormattedData_PerfProc_JobObjectDetails
- Win32_PerfFormattedData_PerfProc_Process
- Win32_PerfFormattedData_PerfProc_ProcessAddressSpace_Costly
- Win32_PerfFormattedData_PerfProc_Thread
- Win32_PerfFormattedData_PerfProc_ThreadDetails_Costly
- Win32_PerfFormattedData_RemoteAccess_RASPort
- Win32_PerfFormattedData_RemoteAccess_RASTotal
- Win32_PerfFormattedData_RSVP_RSVPInterfaces
- Win32_PerfFormattedData_RSVP_RSVPService
- Win32_PerfFormattedData_Spooler_PrintQueue
- Win32_PerfFormattedData_TapiSrv_Telephony
- Win32_PerfFormattedData_Tcpip_ICMP
- Win32_PerfFormattedData_Tcpip_IP
- Win32_PerfFormattedData_Tcpip_NetworkInterface
- Win32_PerfFormattedData_Tcpip_TCP
- Win32_PerfFormattedData_Tcpip_UDP
- Win32_PerfFormattedData_TermService_TerminalServices
- Win32_PerfFormattedData_TermService_TerminalServicesSession
- Win32_PerfFormattedData_W3SVC_WebService
- Win32_PerfRawData_ASP_ActiveServerPages
- Win32_PerfRawData_ASPNET_114322_ASPNETAppsv114322
- Win32_PerfRawData_ASPNET_114322_ASPNETv114322
- Win32_PerfRawData_ASPNET_2040607_ASPNETAppsv2040607
- Win32_PerfRawData_ASPNET_2040607_ASPNETv2040607
- Win32_PerfRawData_ASPNET_ASPNET
- Win32_PerfRawData_ASPNET_ASPNETApplications
- Win32_PerfRawData_aspnet_state_ASPNETStateService
- Win32_PerfRawData_ContentFilter_IndexingServiceFilter
- Win32_PerfRawData_ContentIndex_IndexingService
- Win32_PerfRawData_DTSPipeline_SQLServerDTSPipeline
- Win32_PerfRawData_InetInfo_InternetInformationServicesGlobal
- Win32_PerfRawData_ISAPISearch_HttpIndexingService
- Win32_PerfRawData_MSDTC_DistributedTransactionCoordinator
- Win32_PerfRawData_NETCLRData_NETCLRData
- Win32_PerfRawData_NETCLRNetworking_NETCLRNetworking
- Win32_PerfRawData_NETDataProviderforOracle_NETCLRData
- Win32_PerfRawData_NETDataProviderforSqlServer_NETDataProviderforSqlServer
- Win32_PerfRawData_NETFramework_NETCLRExceptions
- Win32_PerfRawData_NETFramework_NETCLRInterop
- Win32_PerfRawData_NETFramework_NETCLRJit
- Win32_PerfRawData_NETFramework_NETCLRLoading
- Win32_PerfRawData_NETFramework_NETCLRLocksAndThreads
- Win32_PerfRawData_NETFramework_NETCLRRemoting
- Win32_PerfRawData_NETFramework_NETCLRSecurity
- Win32_PerfRawData_NTFSDRV_ControladordealmacenamientoNTFSdeSMTP
- Win32_PerfRawData_Outlook_Outlook
- Win32_PerfRawData_PerfDisk_LogicalDisk
- Win32_PerfRawData_PerfDisk_PhysicalDisk
- Win32_PerfRawData_PerfNet_Browser
- Win32_PerfRawData_PerfNet_Redirector
- Win32_PerfRawData_PerfNet_Server
- Win32_PerfRawData_PerfNet_ServerWorkQueues
- Win32_PerfRawData_PerfOS_Cache
- Win32_PerfRawData_PerfOS_Memory
- Win32_PerfRawData_PerfOS_Objects
- Win32_PerfRawData_PerfOS_Processor
- Win32_PerfRawData_PerfOS_System
- Win32_PerfRawData_PerfProc_FullImage_Costly
- Win32_PerfRawData_PerfProc_Image_Costly
- Win32_PerfRawData_PerfProc_JobObject
- Win32_PerfRawData_PerfProc_JobObjectDetails
- Win32_PerfRawData_PerfProc_Process
- Win32_PerfRawData_PerfProc_ProcessAddressSpace_Costly
- Win32_PerfRawData_PerfProc_Thread
- Win32_PerfRawData_PerfProc_ThreadDetails_Costly
- Win32_PerfRawData_RemoteAccess_RASPort
- Win32_PerfRawData_RemoteAccess_RASTotal
- Win32_PerfRawData_RSVP_RSVPInterfaces
- Win32_PerfRawData_RSVP_RSVPService
- Win32_PerfRawData_Spooler_PrintQueue
- Win32_PerfRawData_TapiSrv_Telephony
- Win32_PerfRawData_Tcpip_ICMP
- Win32_PerfRawData_Tcpip_IP
- Win32_PerfRawData_Tcpip_NBTConnection
- Win32_PerfRawData_Tcpip_NetworkInterface
- Win32_PerfRawData_Tcpip_TCP
- Win32_PerfRawData_TermService_TerminalServices
- Win32_PerfRawData_TermService_TerminalServicesSession
- Win32_PerfRawData_W3SVC_WebService
- Win32_PhysicalMedia
- Win32_PhysicalMemory
- Win32_PhysicalMemoryArray
- Win32_PhysicalMemoryLocation
- Win32_PingStatus
- Win32_PNPAllocatedResource
- Win32_PnPDevice
- Win32_PnPEntity
- Win32_PnPSignedDriver
- Win32_PnPSignedDriverCIMDataFile
- Win32_PointingDevice
- Win32_PortableBattery
- Win32_PortResource
- Win32_POTSModem
- Win32_POTSModemToSerialPort
- Win32_Printer
- Win32_PrinterConfiguration
- Win32_PrinterController
- Win32_PrinterDriver
- Win32_PrinterSetting
- Win32_PrinterShare
- Win32_PrintJob
- Win32_Process
- Win32_Processor
- Win32_Product
- Win32_ProductCheck
- Win32_ProductResource
- Win32_ProductSoftwareFeatures
- Win32_ProgIDSpecification
- Win32_ProgramGroup
- Win32_ProgramGroupContents
- Win32_Property
- Win32_ProtocolBinding
- Win32_Proxy
- Win32_PublishComponentAction
- Win32_QuickFixEngineering
- Win32_QuotaSetting
- Win32_Registry
- Win32_RegistryAction
- Win32_RemoveFileAction
- Win32_RemoveIniAction
- Win32_ReserveCost
- Win32_ScheduledJob
- Win32_SCSIController
- Win32_SCSIControllerDevice
- Win32_SecuritySettingOfLogicalShare
- Win32_SelfRegModuleAction
- Win32_SerialPort
- Win32_SerialPortConfiguration
- Win32_SerialPortSetting
- Win32_ServerConnection
- Win32_ServerSession
- Win32_Service
- Win32_ServiceControl
- Win32_ServiceSpecification
- Win32_ServiceSpecificationService
- Win32_SessionConnection
- Win32_SessionProcess
- Win32_Share
- Win32_ShareToDirectory
- Win32_ShortcutAction
- Win32_ShortcutFile
- Win32_SID
- Win32_SoftwareElement
- Win32_SoftwareElementAction
- Win32_SoftwareElementCheck
- Win32_SoftwareElementCondition
- Win32_SoftwareElementResource
- Win32_SoftwareFeature
- Win32_SoftwareFeatureAction
- Win32_SoftwareFeatureCheck
- Win32_SoftwareFeatureParent
- Win32_SoftwareFeatureSoftwareElements
- Win32_SoundDevice
- Win32_StartupCommand
- Win32_SubDirectory
- Win32_SystemAccount
- Win32_SystemBIOS
- Win32_SystemBootConfiguration
- Win32_SystemDesktop
- Win32_SystemDriver
- Win32_SystemDriverPNPEntity
- Win32_SystemEnclosure
- Win32_SystemLoadOrderGroups
- Win32_SystemLogicalMemoryConfiguration
- Win32_SystemNetworkConnections
- Win32_SystemOperatingSystem
- Win32_SystemPartitions
- Win32_SystemProcesses
- Win32_SystemProgramGroups
- Win32_SystemResources
- Win32_SystemServices
- Win32_SystemSlot
- Win32_SystemSystemDriver
- Win32_SystemTimeZone
- Win32_SystemUsers
- Win32_TCPIPPrinterPort
- Win32_TemperatureProbe
- Win32_Terminal
- Win32_TerminalService
- Win32_TerminalServiceSetting
- Win32_TerminalServiceToSetting
- Win32_TerminalTerminalSetting
- Win32_Thread
- Win32_TimeZone
- Win32_TSGeneralSetting
- Win32_TSNetworkAdapterListSetting
- Win32_TSNetworkAdapterSetting
- Win32_TSPermissionsSetting
- Win32_TSRemoteControlSetting
- Win32_TSSessionDirectory
- Win32_TSSessionDirectorySetting
- Win32_TSSessionSetting
- Win32_TypeLibraryAction
- Win32_UninterruptiblePowerSupply
- Win32_USBController
- Win32_USBControllerDevice
- Win32_USBHub
- Win32_UserAccount
- Win32_UserDesktop
- Win32_UserInDomain
- Win32_UTCTime
- Win32_VideoController
- Win32_VideoSettings
- Win32_VolumeQuotaSetting
- Win32_WindowsProductActivation
- Win32_WMIElementSetting
- Win32_WMISetting
To work with these Wind32 classes, you need to create a Function that can do that. Add a Module and then add the following functions into it:
Imports System.Management Imports System.Text Module Module1 Public Function GetInfo(stringIn As String) As String Dim sbOutput As New StringBuilder(String.Empty) Try Dim mcInfo As New ManagementClass(stringIn) Dim mcInfoCol As ManagementObjectCollection = _ mcInfo.GetInstances() Dim pdInfo As PropertyDataCollection = mcInfo.Properties For Each objMng As ManagementObject In mcInfoCol For Each prop As PropertyData In pdInfo Try sbOutput.AppendLine(prop.Name + ": " + _ objMng.Properties(prop.Name).Value) Catch End Try Next sbOutput.AppendLine() Next Catch End Try Return sbOutput.ToString() End Function End Module
You will notice that the compiler is complaining, so you need to add a Reference to the System.Management namespace as well, by selecting Project, Add reference, select the Framework tab, and select the System.Management namespace, as shown in Figure 3:
Figure 3: Add Reference
The preceding code accumulates all the desired information of the specified Windows32 class, and outputs it as a string. You now need to make use of the function from your remaining forms.
Form 2
Public Class Form2 Private Sub Form2_Load(sender As Object, e As EventArgs) _ Handles MyBase.Load TextBox1.Text = GetInfo("Win32_Processor") End Sub End Class
Form 3
Public Class Form3 Private Sub Form3_Load(sender As Object, e As EventArgs) _ Handles Me.Load TextBox1.Text = GetInfo("Win32_LogicalDisk") End Sub End Class
Form 4
Public Class Form4 Private Sub Form4_Load(sender As Object, e As EventArgs) _ Handles Me.Load TextBox1.Text = GetInfo("Win32_Keyboard") End Sub End Class
Once run, your forms will display the following outputs:
Figure 4: Processor
Figure 5: Logical Disk
Figure 6: Keyboard
The code for this article is available on GitHub.
Conclusion
Knowing how to obtain and manipulate information from the Operating system is vital for large applications. Happy playing, and don’t break anything!