9

我有这行简单的代码:

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

实际上,路径是由命令行提供的。这个简单的控制台应用程序是为测试而编译的,在我的测试中我发现:

  • 连接到我自己的 Windows 7 PC 可以工作。
  • 连接到网络上的任何其他 Windows XP 机器都可以。
  • 连接到网络上的任何其他 Windows 7 计算机失败,并显示:

未处理的异常:System.IO.FileNotFoundException:找不到网络路径。

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

有任何想法吗?

我是所有机器的管理员,但是我确实遇到了另一个由设备锁定服务引起的问题,它导致了UnauthorizedAccessException询问,但在这种情况下,我什至无法读取机器的 Guid。

事件日志显示没有任何用处。

卢克

4

2 回答 2

13

对于不同的情况,我遇到了相同的错误消息。也许我找到的解决方案也可以帮助你。

升级到 Windows 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
于 2016-02-11T20:08:12.410 回答
0

我只想感谢 Bryan Roach,我能够解决我的问题。我还意识到我可以将我的 C# 项目 Build 设置为 Platform Target x64 并避免错误,因为它会搜索 64 位注册表区域。但是,我觉得任何 CPU 和能够解决问题的程序本身更适合我的应用程序。

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

然后对于将注册表项复制到正确位置的功能:

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);
        }
    }
}
于 2017-05-09T14:21:58.360 回答