Active Directory ユーザー アカウントへの読み取りおよび書き込みアクセスを許可する C# Web アプリケーションに取り組んでいます。
私はこれを私たちの主要な会社の AD でうまく機能させています。アカウントの読み取り、属性の取得、AD への詳細の保存、アカウントの有効化/無効化などを行うことができます。これを行うために偽装を使用しているため、AD に保存する直前に変更されます別のアカウント (Domain Admins に属する) を使用するように変更し、保存後にメインのアプリ プール アカウントに戻します。
アプリを介してユーザー アカウントを追加する必要がありましたが、メインの AD でこれをテストすることに満足していないため、テスト AD を使用して VM をセットアップしました。その VM でアプリをセットアップしましたが、AD から正常に読み取ります。ライブ AD で偽装するのと同じユーザー アカウントをセットアップし、それをドメイン管理者グループに追加しました。ただし、詳細を既存のユーザーに保存しようとすると、「アクセスが拒否されました」というエラーが表示されます。
保存する直前に結果を出力したため、なりすましが機能していることはわかっています。パスワードを変更しようとすると、別のエラーで失敗しました。
ネットワーク管理者に、ライブ AD の偽装ユーザーに何か特別な設定を行っているかどうか尋ねましたが、彼はそうではないと言い、それらは同一のようです。
偽装ユーザーをドメイン管理者グループに追加する以外に、他に何かする必要があることを知っている人はいますか? ユーザーとして VM にログインしようとしましたが、AD 自体を介してユーザー アカウントを変更したため、ユーザーは必要なレベルのアクセス権を持っているようです。
以下は、ユーザーになりすますために使用しているコードです。
Impersonation imp = new Impersonation();
string impResult = "";
imp.ImpersonateDomainUser(out impResult, ConfigurationManager.AppSettings["ADAdminUserLogin"], user.Domain, ConfigurationManager.AppSettings["ADAdminUserPwd"]);
...
imp.Revert();
impResult
以下を返します。
Before impersonation: NT AUTHORITY\SYSTEM
After impersonation: TESTDOMAIN\user.manager.service
ADに保存するために使用しているコードは次のとおりです。
var entry = new DirectoryEntry();
var account = userName.Replace(domain, "");
var search = new DirectorySearcher(entry) { Filter = "(SAMAccountName=" + account + ")" };
search.PropertiesToLoad.Add(propertyName);
var result = search.FindOne();
if (result != null)
{
DirectoryEntry entryToUpdate = result.GetDirectoryEntry();
if (propertyValue == null || propertyValue.ToString().Length == 0)
entryToUpdate.Properties[propertyName].Clear();
else
entryToUpdate.Properties[propertyName].Value = propertyValue;
entryToUpdate.CommitChanges();
entryToUpdate.Close();
entryToUpdate.Dispose();
}
アドバイスをいただければ幸いです。