27. januar 2006 - 09:41Der er
18 kommentarer og 1 løsning
Find en maskines Service Pack level
Hej xperter.
Jeg skal finde hvilken Service Pack der ligger på denne maskine. Er principielt lige glad med hvilket OS det.
Der er så i .NET denne:
Dim opSys As New OperatingSystem(Environment.OSVersion.Platform, Environment.OSVersion.Version) returnValue = opSys.ServicePack()
Men den returnere blot en tom string selv om jeg på denne XP maskine har SP2 på!!
Jeg kan hente den fra registry på HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\CSDVersion men det er jo vel ikke den helt rigtige måde. Det kan jo være at MS har tænkt sig at ligge den et andet sted i Vista og Vienna fx... Så jeg ville gerne kunne hente den med ren .NET kode.
Dim registryKey1 As RegistryKey = Registry.LocalMachine Dim keyId = "SOFTWARE\Microsoft\Windows NT\CurrentVersion" Dim registryKey2 As RegistryKey = registryKey1.OpenSubKey(keyId) Dim csdVersion As String = registryKey2.GetValue("CSDVersion") Console.WriteLine("Service pack version = ""{0}""", csdVersion)
Yes. Sådan har jeg allerede lavet det nu, men jeg tænkte om de evt havde lagt den ind i noget Environment.Something som med alt andet man kan hente.
Det er jo ikke sikkert M$ bliver ved med at smide den værdi lige der i registry og så ender det med at det er noget kode man skal vedligeholde hele tiden. Så kan de selvfølgelig også lave om i deres .NET kode så man ikke længere kan og så fremdeles.
Men ved du om der findes et sådan object der henter den information ud?
Det kræver at du tilføger System.Management.dll under referencer samt har en "Imports System.Management":
Dim sql As String = "SELECT CSDVersion FROM Win32_OperatingSystem" Dim mos As ManagementObjectSearcher = New ManagementObjectSearcher(sql) Dim moc As ManagementObjectCollection = mos.Get() For Each mo As ManagementObject In moc Console.WriteLine("Service pack version = ""{0}""", mo("CSDVersion")) Next
Yes den rene .NET løsning er den første du giver på Service Pack Level
Jeg kunne bare godt tænke mig at man også kunne hive ProductName ud via en .NET klasse, men det ser ikke rigtig ud til det.
Principielt er det jo også noget jeg kunne udlede af version nummrene, men det er bare ikke fandens dynamisk at gøre det på den måde. Så skal jeg til at opdatere hver* gang der kommer en ny windows.
Anyways. Fuck it. Så henter jeg den sgu bare i registry. Jeg skal jo alligevel opdatere den kode som du linker til når der kommer et nyt OS. Så jeg kommer jo alligevel ikke uden om at skulle tilføje i det.
Mja, hvis du henter fra registry, er du så sikker på at det virker for *tidligere* Windows-versioner? Jeg har personligt ingen anelse om hvorvid den har flyttet sig gundt i tidens løb.
I vores gamle VB6 komponent henter vi informationen i den key. For Win32NT maskiner under Microsoft\Windows NT\CurrentVersion Og for Win95 og Win98 maskiner under Microsoft\Windows\CurrentVersion
Så muligheden foreligger at de beholder den. Men hvem ved.
Synes godt om
Ny brugerNybegynder
Din løsning...
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.