2016-02-25 7 views
5

द्वारा सिस्टम ऑपरेटिंग सिस्टम की पहचान करें मैं एक ओएस की पहचान करना चाहता हूं, लेकिन String द्वारा नहीं, क्योंकि मैं इसे आईडी के रूप में मैप करना चाहता हूं। इस बारे में जाने के कई तरीके हैं, इसलिए मेरा प्रश्न है:आईडी

क्या किसी के पास इस उत्पाद के सभी संभावित उत्तरों की एक सूची है?

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

या, क्या कोई अन्य क्षेत्र के आधार पर Caption क्षेत्र देखने को उल्टा करने के लिए एक रास्ता है?

https://msdn.microsoft.com/en-us/library/windows/desktop/aa394239(v=vs.85).aspx पर देखकर Caption को अन्य सभी संपत्तियों से पुन: बनाने के लिए पर्याप्त जानकारी प्रतीत नहीं होती है। उस लिंक नहीं वर्बोज़ पर्याप्त, के रूप में गूगल मुझसे कहता है कि OperatingSystemSKU से अधिक 26 आइटम नहीं है, जैसा कि मैंने 49 मिल गया है या है तो फिर

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 

:

यहाँ मेरी मशीन पर इस परिणाम का एक नमूना यहां तक ​​कि 103.

एक और मार्ग Environment.OSVersion के साथ है, लेकिन मुझे लगता है कि यह जो भी मैं देख रहा हूं उससे भी बदतर है।

तो या तो मैं कुछ प्रकार के लुकअप के लिए एक टेबल बनाता हूं, या मैं एक मौजूदा आंतरिक पुस्तकालय को देखने के लिए उलटा करता हूं।

मेरे वर्तमान समाधान OS संस्करण और परस्पर-संदर्भ एक सूची मैं https://en.wikipedia.org/wiki/List_of_Microsoft_Windows_versions से बना पाने के लिए है

अद्यतन: इसके बजाय मेरी एपीआई को, ओएस नाम के साथ एक स्ट्रिंग भेजने से, बैंडविड्थ चिंताओं के लिए, मैं एक अद्वितीय आईडी भेजना चाहता हूं कि मैं आईडी से ओएस को पुनः प्राप्त करने के लिए लुकअप लुकअप कर सकता हूं।

मैं वर्तमान में ओएस के स्ट्रिंग मान और फिर हर बार एक आईडी का उपयोग करके इस डेटाबेस को गतिशील रूप से बना रहा हूं।

मुझे एक समाधान चाहिए जो Caption फ़ील्ड को पुनर्प्राप्त कर सकता है यदि मेरे पास Win32_OperatingSystem के कुछ अन्य फ़ील्ड हैं और यह मानते हुए कि क्लाइंट और सर्वर दोनों के पास नवीनतम डीएलएस/एसडीके हैं।

TIA

उत्तर

18

के रूप में मैं 49 या यहाँ तक कि 103

नाखून समस्या नीचे बहुत अच्छी तरह से मिल गया है। आप पीछे हैं, अभी 121 है। संस्करण 10.0.10586 में नवीनतम जोड़ा विंडोज होलोग्राफिक है, जिसे आप अपने सिर पर पहनते हैं।

गुप्त डिकोडर अंगूठी WinNT.h एसडीके हेडर फ़ाइल में संग्रहीत है, इसमें PRODUCT_Xxxxx घोषणाएं हैं। आपका 49 == 0x31 == PRODUCT_PROFESSIONAL_N है। एन संस्करण ईयू और स्विट्ज़रलैंड के लिए विशिष्ट है, इस समझौते का हिस्सा है जिसने माइक्रोसॉफ्ट को विंडोज मीडिया प्लेयर को अब तैनात नहीं किया है। अद्यतित सूची प्राप्त करने के लिए सबसे अंतिम एसडीके संस्करण प्राप्त करना महत्वपूर्ण है। मैंने सी: \ प्रोग्राम फ़ाइलें (x86) \ विंडोज किट \ 10 \ \ 10.0.10586.0 \ um \ winnt.h को शामिल किया, लगभग 3 महीने पहले जारी किया गया।

विंडोज संस्करणों की संख्या तेजी से विस्फोट कर रही है, एक ऐसी दर जो कम करने की संभावना नहीं है, भले ही माइक्रोसॉफ्ट ने वादा किया हो कि विंडोज़ संस्करण 11 जल्द ही नहीं होगा। इंस्ट्रुमेंटल MinWin project था, इसने ऑपरेटिंग सिस्टम डीएलएल के बीच अंतर-निर्भरता तोड़ दी।इससे विंडोज़ बनाने के लिए यह बहुत आसान हो गया है, जिसमें भागों का ट्यूनेड मिश्रण है। सर्वर कोर उस परियोजना के पहले जाने-माने लाभार्थी थे। विंडोज आईओटी (मिडेट माइक्रो पर चलता है) देर से कुछ buzz है।

इस प्रसार का एक बहुत स्पष्ट दुर्घटना यह है कि एक संस्करण की जांच काफी बेकार हो जाती है। यह आपको नहीं बताता कि आप अपने कोड में अब क्या कर सकते हैं। माइक्रोसॉफ्ट के लिए अब भी एक व्यावहारिक तरीका नहीं है जो अभी भी एपकंपेट शिम्स को तैनात करता है जो पुराने विंडोज़ रिलीज के साथ पुराने कार्यक्रमों को संगत रखता है। एक बड़े उपक्रम बीटीडब्ल्यू, सामान्य उपयोग में हजारों कार्यक्रमों को सत्यापित करने के लिए दर्दनाक है। होलोग्रफ़िक जैसे कस्टम बिल्डों की संख्या और राजनीति और विपणन जैसे विभिन्न संस्करणों (जैसे एन, केएन, ई, वी, एस, ए, ईएम) की तुलना में गुणा करें और आप कल्पना कर सकते हैं कि यह कोई समस्या नहीं है जिसे आप चाहते हैं खुद को हल करें।

पर्यावरण .OSVersion के व्यवहार को भी ध्यान दें, GetWindowsVersionEx() जैसे Winapi फ़ंक्शंस, ओएस आज बस आपके लिए निहित है और संस्करण 6.3 देता है। विंडोज 8.1 का संस्करण संख्या। उस झूठ को बंद करने के लिए EXE फ़ाइल शीर्षलेख में लक्षित उप-सिस्टम संस्करण को बदलने की आवश्यकता है। यदि आप फ्रेमवर्क संस्करण 4.5 या उच्चतर (XP या Server2003 पर नहीं चलेंगे) को लक्षित करते हैं तो .NET कंपाइलर्स इसे 4.0, 6.0 पर सेट करने के लिए उपयोग किए जाते हैं। आपको इसे 10.0 में बदलना होगा। पृष्ठभूमि is here। चिकन-एंड-अंडे की समस्या जानबूझकर है।

माइक्रोसॉफ्ट चाहता है कि कोड में "क्षमता-आधारित" चेक पर भरोसा करके सभी लोग इस से निपटें। यदि यह खत्म हो जाता है क्योंकि ओएस में एक सब-फीचर गायब है तो आपको शानदार तरीके से असफल होना चाहिए ताकि उपयोगकर्ता यह पता लगा सके कि उसका संस्करण पर्याप्त नहीं है। तो बहुत जो आप करने की कोशिश कर रहे हैं।

+0

मैं एक एपीआई को एक संदेश भेजने की कोशिश कर रहा हूं जो कहता है कि ओएस मैं क्या चल रहा हूं। हालांकि, मैं पूरे आउटपुट की एक स्ट्रिंग भेजने से बचाना चाहता था और इस नाम/विवरण का प्रतिनिधित्व करने के लिए कुछ भेजना चाहता था, फिर स्थानीय रूप से एक लुकअप करें। – ericosg

+0

यह टिप्पणी आपकी मदद करने में मेरी सहायता करने के लिए बहुत कम है। अपना प्रश्न अपडेट करें और इस एपीआई के बारे में * विशिष्ट * और ओएस संस्करण क्यों मायने रखता है। –

+0

मुझे लगता है कि आपने इस व्यवहार के वास्तविक उद्देश्य पर, मेरे प्रश्न का उत्तर दिया है। जब तक किसी के पास रिवर्स-लुकअप समाधान (असंभव) है तो मैं तब तक बक्षीस छोड़ दूंगा जब तक कि मैं कर सकता हूं। – ericosg