私はちょうどブライアンローチのおかげで言いたいと思っていました。問題を解決できました。また、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);
}
}
}
私はあなたがこの' WinNTのを変更する必要があると思います。これは暗い推測でのショットです。 – Malachi
私はGetObjectとWinNTプロバイダを使用してVBSスクリプトを作成しました。NETはそれが好きではありません。私はCOMの方法はないが、.NETはすべてのプロパティでRefreshCacheを強制すると思います。私はVBSからそれを強制し、まともなエラーが出現するかどうかを確認するかもしれません。 –
さらにコードを表示できますか?あなたのエラーの最後の行は 'D:\ GetDirectoryEnttryProperties \ Program.cs:line 15'を参照し、' .cs'は 'C#'ファイルのファイル拡張子ですか? – Malachi