2012-08-24 19 views
9

Iは、コードのこの単純なラインを有しています。このシンプルなコンソールアプリケーションはテスト用にコンパイルされており、私のテストでは次のようなことが分かりました:にFileNotFoundException()は

  • 私自身のWindows 7 PCに接続できます。
  • ネットワーク上の他のWindows XPマシンに接続すると動作します。ネットワーク上の他のWindows 7マシンへの接続
  • はで失敗:

未処理の例外:System.IO.FileNotFoundException:ネットワークパスが見つかりませんでした。 System.DirectoryServices.DirectoryEntry.FillCache(文字列プロパティ名)System.DirectoryServices.DirectoryEntryで でSystem.DirectoryServices.DirectoryEntry.RefreshCacheでSystem.DirectoryServices.Interop.UnsafeNativeMethods.IAds.GetInfoで

() () 。 GetDirectoryEntryProperties.Program.Mainでget_NativeGuid()System.DirectoryServices.DirectoryEntry.get_Guid() におけるDにおける(文字列[]引数):\ GetDirectoryEntryProperties \のProgram.cs:ライン15

任意のアイデア?

私はすべてのマシンの管理者ですが、デバイスロックサービスによって別の問題が発生しましたが、これは尋問にUnauthorizedAccessExceptionを引き起こしましたが、この場合はマシンのGUIDも読み取れません。

イベントログには何も表示されません。

ルーク

+0

私はあなたがこの' WinNTのを変更する必要があると思います。これは暗い推測でのショットです。 – Malachi

+0

私はGetObjectとWinNTプロバイダを使用してVBSスクリプトを作成しました。NETはそれが好きではありません。私はCOMの方法はないが、.NETはすべてのプロパティでRefreshCacheを強制すると思います。私はVBSからそれを強制し、まともなエラーが出現するかどうかを確認するかもしれません。 –

+0

さらにコードを表示できますか?あなたのエラーの最後の行は 'D:\ GetDirectoryEnttryProperties \ Program.cs:line 15'を参照し、' .cs'は 'C#'ファイルのファイル拡張子ですか? – Malachi

答えて

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 
+1

ポストバックに戻ってくれたブライアンに感謝します。私はもうこれ以上は取り組んでいないが、いつかはその地域に戻ってくるかもしれない。 –

+0

ブライアンに感謝、これは私のために働いた。 (Win 10は複数回アップグレードされました)。私は新しいPrincipalContext(ContextType.Machine、Environment.MachineName)で接続をオープンしていましたが、FindAll()を呼び出すとFileNotFoundExceptionが発生しました – tburi

+0

tburiのコメントに基づいて答えがマークされています。 –

0

私はちょうどブライアンローチのおかげで言いたいと思っていました。問題を解決できました。また、C#プロジェクトのBuild to 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 
     { } 
    } 
} 

は次に、関数の正しい場所にレジストリキーをコピーするには:// `のWindows 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); 
     } 
    } 
} 
関連する問題