我在C#中有一个应用程序,我试图通过冒充其他用户来更新AD。
我正在阅读广告,以便让用户更新非关键字段,例如任何AD帐户的电话号码。为此,我们创建了一个具有更新任何AD条目权限的新用户。我通过以他身份登录我的计算机并以他身份启动程序来验证用户的权限,我可以更新任何用户的条目。
我使用Uwe Keim's Impersonator class并且模仿似乎成功发生,即没有例外。
然而,测试显示我实际上仍然使用我自己的登录用户更新AD,尽管模仿。我可以很好地更新我自己的AD条目,但既不是模拟用户也不是任何其他AD条目。所以似乎根本没有发生模仿?
我试图通过使用错误的凭据来验证Impersonator实际上是否尝试做任何事情,并收到了相应的错误消息。因此,用户凭据是正确的,并且实际上是根据AD进行检查的。
这是我的相关代码,不相关或敏感的部分被[...]涂黑:
private void SaveToAD()
{
try
{
[...]
using (new Impersonator(@"<user>", @"<domain>", @"<password>"))
{
foreach ([...])
{
DirectoryEntry entry = [...];
entry.Properties[...].Value = [...];
entry.CommitChanges();
}
}
[...]
}
catch (UnauthorizedAccessException ex)
{
// Handling
}
catch (Win32Exception ex)
{
// Handling
}
finally
{
Cursor = Cursors.Arrow;
}
}
任何人都可以告诉我出了什么问题或者指出了我的方向吗?
答案 0 :(得分:2)
为什么不直接使用DirectoryEntry构造函数来建立您想要模拟的用户的ADSI连接(假设您有自己的凭据)。
e.g。
using (var dirRoot = new DirectoryEntry("LDAP://cn=user object, dc=domain, dc=com", @"<domain>\<user>", "<password>"))
{
dirRoot.Properties["l"].Value = "yada";
dirRoot.CommitChanges();
}