2016-04-13 9 views
5

किसी एप्लिकेशन का परीक्षण करते समय, मैंने अजीब व्यवहार में भाग लिया। कुछ परीक्षण एक अलग उपयोगकर्ता के रूप में कोड चलाने के प्रतिरूपण का उपयोग करते हैं, लेकिन वे हमेशा लटकाएंगे, कभी पूरा नहीं करेंगे।प्रतिकृति का उपयोग करते समय म्यूटेक्स सृजन लटकता है

कुछ जांच के बाद, समस्या को म्यूटेक्स के उपयोग के लिए सीमित कर दिया गया था। मूल रूप से, हमने MSDN documentation पर आधारित अपने स्वयं के प्रतिरूपण कोड का उपयोग किया, लेकिन SimpleImpersonation library का उपयोग करते समय भी समस्या बनी हुई है।

using (Impersonation.LogonUser(DOMAIN, USER, PASSWORD, LogonType.Interactive)) 
{ 
    Console.WriteLine("Impersonated"); 
    bool mine; 
    using (new Mutex(true, "Mutex", out mine)) 
    { 
     if (!mine) 
      throw new Exception("Couldn't get mutex"); 
     Console.WriteLine("Got mutex"); 
    } 
} 

Console.WriteLine("Finished"); 

यह कभी नहीं खत्म, यह म्युटेक्स निर्माण के साथ लाइन पर अटक रहा है: यहाँ समस्या को पुन: करने के लिए एक न्यूनतम उदाहरण है। documentation बताता है कि इसे या तो अपवाद फेंकना चाहिए या कुछ वापस करना चाहिए, लेकिन अवरोधन का उल्लेख नहीं है।

कुछ अन्य टिप्पणियों, जो या नहीं संबंधित हो सकता है हो सकता है:

  • अगर हम वर्तमान उपयोगकर्ता "का रूप धारण", यह तुरंत वापस लौट
  • अगर हम वास्तविक आवेदन चलाने के लिए और के रूप में एक एक और उदाहरण शुरू अलग उपयोगकर्ता, सब कुछ

शायद अंतर्निहित सिस्टम संसाधनों के साथ कुछ चल रहा है, लेकिन हम इसे समझ नहीं पाए। यह काम कैसे करें?

अद्यतन: हंस की टिप्पणी के अनुसार, मैंने विंडोज डिफेंडर को अक्षम करने का प्रयास किया, इससे मदद नहीं मिली। यहाँ है जहाँ यह फांसी की जगह का एक स्टैकट्रेस है:

[email protected]() 
    [email protected]() 
    mscorlib.ni.dll!719c1867() 
    [Frames below may be incorrect and/or missing, native debugger attempting to walk managed call stack] 
    mscorlib.ni.dll!719c1852() 
    [Managed to Native Transition] 
    mscorlib.dll!System.Threading.Mutex.CreateMutexHandle(bool initiallyOwned, string name, Microsoft.Win32.Win32Native.SECURITY_ATTRIBUTES securityAttribute, out Microsoft.Win32.SafeHandles.SafeWaitHandle mutexHandle) 
     mscorlib.dll!System.Threading.Mutex.MutexTryCodeHelper.MutexTryCode(object userData) 
    [Native to Managed Transition] 
    [Managed to Native Transition] 
    mscorlib.dll!System.Threading.Mutex.CreateMutexWithGuaranteedCleanup(bool initiallyOwned, string name, out bool createdNew, Microsoft.Win32.Win32Native.SECURITY_ATTRIBUTES secAttrs) 
    mscorlib.dll!System.Threading.Mutex.Mutex(bool initiallyOwned, string name, out bool createdNew, System.Security.AccessControl.MutexSecurity mutexSecurity) 
    mscorlib.dll!System.Threading.Mutex.Mutex(bool initiallyOwned, string name, out bool createdNew)  
    MutexImpersonationTest.exe!MutexImpersonationTest.Program.Main(string[] args) Line 16 
+0

बहुत अजीब। एफडब्ल्यूआईडब्लू, अगर आपको कोई अच्छा जवाब नहीं मिलता है, तो अंतिम कक्षा का कामकाज करना होगा .नेट कक्षाओं को भूलना और सीधे Win32 API को कॉल करने के लिए पी/Invoke का उपयोग करना होगा। –

उत्तर

6

यह कोड एक Mutex प्राप्त करने के लिए एक अनंत लूप में अटक हो रही है की तरह लग रहा है, और मेरी परीक्षणों में, यह करने के लिए कॉल के भीतर 100% पर एक कोर पेगिंग है new Mutex(...)

ऐसा लगता है कि फ्रेमवर्क कोड पहले Win32 CreateMutex को कॉल करने का प्रयास करता है, यदि वह "एक्सेस अस्वीकृत" त्रुटि के साथ विफल रहता है, तो इसके बजाय OpenMutex पर कॉल करने का प्रयास करता है। यदि OpenMutex कॉल mutex मौजूद नहीं होने वाली त्रुटि के साथ विफल रहता है, तो यह पूरी प्रक्रिया को फिर से दोहराता है, और इसलिए mutex मौजूद नहीं होने पर एक अनंत लूप में फंस जाता है।

CreateMutex documentation के अनुसार, इस अनिवार्य रूप से सही दृष्टिकोण है, लेकिन जब प्रारंभिक CreateMutex विफल रहता है एक में प्रवेश के साथ इनकार किया है कि एक मौजूदा म्युटेक्स पर अनुमतियों के कारण नहीं होने की स्थिति के लिए खाते में नहीं लगता है।

एक चीज जो मैंने कोशिश की थी, काम करने लगते थे, "ग्लोबल \" के साथ म्यूटेक्स नाम को उपसर्ग करना था, उम्मीद है कि यह आपके लिए उपयुक्त कामकाज है।

+0

वैश्विक म्यूटेक्स वास्तव में इस तरह बनाया जा सकता है, लेकिन यह सभी उपयोगकर्ता सत्रों में उदाहरणों को सीमित करता है, जो व्यवहार में नाटकीय परिवर्तन है ... –

+0

अच्छा पकड़, जबकि (सत्य) कोड [यहां है] (http: // संदर्भ। microsoft.com/#mscorlib/system/threading/mutex.cs,9faa5b5e2b4c8f31)। –

+1

@ मार्टनमोल्नेर यदि आप एक सत्र-विशिष्ट म्यूटेक्स चाहते हैं तो आपको कुछ विकल्प मिलेंगे - आप * प्रतिरूपण करने से पहले mutex * बना सकते हैं और प्रतिरूपण करने वाले उपयोगकर्ता को इसे एक्सेस करने की अनुमति देने के लिए अनुमतियां सेट कर सकते हैं, या " वैश्विक \ "उपसर्ग, लेकिन सत्र आईडी (' प्रक्रिया।GetCurrentProcess() सत्र सत्र ') mutex के नाम पर, जिससे वैश्विक नामस्थान में "प्रति सत्र" म्यूटेक्स बनाते हैं। – Iridium

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