2016-02-25 33 views
5

Desidero identificare un sistema operativo, ma non da un String perché voglio mapparlo come un ID. Diversi modi per andare su questo, quindi la mia domanda è:Identificare il sistema operativo del sistema tramite ID

Qualcuno ha una lista di tutte le possibili risposte che questo produce?

var name = (from x in new System.Management.ManagementObjectSearcher("SELECT * FROM Win32_OperatingSystem").Get().OfType<System.Management.ManagementObject>() 
        select x.GetPropertyValue("Caption")).FirstOrDefault(); 

Oppure, c'è un modo per la ricerca inversa campo Caption in base a qualsiasi altro campo?

Guardando a https://msdn.microsoft.com/en-us/library/windows/desktop/aa394239(v=vs.85).aspx non sembrano esserci abbastanza informazioni per ricreare il Caption da tutte le altre proprietà.

Ecco un esempio di questo risultato sulla mia macchina:

BootDevice: \Device\HarddiskVolume1 
BuildNumber: 10586 
BuildType: Multiprocessor Free 
Caption: Microsoft Windows 10 Pro N 
CodeSet: 1252 
CountryCode: 1 
CreationClassName: Win32_OperatingSystem 
CSCreationClassName: Win32_ComputerSystem 
CSDVersion: 
CSName: DESKTOP-6UJPPDS 
CurrentTimeZone: 120 
DataExecutionPrevention_32BitApplications: True 
DataExecutionPrevention_Available: True 
DataExecutionPrevention_Drivers: True 
DataExecutionPrevention_SupportPolicy: 2 
Debug: False 
Description: 
Distributed: False 
EncryptionLevel: 256 
ForegroundApplicationBoost: 2 
FreePhysicalMemory: 2027936 
FreeSpaceInPagingFiles: 4486600 
FreeVirtualMemory: 2611432 
InstallDate: 20151223101608.000000+120 
LargeSystemCache: 
LastBootUpTime: 20160215101020.112003+120 
LocalDateTime: 20160225114508.446000+120 
Locale: 0409 
Manufacturer: Microsoft Corporation 
MaxNumberOfProcesses: 4294967295 
MaxProcessMemorySize: 137438953344 
MUILanguages: System.String[] 
Name: Microsoft Windows 10 Pro N|C:\WINDOWS|\Device\Harddisk0\Partition2 
NumberOfLicensedUsers: 0 
NumberOfProcesses: 157 
NumberOfUsers: 2 
OperatingSystemSKU: 49 
Organization: 
OSArchitecture: 64-bit 
OSLanguage: 1033 
OSProductSuite: 256 
OSType: 18 
OtherTypeDescription: 
PAEEnabled: 
PlusProductID: 
PlusVersionNumber: 
PortableOperatingSystem: False 
Primary: True 
ProductType: 1 
RegisteredUser: developer 
SerialNumber: 00332-00331-71784-AA054 
ServicePackMajorVersion: 0 
ServicePackMinorVersion: 0 
SizeStoredInPagingFiles: 4637884 
Status: OK 
SuiteMask: 272 
SystemDevice: \Device\HarddiskVolume2 
SystemDirectory: C:\WINDOWS\system32 
SystemDrive: C: 
TotalSwapSpaceSize: 
TotalVirtualMemorySize: 12910660 
TotalVisibleMemorySize: 8272776 
Version: 10.0.10586 
WindowsDirectory: C:\WINDOWS 

Poi di nuovo che link non è prolisso abbastanza, come Google mi dice che OperatingSystemSKU ha più di 26 articoli, secondo quanto ho trovato 49 o anche 103.

Un altro percorso è con Environment.OSVersion ma penso che sia anche peggio di quello che sto guardando.

Quindi, o costruisco una tabella per una qualche forma di ricerca, oppure eseguo il reverse lookup di una libreria interna esistente.

mia soluzione attuale è quello di ottenere la versione del sistema operativo e di riferimenti incrociati un elenco che ho fatto da https://en.wikipedia.org/wiki/List_of_Microsoft_Windows_versions

Aggiornamento: Invece di inviare una stringa con il nome del sistema operativo, al mio API, per le preoccupazioni di larghezza di banda, Voglio inviare un ID univoco che possa annullare la ricerca per recuperare il sistema operativo dall'ID.

Attualmente sto creando questo database dinamicamente, utilizzando il valore di stringa del sistema operativo e quindi un ID ogni altra volta.

Vorrei una soluzione in grado di recuperare il campo Caption se ho alcuni degli altri campi di Win32_OperatingSystem e supponendo che sia il lato client che quello server abbiano gli ultimi dll/SDK.

TIA

risposta

18

come ho trovato 49 o anche 103

Nails giù il problema abbastanza bene. Sei dietro, sono 121 in questo momento. L'ultima aggiunta nella versione 10.0.10586 è Windows Holographic, quella che indossi.

L'anello del decodificatore segreto è memorizzato nel file di intestazione SDK WinNT.h, contiene dichiarazioni PRODUCT_Xxxxx. La tua è 49 == 0x31 == PRODUCT_PROFESSIONAL_N. L'edizione N è specifica per l'UE e la Svizzera, parte dell'accordo che ha costretto Microsoft a non distribuire più Windows Media Player. Importante per ottenere l'ultima versione dell'SDK per ottenere un elenco aggiornato. Ho guardato C: \ Programmi (x86) \ Kit di Windows \ 10 \ Include \ 10.0.10586.0 \ um \ winnt.h, rilasciato circa 3 mesi fa.

Il numero di versioni di Windows è esploso rapidamente, un tasso che difficilmente si ridurrà anche se Microsoft ha promesso che non ci sarà una versione 11 di Windows in qualsiasi momento. Instrumental era lo MinWin project, rompeva le interdipendenze tra le DLL del sistema operativo.Ciò ha reso molto più semplice costruire build di Windows con un mix di parti ottimizzato. Server Core è stato il primo beneficiario di questo progetto. Windows IoT (eseguito su un micro di midget) ha qualche ronzio in ritardo.

Una vittima molto chiara di questa proliferazione è che un controllo di versione diventa abbastanza inutile. Non ti dice più cosa puoi fare nel tuo codice. Né esiste un modo pratico per Microsoft di distribuire ancora gli shim appcompat che mantenevano i vecchi programmi compatibili con le nuove versioni di Windows. Una massiccia impresa, dovendo verificare decine di migliaia di programmi di uso comune, è dolorosa. Moltiplica quello per il numero di build personalizzate, come Holographic, e le varie edizioni che la politica e il marketing ispirano (come N, KN, E, V, S, A, EM) e puoi immaginare che questo non è un problema che vuoi risolvi te stesso

Nota anche il comportamento di Environment.OSVersion, anche le funzioni winapi come GetWindowsVersionEx(), il sistema operativo oggi si limita a te e restituisce la versione 6.3. Il numero di versione di Windows 8.1. La disattivazione di tale bugia richiede la modifica della versione del sottosistema mirata nell'intestazione del file EXE. I compilatori .NET sono stati utilizzati per impostarlo su 4.0, su 6.0 se si desidera utilizzare la versione 4.5 o successiva del framework (non verrà eseguito su XP o Server2003). Devi cambiarlo in 10.0. Backgrounder is here. Il problema dell'uovo e della gallina è intenzionale.

Microsoft vuole che oggi tutti si occupino di questo affidandosi a verifiche "basate sulle funzionalità" nel codice. Se cade a causa di una funzionalità secondaria mancante nel sistema operativo, si suppone che la procedura non funzioni correttamente, in modo che l'utente possa capire che la sua edizione non è abbastanza buona. Quindi molto non quello che stai cercando di fare.

+0

Sto tentando di inviare un messaggio a un'API che dice quale sistema operativo sto utilizzando. Tuttavia, volevo evitare di inviare una stringa dell'intero output e inviare qualcosa per rappresentare questo nome/descrizione, quindi effettuare una ricerca a livello locale. – ericosg

+0

Questo commento fa davvero poco per aiutarmi. Aggiorna la tua domanda ed è * specifica * su questa API e sul perché la versione del sistema operativo è importante. –

+0

Penso che tu abbia risposto bene alla mia domanda, sul vero scopo di questo comportamento. Lascio la taglia più a lungo possibile nel caso in cui qualcuno abbia una soluzione di ricerca inversa (improbabile). – ericosg