Pertanyaan FileNotFoundException di System.DirectoryServices.Interop.UnsafeNativeMethods.IAds.GetInfo ()


Saya memiliki baris kode sederhana ini:

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

Pada kenyataannya, jalur tersebut disediakan oleh baris perintah. Aplikasi Konsol sederhana ini dikompilasi untuk pengujian dan dalam pengujian saya, saya menemukan bahwa:

  • Menghubungkan ke PC Windows 7 saya sendiri bekerja.
  • Menghubungkan ke mesin Windows XP lainnya di jaringan, berfungsi.
  • Menghubungkan ke mesin Windows 7 lainnya di jaringan gagal dengan:

Pengecualian Tidak Tertangani: System.IO.FileNotFoundException: Jalur jaringan tidak ditemukan.

di System.DirectoryServices.Interop.UnsafeNativeMethods.IAds.GetInfo ()     di System.DirectoryServices.DirectoryEntry.RefreshCache ()     di System.DirectoryServices.DirectoryEntry.FillCache (String propertyName)     di System.DirectoryServices.DirectoryEntry.get_NativeGuid ()     di System.DirectoryServices.DirectoryEntry.get_Guid ()     di GetDirectoryEntryProperties.Program.Main (String [] args) di D: \ GetDirectoryEntryProperties \ Program.cs: baris 15

Ada ide?

Saya seorang administrator pada semua mesin, namun saya memiliki masalah lain yang disebabkan oleh layanan Device Lock yang menyebabkan UnauthorizedAccessException pada interogasi, tetapi dalam kasus ini saya bahkan tidak bisa membaca Panduan mesin.

Log Kejadian menunjukkan tidak ada gunanya.

Luke


9
2017-08-24 17:01


asal


Jawaban:


Saya menemukan pesan kesalahan yang sama untuk situasi yang berbeda. Mungkin solusi yang saya temukan dapat membantu Anda juga.

Setelah meng-upgrade ke Windows 10, komputer saya memberikan kesalahan popup ketika boot yang tampak seperti yang Anda posting. Itu adalah FileNotFoundException di System.DirectoryServices.Interop.UnsafeNativeMethods.IAds.GetInfo ().

Solusinya adalah menyalin dua string dari satu lokasi registri ke yang lain.

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

13
2018-02-11 20:08



Saya hanya ingin mengucapkan terima kasih kepada Bryan Roach saya bisa menyelesaikan masalah saya. Saya juga menyadari bahwa saya dapat mengatur proyek C # Build to Platform Target x64 dan menghindari kesalahan karena akan mencari area registri 64 bit. Namun, saya merasa itu lebih tepat untuk aplikasi saya menjadi CPU Apapun dan program itu sendiri mampu memperbaiki masalah.

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

Kemudian untuk fungsi menyalin kunci registri ke tempat yang benar:

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);
        }
    }
}

0
2018-05-09 14:21