2014-12-31 2 views
5

मैं विंडोज सिस्टम के लिए वर्तमान समय क्षेत्र निर्धारित करने की कोशिश कर रहा हूं। निम्नलिखित कोड का टुकड़ा (शिथिल) है इस धागे पर @MattJohnson द्वारा उत्तर के आधार पर: Getting local timezone identifier when OS display language is non-englishHKLM SYSTEM CurrentControlSet Control TimeZoneInformation TimeZoneKeyName दूषित?

using (RegistryKey registryKey = Registry.LocalMachine.OpenSubKey(
            @"SYSTEM\CurrentControlSet\Control\TimeZoneInformation")) 
    { 
     if (registryKey != null) 
     { 
      string windowsTimeZoneId = registryKey.GetValue("TimeZoneKeyName") as string; 
      if (string.IsNullOrEmpty(windowsTimeZoneId)) 
      windowsTimeZoneId = registryKey.GetValue("StandardName") as string; 
      if (!string.IsNullOrEmpty(windowsTimeZoneId)) 
      { 
      int i = windowsTimeZoneId.IndexOf('\0'); 
      if (i != -1) 
       windowsTimeZoneId = windowsTimeZoneId.Remove(i); 
      return ConvertFromWindowsId(windowsTimeZoneId); 
      } 
     } 
    } 

मैं पहली पंक्ति पर एक ब्रेकपाइंट जगह "अगर (string.IsNullOrEmpty (windowsTimeZoneId))", तो यह

enter image description here

यहाँ क्या हो रहा है: मैं क्या विजुअल स्टूडियो डीबगर में देखते हैं? RegistryKey.GetValue() एक बॉक्सिंग स्ट्रिंग लौट रहा है, लेकिन यह दो हेक्स 00 बाइट्स का पता क्यों नहीं लगाता है और वहां स्ट्रिंग को समाप्त कर देता है?

अब तक मैंने अपने दो पीसी पर इसका परीक्षण किया है। यह एक ऐसा है जो विंडोज 7 64-बिट चलाता है। दूसरा, विंडोज 7 32-बिट चल रहा है, सिवाय इसके कि यह कहता है कि लौटाई गई स्ट्रिंग की लंबाई 127 के बजाय 128 वर्ण है।

regedit.exe के साथ रजिस्ट्री प्रविष्टि को देखते समय यह ठीक लगता है, केवल "रोमांस मानक समय" दिखा रहा है।

कुछ गुगलिंग ने इस प्रश्न को https://social.msdn.microsoft.com/Forums/sqlserver/en-US/eca7ad76-c910-46be-8fb9-876c7cde5c69/registry-read-time-zone-info-differ-when-code-build-on-40-framework-on-host-system-win-7-64-bit?forum=csharpgeneral चालू कर दिया अन्यथा मुझे कुछ भी नहीं मिला।

कार्यक्रम विजुअल स्टूडियो 2012 के साथ बनाया जा रहा है, और .NET 2.0 को लक्षित कर रहा है।

जैसा कि आप देख सकते हैं, मैंने इस "भ्रष्ट" परिणाम को ध्यान में रखने के लिए कोड जोड़ा है, लेकिन फिर भी अगर मैं किसी को समझा सकता हूं कि यहां क्या हो रहा है, और शायद यहां तक ​​कि कैसे बचें पूरी समस्या

संपादित करें:

कार्यक्रम दृश्य स्टूडियो 2012, और नेट 2.0 लक्ष्यीकरण के साथ बनाया जा रहा है।

हम्म, साजिश मोटा हो जाता है। वह बयान पूरी तरह से सही नहीं था। ऊपर दिखाए गए कोड का स्टंप लाइब्रेरी असेंबली में है जो .NET 2.0 को लक्षित करने के लिए बनाया गया है, लेकिन इसे प्रोग्राम से बुलाया जा रहा था जिसने .NET 4.0 को लक्षित किया था। अब मैंने इसे प्रोग्राम से कॉल करने का प्रयास किया है जो नेट 2.0 को लक्षित करता है, और इसमें कोई समस्या नहीं है, रजिस्ट्रीकि.गेटवेल्यू() बस "रोमांस स्टैंडर्ड टाइम" लौटाता है। तो ऐसा प्रतीत होता है कि इसमें एमएसडीएन पर पोस्टिंग द्वारा निहित नेट फ्रेमवर्क 4.0 के साथ कुछ करना है।

संपादित करें 2 - लगता है कि यह "सामान्य" है शुरुआत

यह इतना के लिए थोड़ा विषय से हटकर है, लेकिन मैं इसकी सराहना करता हूँ अगर किसी को सुपर उपयोगकर्ता पर अपने संबंधित पोस्टिंग से अधिक पर एक नज़र ले जाएगा। कॉम, क्योंकि मुझे वहां तत्काल संतुष्टि नहीं मिल रही है, और मैं इसे हल करना चाहता हूं इसलिए मुझे पता है कि मुझे अभी भी घबराहट होनी चाहिए या नहीं। धन्यवाद।

https://superuser.com/questions/859031/possible-malware-modification-of-windows-registry-entry

+0

बहुत ही रोचक विवरण। ध्यान दें कि रोमांस मानक समय यूरोप में लागू होता है - मेक्सिको नहीं। तो यह जानबूझकर किया गया कोई रास्ता नहीं है, क्योंकि मान एक ही स्ट्रिंग में असंबंधित हैं। –

+0

@ मैट: मुझे संदेह है कि अतिरिक्त डेटा यादृच्छिक है, बस बफर आवंटित होने पर स्मृति में होने वाली जो भी हो। ऐसा लगता है कि विंडोज़ ही ऐसा कर रहा है; अगर मैं अतिरिक्त सामग्री को हटा देता हूं, तो टाइमज़ोन बदलें, यह फिर से दिखाई देता है। हर बार एक ही डेटा की तरह दिखता है, लेकिन मैंने यह देखने के लिए मशीन को रीबूट करने का प्रयास नहीं किया है कि इससे कोई अलग दिखता है या नहीं। –

उत्तर

2

जब एक स्ट्रिंग या बहु स्ट्रिंग मान रजिस्ट्री में सेट किया गया है, विंडोज अर्थ विज्ञान की जाँच नहीं करता है; यह प्रोग्रामर द्वारा निर्दिष्ट लंबाई के साथ, जो भी बाइनरी सामग्री प्रदान की जाती है, बस स्टोर करता है। इसका मतलब है कि एक स्ट्रिंग को समय-समय पर निरस्त कर दिया जा सकता है, या इसके विपरीत, बिल्कुल शून्य-समाप्त नहीं किया जा सकता है। (इसमें सुरक्षा प्रभाव पड़ता है, वैसे: जब मुझे नहीं लगता कि समयपूर्व शून्य समाप्ति को जोखिम उठाने की संभावना है, तो मूल कोड जो उस स्थिति को संभालने में विफल रहता है जहां स्ट्रिंग शून्य-समाप्त नहीं हो सकती है।)

हंस के अनुसार (। हटाए गए उत्तर में) 4.x से पहले .NET के संस्करणों को अतिरिक्त डेटा को अनदेखा कर दिया जाएगा यदि स्ट्रिंग समय-समय पर समाप्त हो जाती है, जबकि 4.x इसमें शामिल है। इसलिए आपने 4.x का उपयोग करना शुरू करने के बाद ही समस्या को देखा।

क्यों यह विशेष मान समय-समय पर समाप्त हो गया है, यह माइक्रोसॉफ्ट के हिस्से पर लापरवाही प्रतीत होता है। यदि आप अतिरिक्त डेटा हटाते हैं, और फिर टाइमज़ोन बदलते हैं, तो अतिरिक्त डेटा फिर से दिखाई देता है। तो ऐसा लगता है कि विंडोज़ ऐसा ही कर रहा है। डेटा मुझे यादृच्छिक लग रहा है, इसलिए मुझे विश्वास नहीं है कि यह जानबूझकर है। वास्तव में, यह तकनीकी रूप से डेटा एक्सपोजर भेद्यता का गठन कर सकता है, हालांकि शायद कोई व्यावहारिक प्रभाव नहीं है।

मेरा सुझाव है कि यदि आप आवश्यक हो तो स्ट्रिंग को कम करें और स्ट्रिंग को छोटा करें। ऐसी परिस्थितियां हो सकती हैं जिनमें कोई नहीं है, उदाहरण के लिए, यदि प्रविष्टि को तृतीय-पक्ष कोड द्वारा संशोधित किया गया है, या यदि एमएस अंततः एक अद्यतन जारी करता है और समस्या को हल करता है, या, निश्चित रूप से, यदि आप चल रहे हैं। नेट 2.x. तो आपको दोनों मामलों को संभालने की आवश्यकता होगी।

(यदि मेरे पास समय है, तो जब मैं अगले सप्ताह काम पर वापस जाऊंगा, तो मैं वर्चुअल मशीन पर विंडोज की एक स्वच्छ प्रति स्थापित करूंगा और पुष्टि करता हूं कि समस्या बिल्कुल मौजूद कोई तृतीय-पक्ष सॉफ़्टवेयर मौजूद नहीं है। यदि ऐसा है, तो मैं रिपोर्टिंग पर विचार करेंगे - मुझे संदेह है कि एमएस एक पैच जारी करेगा, लेकिन यह विंडोज के भविष्य के संस्करण में तय हो सकता है।)

+0

इसे जांचने के लिए और आपके अच्छे स्पष्टीकरण के लिए बहुत बहुत धन्यवाद। अब मैं फिर से सो सकता हूँ। (हंस के जवाब ने मुझे वास्तव में परेशान किया था, और मैं एक नए ग्राहक से संपर्क करने की कगार पर था और उन्हें चेतावनी दी थी कि मैंने अनजाने में अपने लगभग 300 पीसी को अनदेखा वायरस से संक्रमित किया था। इससे मुझे उनके साथ बहुत लोकप्रिय बना दिया गया।) – RenniePet

संबंधित मुद्दे