9

私はこの単純なコード行を持っています:

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

実際には、パスはコマンドラインによって提供されます。このシンプルなコンソールアプリはテスト用にコンパイルされており、私のテストでは次のことがわかりました。

  • 自分のWindows7PCへの接続は機能します。
  • ネットワーク上の他のWindowsXPマシンへの接続は機能します。
  • ネットワーク上の他のWindows7マシンへの接続は、次の場合に失敗します。

未処理の例外:System.IO.FileNotFoundException:ネットワークパスが見つかりませんでした。

System.DirectoryServices.Interop.UnsafeNativeMethods.IAds.GetInfo()at System.DirectoryServices.DirectoryEntry.RefreshCache()at System.DirectoryServices.DirectoryEntry.FillCache(String propertyName)at System.DirectoryServices.DirectoryEntry.get_NativeGuid()at System.DirectoryServices D:\ GetDirectoryEntryProperties \ Program.cs:line15のGetDirectoryEntryProperties.Program.Main(String [] args)にある.DirectoryEntry.get_Guid()

何か案は?

私はすべてのマシンの管理者ですが、デバイスロックサービスが原因UnauthorizedAccessExceptionで問い合わせが発生するという別の問題が発生しましたが、この場合、マシンのGUIDを読み取ることさえできません。

イベントログには何の役にも立ちません。

ルーク

4

2 に答える 2

13

別の状況で同じエラーメッセージが表示されました。おそらく、私が見つけた解決策もあなたを助けることができます。

Windows 10にアップグレードした後、起動時に、投稿したものと同じようなポップアップエラーが発生しました。これは、System.DirectoryServices.Interop.UnsafeNativeMethods.IAds.GetInfo()でのFileNotFoundExceptionでした。

解決策は、2つの文字列を1つのレジストリの場所から別の場所にコピーすることでした。

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

ブライアンローチのおかげで問題を解決できたと言いたかっただけです。また、C#プロジェクトのビルドを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 に答える