मैं विंडोज सिस्टम के लिए वर्तमान समय क्षेत्र निर्धारित करने की कोशिश कर रहा हूं। निम्नलिखित कोड का टुकड़ा (शिथिल) है इस धागे पर @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))", तो यह
यहाँ क्या हो रहा है: मैं क्या विजुअल स्टूडियो डीबगर में देखते हैं? 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
बहुत ही रोचक विवरण। ध्यान दें कि रोमांस मानक समय यूरोप में लागू होता है - मेक्सिको नहीं। तो यह जानबूझकर किया गया कोई रास्ता नहीं है, क्योंकि मान एक ही स्ट्रिंग में असंबंधित हैं। –
@ मैट: मुझे संदेह है कि अतिरिक्त डेटा यादृच्छिक है, बस बफर आवंटित होने पर स्मृति में होने वाली जो भी हो। ऐसा लगता है कि विंडोज़ ही ऐसा कर रहा है; अगर मैं अतिरिक्त सामग्री को हटा देता हूं, तो टाइमज़ोन बदलें, यह फिर से दिखाई देता है। हर बार एक ही डेटा की तरह दिखता है, लेकिन मैंने यह देखने के लिए मशीन को रीबूट करने का प्रयास नहीं किया है कि इससे कोई अलग दिखता है या नहीं। –