0

我在 C# 中有一个应用程序,我试图通过模拟另一个用户来更新 AD。

我正在阅读 AD,以便让用户更新非关键字段,例如任何 AD 帐户的电话号码。为此,我们创建了一个具有更新任何 AD 条目权限的新用户。我通过以他的身份登录我的机器并以他的身份启动程序来验证用户的权限,我可以更新任何用户的条目。

我正在使用Uwe Keim 的 Impersonator 类,并且模拟似乎成功发生,即没有例外。

但是,测试表明我实际上仍在使用我自己的登录用户来更新 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;
    }
}

谁能告诉我出了什么问题或指出我的方向?

4

1 回答 1

2

为什么不直接使用 DirectoryEntry 构造函数作为您要模拟的用户建立您的 ADSI 连接(假设您有他们的凭据)。

例如

        using (var dirRoot = new DirectoryEntry("LDAP://cn=user object, dc=domain, dc=com", @"<domain>\<user>", "<password>"))
        {
            dirRoot.Properties["l"].Value = "yada";
            dirRoot.CommitChanges();
        }
于 2013-05-06T06:49:03.203 回答