7

我们刚刚为我们的用户提供了一个新的用户创建应用程序。然而,这些用户需要能够通过应用程序创建用户,即使他们自己没有创建用户的权限。

在 C# 中,您如何模拟另一个用户才能拥有此功能。此应用程序主要使用System.DirectoryServices.

代码片段:

DirectoryEntry dEntry = new DirectoryEntry("LDAP://OU=");
DirectorySearcher dSearcher = new DirectorySearcher(dEntry);
//filter just user objects
dSearcher.SearchScope = SearchScope.Subtree;
dSearcher.Filter = "(&(objectClass=user)(mail=" + excel_Holding_Table.Rows[i]["EmailAddress"].ToString() + "))";
dSearcher.PageSize = 1000;
sResults = dSearcher.FindAll();
4

4 回答 4

10

您可以DirectoryEntry直接使用该类并指定用户名和密码:

DirectoryEntry de = new DirectoryEntry(path);

de.Username = "username";
de.Password = "password";

并从 de 对象访问 Active Directory。或者您可以使用WindowsIdentity该类并模拟用户:

WindowsIdentity newId = new WindowsIdentity(safeTokenHandle.DangerousGetHandle());
WindowsImpersonationContext impersonatedUser = newId.Impersonate();

完整的代码示例可在以下位置获得:

模拟和目录条目

于 2012-05-24T17:50:25.660 回答
0

使用带有用户名、密码和 authenticationType 参数DirectoryEntry构造函数

顺便说一句,DirectoryEntry DirectorySearcherandSearchResultCollection类型是IDisposable- 您需要处理它们,可能带有using语句。

于 2012-05-24T17:51:25.617 回答
0

使用接受用户名和密码而不是模拟的 DirectoryEntry 构造函数(字符串、字符串、字符串、AuthenticationTypes)。

DirectoryEntry directoryEntry = new DirectoryEntry("IIS://" + serverName + "/W3SVC/1/Root", @"domain\username", "password", AuthenticationTypes.Secure | AuthenticationTypes.Sealing); 

参考

于 2012-05-24T17:52:20.760 回答
0

正如其他答案所建议的那样,您可以使用特权凭据连接到 AD 或模拟特权用户。

但这具有安全隐患,因为这意味着您的用户将能够将这些特权凭据用于其他未经授权的目的。

更安全的解决方案是创建一个在具有适当 AD 权限的服务帐户下运行的 Web 服务。用户可以使用 Windows 身份验证对 Web 服务进行身份验证,并且 Web 服务将代表他们创建用户。它可以使用授权来限制允许用户做什么(例如只在他们自己的部门创建用户)。

于 2017-01-21T12:19:17.247 回答