2012-08-24 14 views
9

मैं कोड के इस सरल रेखा है। यह सरल कंसोल ऐप परीक्षण के लिए संकलित किया गया है और मेरे परीक्षणों में मुझे लगता है कि:FileNotFoundException()

  • अपने विंडोज 7 पीसी कार्यों से कनेक्ट करना।
  • नेटवर्क पर किसी भी अन्य विंडोज एक्सपी मशीन से कनेक्ट, काम करता है।
  • नेटवर्क की किसी दूसरी विंडोज 7 मशीनों से कनेक्ट के साथ विफल:

बिना क्रिया के अपवाद: System.IO.FileNotFoundException: नेटवर्क पथ नहीं मिला था।

System.DirectoryServices.Interop.UnsafeNativeMethods.IAds.GetInfo पर

() System.DirectoryServices.DirectoryEntry.RefreshCache() System.DirectoryServices.DirectoryEntry.FillCache पर (स्ट्रिंग प्रॉपर्टी) System.DirectoryServices.DirectoryEntry पर पर। get_NativeGuid() System.DirectoryServices.DirectoryEntry.get_Guid() पर GetDirectoryEntryProperties.Program.Main पर डी में (String [] args): \ GetDirectoryEntryProperties \ Program.cs: लाइन 15

कोई भी विचार?

मैं सभी मशीनों पर एक प्रशासक हूं, हालांकि मेरे पास डिवाइस लॉक सेवा के कारण एक और समस्या आई है, जिसने पूछताछ पर UnauthorizedAccessException का कारण बनाया, लेकिन इस मामले में मैं मशीन के ग्रिड को भी पढ़ नहीं सकता।

इवेंट लॉग उपयोग के कुछ भी नहीं दिखा रहा है।

ल्यूक

+0

मैं आप इस' WinNT बदलने की जरूरत है लगता है। यह अंधेरे अनुमान में एक शॉट है। – Malachi

+0

मैंने अभी GetObject और WinNT प्रदाता का उपयोग करके एक वीबीएस स्क्रिप्ट बनाई है और यह ठीक है कि GUID को कुछ ठीक है।नेट यह पसंद नहीं करता है। मुझे लगता है कि .NET सभी गुणों पर एक RefreshCache को मजबूर करता है जबकि COM तरीका नहीं करता है। मैं इसे वीबीएस से मजबूर कर सकता हूं और देख सकता हूं कि कोई सभ्य त्रुटियां उभरती हैं या नहीं। –

+0

क्या आप कुछ और कोड दिखा सकते हैं? आपकी त्रुटि संदर्भों की अंतिम पंक्ति 'D: \ GetDirectoryEnttryProperties \ Program.cs: पंक्ति 15' और' .cs' एक 'सी #' फ़ाइल के लिए फ़ाइल एक्सटेंशन है ??? – Malachi

उत्तर

13

मैं एक अलग स्थिति के लिए एक ही त्रुटि संदेश में आया। शायद मैंने जो समाधान पाया वह आपकी भी मदद कर सकता है।

विंडोज 10 में अपग्रेड करने के बाद, मेरे कंप्यूटर ने आपके द्वारा पोस्ट किए गए की तरह दिखने पर पॉपअप त्रुटि दी। यह System.DirectoryServices.Interop.UnsafeNativeMethods.IAds.GetInfo() पर एक FileNotFoundException था।

समाधान दो स्ट्रिंग्स को एक रजिस्ट्री स्थान से दूसरे में कॉपी करना था।

Copy these strings: RegisteredOwner and RegisteredOrganization 

From: HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion 

To: HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Microsoft\Windows NT\CurrentVersion 
+1

धन्यवाद ब्रायन पोस्ट पर वापस आने के लिए। मैं अब इस पर काम नहीं कर रहा हूं लेकिन मैं उस क्षेत्र में कुछ दिन वापस आ सकता हूं। –

+0

धन्यवाद ब्रायन, यह मेरे लिए काम किया। (विन 10 कई बार अपग्रेड किया गया)। मैं नए प्रिंसिपल कॉन्टेक्स्ट (ContextType.Machine, Environment.MachineName) के साथ कनेक्शन खोल रहा था) और मुझे FindNll() – tburi

+0

पर कॉल करते समय FileNotFoundException मिला जब tburi की टिप्पणी के आधार पर उत्तर के रूप में चिह्नित किया गया। –

0

मैं सिर्फ ब्रायन रोच के लिए धन्यवाद कहना चाहता था कि मैं अपने मुद्दों को हल करने में सक्षम था। मुझे यह भी एहसास है कि मैं अपने सी # प्रोजेक्ट को प्लेटफार्म लक्ष्य x64 पर सेट कर सकता हूं और त्रुटि से बच सकता हूं क्योंकि यह 64 बिट रजिस्ट्री क्षेत्र को खोजेगा। हालांकि, मुझे लगता है कि यह मेरे आवेदन के लिए कोई भी सीपीयू और प्रोग्राम स्वयं ही इस मुद्दे को ठीक करने में सक्षम है।

string ServerName = "REMOTE_COMPUTER"; 
PrincipalSearcher pSearch = new PrincipalSearcher(); 
pSearch.QueryFilter = new UserPrincipal(new PrincipalContext(ContextType.Machine, ServerName, null, ContextOptions.Negotiate)); 

try 
{ 
    foreach (UserPrincipal userUP in pSearch.FindAll()) 
    { 
     //Missing Registry Keys will error on pSearch.FindAll(); 
     //Either Build > Platform Target == x64 or deal with it. 
    } 
} 
catch(FileNotFoundException ex) 
{ 
    if(ex.Source.Equals("Active Directory") && 
     ex.TargetSite.MemberType.ToString().Equals("Method") && 
     ex.TargetSite.Name.Equals("GetInfo")) 
    { 
     //It's possible the registry keys haven't been moved to x86 location on a 64 bit machine: 
     //From: HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion (64 bit) 
     //To: HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Microsoft\Windows NT\CurrentVersion (32 bit compatability area) 
     //String Properties need to be present: RegisteredOwner, RegisteredOrganization 
     try 
     { 
      Hack_Fixx64RegistryForGettingLocalAccounts(ServerName); 
      //Recall function or whatever to try again with fixed registry. 
     } 
     catch 
     { } 
    } 
} 

तब समारोह सही जगह पर रजिस्ट्री कुंजियों को कॉपी करने के लिए के लिए: विंडोज 7 मशीन के लिए // `:

private void Hack_Fixx64RegistryForGettingLocalAccounts(string ServerName) 
{ 
    RegistryKey remoteKey = RegistryKey.OpenRemoteBaseKey(RegistryHive.LocalMachine, ServerName, RegistryView.Registry64); 
    if(remoteKey != null) 
    { 
     //Get keys stored on 64 bit location 
     RegistryKey x64regkey = remoteKey.OpenSubKey(@"SOFTWARE\Microsoft\Windows NT\CurrentVersion"); 
     string regOwner = Convert.ToString(x64regkey.GetValue("RegisteredOwner", "")); 
     string regOrganization = Convert.ToString(x64regkey.GetValue("RegisteredOrganization", "")); 
     //Add missing keys on 64 bit OS in correct location for 32 bit registry area. The Wow6432Node is for 32-bit apps that run on 64-bit window versions. 
     remoteKey = RegistryKey.OpenRemoteBaseKey(RegistryHive.LocalMachine, ServerName, RegistryView.Registry32); 
     if(remoteKey != null) 
     { 
      RegistryKey x86regkey = remoteKey.OpenSubKey(@"SOFTWARE\Microsoft\Windows NT\CurrentVersion", true); 
      x86regkey.SetValue("RegisteredOwner", regOwner); 
      x86regkey.SetValue("RegisteredOrganization", regOrganization); 
     } 
    } 
} 
संबंधित मुद्दे