Avatar billede bootie Nybegynder
27. januar 2006 - 09:41 Der 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.

Hvordan ville i .NET experter gribe den an?
Avatar billede nielle Nybegynder
27. januar 2006 - 18:21 #1
Dette virker:

Dim os As OperatingSystem = Environment.OSVersion
Dim sp As String = os.ServicePack
Console.WriteLine("Service pack version = ""{0}""", sp)
Avatar billede bootie Nybegynder
27. januar 2006 - 21:38 #2
That seems to cut it.

Mange takker
Avatar billede nielle Nybegynder
27. januar 2006 - 21:47 #3
Svar :^)
Avatar billede bootie Nybegynder
27. januar 2006 - 21:51 #4
Det kan være du også ved hvordan jeg får fat i ProductName under HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\CSDVersion

Den kunne jeg også godt tænke mig var .NETified
Avatar billede nielle Nybegynder
27. januar 2006 - 21:56 #5
Jeg kan vise dig hvordan du får den ud via VB.Net, men det vil så bare ikke være en løsning som er "immun" imod at Microsoft senere flytter den?
Avatar billede nielle Nybegynder
27. januar 2006 - 22:07 #6
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)
Avatar billede nielle Nybegynder
27. januar 2006 - 22:08 #7
Kræver en "Imports Microsoft.Win32"
Avatar billede bootie Nybegynder
27. januar 2006 - 22:11 #8
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?
Avatar billede nielle Nybegynder
27. januar 2006 - 22:27 #9
Du kan også gøre det via WMI.

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
Avatar billede nielle Nybegynder
27. januar 2006 - 22:28 #10
Avatar billede bootie Nybegynder
27. januar 2006 - 22:29 #11
Ja, men med wmi er vi jo igen lidt uden for .NET

Det svare lidt til registry eksemplet.

Men det kan jo også være der slet ikke er mulighed for at hente den med ren .NET hvis du forstår hvad jeg mener.
Avatar billede nielle Nybegynder
27. januar 2006 - 22:31 #12
Den rene .Net løsning er vel 27/01-2006 18:21:18, eller hvad?
Avatar billede nielle Nybegynder
27. januar 2006 - 22:32 #13
Jeg er dog rimeligt sikker på at WMI er lidt mere holdbar end registrykeys.
Avatar billede bootie Nybegynder
27. januar 2006 - 23:27 #14
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.

*Ikke fordi det er så skide tit, men alligevel.
Avatar billede nielle Nybegynder
28. januar 2006 - 08:45 #15
Ahh, jeg kan se at jeg har misforstået den sidste del af dit spørgsmål en lille smule...

Nej, jeg kender ikke lige nogen genvej på det problem. Microsoft giver selv dette forslag (i C#):

http://support.microsoft.com/default.aspx?scid=kb;EN-US;304283

- men dels tager det ikke højde for kommende OS'er, og dels skelner det ikke mellem Home og Professionel versionerne af XP...
Avatar billede nielle Nybegynder
28. januar 2006 - 09:02 #16
... men det at Microsoft ikke selv giver en mere "venlig" metode antyder - for mig i hvert fald - at den ikke findes.
Avatar billede bootie Nybegynder
28. januar 2006 - 09:22 #17
Den del har jeg faktisk også allerede med.

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.

Takker for hjælpen.
Avatar billede nielle Nybegynder
28. januar 2006 - 09:27 #18
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.
Avatar billede bootie Nybegynder
28. januar 2006 - 09:30 #19
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.
Avatar billede Ny bruger Nybegynder

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.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester