2012-08-24 19 views
9

Tôi có dòng đơn giản mã này:FileNotFoundException tại System.DirectoryServices.Interop.UnsafeNativeMethods.IAds.GetInfo()

var entry = new DirectoryEntry("WinNT://DOMAIN/MachineName, Computer"); 
Console.WriteLine(entry.Guid); 

Trên thực tế, con đường được cung cấp bởi dòng lệnh. Ứng dụng Console đơn giản này được biên dịch để thử nghiệm và trong các thử nghiệm của tôi, tôi thấy rằng:

  • Kết nối với máy tính Windows 7 của riêng tôi hoạt động.
  • Kết nối với bất kỳ máy Windows XP nào khác trên mạng, hoạt động.
  • Đang kết nối đến bất kỳ Windows 7 máy khác trên mạng không thành công với:

Unhandled Exception: System.IO.FileNotFoundException: Đường dẫn mạng không tìm thấy.

tại System.DirectoryServices.Interop.UnsafeNativeMethods.IAds.GetInfo() tại System.DirectoryServices.DirectoryEntry.RefreshCache() tại System.DirectoryServices.DirectoryEntry.FillCache (String propertyName) tại System.DirectoryServices.DirectoryEntry. get_NativeGuid() tại System.DirectoryServices.DirectoryEntry.get_Guid() tại GetDirectoryEntryProperties.Program.Main (string [] args) trong D: \ GetDirectoryEntryProperties \ Program.cs: dòng 15

Bất kỳ ý tưởng?

Tôi là quản trị viên trên tất cả các máy, tuy nhiên tôi đã gặp phải sự cố khác do dịch vụ Khóa thiết bị gây ra UnauthorizedAccessException khi thẩm vấn, nhưng trong trường hợp này tôi thậm chí không thể đọc Hướng dẫn của máy.

Nhật ký sự kiện không hiển thị gì.

Luke

+0

Tôi nghĩ rằng bạn cần phải thay đổi điều này 'WinNT: // 'cho Windows 7 máy. đây là một phát bắn trong bóng tối Guess. – Malachi

+0

Tôi vừa tạo một kịch bản VBS sử dụng GetObject và nhà cung cấp WinNT và điều đó tốt khi đọc sách hướng dẫn của Guid.Nó không thích. Tôi nghĩ rằng NET lực lượng một RefreshCache trên tất cả các thuộc tính trong khi cách COM không. Tôi có thể ép nó từ VBS và xem có lỗi nào xuất hiện không. –

+0

bạn có thể hiển thị thêm một số mã không? dòng cuối cùng của tham chiếu Lỗi của bạn 'D: \ GetDirectoryEnttryProperties \ Program.cs: dòng 15' và' .cs' là phần mở rộng của tệp cho một tệp 'C#' ??? – Malachi

Trả lời

13

Tôi gặp thông báo lỗi tương tự cho một tình huống khác. Có lẽ giải pháp tôi tìm thấy cũng có thể giúp bạn.

Sau khi nâng cấp lên Windows 10, máy tính của tôi đã xuất hiện lỗi cửa sổ bật lên khi khởi động trông giống như hình bạn đã đăng. Đó là một FileNotFoundException tại System.DirectoryServices.Interop.UnsafeNativeMethods.IAds.GetInfo().

Giải pháp là sao chép hai chuỗi từ vị trí đăng ký này sang vị trí đăng ký khác.

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

Cảm ơn Bryan đã quay lại bài đăng. Tôi không làm việc này nữa nhưng tôi có thể một ngày nào đó sẽ trở lại trong khu vực đó. –

+0

Cảm ơn Bryan, điều này đã làm việc cho tôi. (Giành chiến thắng 10 nâng cấp nhiều lần). Tôi đã mở kết nối với PrincipalContext mới (ContextType.Machine, Environment.MachineName)) và tôi nhận được FileNotFoundException khi gọi FindAll() – tburi

+0

Đánh dấu là câu trả lời dựa trên nhận xét của tburi. –

0

Tôi chỉ muốn cảm ơn Bryan Roach tôi đã có thể giải quyết các vấn đề của mình. Tôi cũng nhận ra rằng tôi có thể thiết lập dự án C# của mình Build to Platform Target x64 và tránh lỗi vì nó sẽ tìm kiếm khu vực đăng ký 64 bit. Tuy nhiên, tôi cảm thấy nó thích hợp hơn cho ứng dụng của tôi là bất kỳ CPU nào và bản thân chương trình có thể khắc phục vấn đề.

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 
     { } 
    } 
} 

Sau đó cho chức năng sao chép khóa registry để địa điểm chính xác:

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); 
     } 
    } 
} 
Các vấn đề liên quan