- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我成功地模拟了一个用户帐户,但我无法使用模拟帐户绑定(bind)到 AD 并拉下 DirectoryEntry
。
下面的代码输出:
我的问题似乎类似于:
How to use the System.DirectoryServices namespace in ASP.NET
我正在获取一个主要 token 。我知道我需要使用委托(delegate)才能在远程计算机上使用模拟 token 。我确认该帐户没有选中“帐户是敏感的,不能被委托(delegate)”的标志。我还确认本地组策略和域组策略不会阻止委派:
计算机配置\Windows 设置\安全设置\本地策略\用户权限分配\
我错过了什么?
谢谢!
using System;
using System.DirectoryServices;
using System.Security;
using System.Security.Principal;
using System.Runtime.InteropServices;
using Microsoft.Win32.SafeHandles;
using System.Runtime.ConstrainedExecution;
namespace ADSI_Impersonation
{
class Program
{
[DllImport("advapi32.dll", SetLastError = true, CharSet = CharSet.Unicode)]
public static extern bool LogonUser(String lpszUsername, String lpszDomain, String lpszPassword,
int dwLogonType, int dwLogonProvider, out SafeTokenHandle phToken);
[DllImport("kernel32.dll", CharSet = CharSet.Auto)]
public static extern bool CloseHandle(IntPtr handle);
static void Main(string[] args)
{
const int LOGON32_PROVIDER_DEFAULT = 0;
const int LOGON32_LOGON_INTERACTIVE = 2;
string userName = "admin@domain.com";
string password = "password";
Console.WriteLine("Before impersonation I am: " + WindowsIdentity.GetCurrent().Name);
SafeTokenHandle safeTokenHandle;
try
{
bool returnValue = LogonUser(userName, null, password,
LOGON32_LOGON_INTERACTIVE, LOGON32_PROVIDER_DEFAULT,
out safeTokenHandle);
if (returnValue)
{
WindowsIdentity newId = new WindowsIdentity(safeTokenHandle.DangerousGetHandle());
WindowsImpersonationContext impersonatedUser = newId.Impersonate();
}
else
{
Console.WriteLine("Unable to create impersonatedUser.");
return;
}
}
catch (Exception e)
{
Console.WriteLine("Authentication error.\r\n" + e.Message);
}
Console.WriteLine("After impersonation I am: " + WindowsIdentity.GetCurrent().Name);
string OU = "LDAP://dc=domain,dc=com";
DirectoryEntry entry = new DirectoryEntry(OU);
entry.AuthenticationType = AuthenticationTypes.Secure;
DirectorySearcher mySearcher = new DirectorySearcher();
mySearcher.SearchRoot = entry;
mySearcher.SearchScope = System.DirectoryServices.SearchScope.Subtree;
mySearcher.PropertiesToLoad.Add("cn");
mySearcher.PropertiesToLoad.Add("samaccountname");
string cn = "fistname mi. lastname";
string samaccountname = "";
try
{
// Create the LDAP query and send the request
mySearcher.Filter = "(cn=" + cn + ")";
SearchResultCollection searchresultcollection = mySearcher.FindAll();
DirectoryEntry ADentry = searchresultcollection[0].GetDirectoryEntry();
Console.WriteLine("samaccountname: " + ADentry.Properties["samaccountname"].Value.ToString());
}
catch (Exception e)
{
Console.WriteLine("Error: " + e.Message);
}
Console.WriteLine("samaccountname: " + samaccountname);
Console.ReadLine();
}
}
public sealed class SafeTokenHandle : SafeHandleZeroOrMinusOneIsInvalid
{
private SafeTokenHandle()
: base(true)
{
}
[DllImport("kernel32.dll")]
[ReliabilityContract(Consistency.WillNotCorruptState, Cer.Success)]
[SuppressUnmanagedCodeSecurity]
[return: MarshalAs(UnmanagedType.Bool)]
private static extern bool CloseHandle(IntPtr handle);
protected override bool ReleaseHandle()
{
return CloseHandle(handle);
}
}
}
最佳答案
许多 .NET API 没有考虑您的手动模拟,例如您注意到的 LDAP 查询。因此,您需要改用 DirectoryEntry 的重载构造函数,
关于c# - 模拟和 DirectoryEntry,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8957886/
我将用户的 SID 设为 byte[]在 windowsPrincipal.getIdentity().getSid() 内. 如何从 SID 获取 Active Directory 条目 (Dire
当我尝试从事件目录中检索“AccountExpirationDate”时遇到一个奇怪的问题。 我使用以下代码检索用户: DirectoryEntry dirEntry = new Di
我有一个DirectoryEntry代表用户的对象。来自DirectoryEntry.Properties集合,我正在检索 "manager"属性,这将为我提供用户经理的专有名称(“DN”)值。 我可
我的目标是从远程服务器获取网站名称列表。但我得到了异常(exception): The RPC server is unavailable. 代码如下: public List GetWebS
在代码中,我使用此代码将计算机帐户移动到另一个事件目录 OU 中。 DirectoryEntry eLocation = new DirectoryEntry("LDAP://" + DevicePa
您好,我有一个运行的 exe,它在我登录的域帐户的上下文中运行。该代码仅查询特定 OU 下用户的事件目录。我从加入林的机器上运行此代码:CompanyNameDomain.NET。 现在安全团队要求我
我正在尝试使用 DirectoryEntry 获取对 AD 的访问权限。我们有一个“OU=Company Users”,然后是“OU=Applications”。我的个人用户帐户在 Company U
我成功地模拟了一个用户帐户,但我无法使用模拟帐户绑定(bind)到 AD 并拉下 DirectoryEntry。 下面的代码输出: 在模拟之前我是:DOMAIN\user 模拟后我是:DOMAIN\a
我想知道用户帐户是否启用。我使用这段代码: var usersList = new List(); DirectoryEntry localMachine = new DirectoryEnt
在您将此问题作为重复问题彻底关闭之前,值得注意的是答案无效。 到目前为止,这是我尝试过的: 第一次尝试是在记录上使用 .InvokeSet: adUser.InvokeSet("department"
我正在使用这种在当前域中查找用户的简单方法,它适用于“存在”的所有用户,但我找不到任何方法来确定该用户是否不存在。 string userLDAP = @"MYDOMAIN/username"; st
我有以下代码从用户的 SID 加载用户的 Active Directory DirectoryEntry 对象: public static DirectoryEntry GetUserDirecto
今天发现一件奇怪的事。我正在从事的项目中有一些这样的代码: var directoryEntry =new DirectoryEntry( ConfigurationManager.AppSe
我有一个控制台应用程序,它列出了 IIS 中的网站绑定(bind) using (var directoryEntry = new DirectoryEntry("IIS://localhost/w3
我有一个现有的 DirectoryEntry 连接,我想检查用于创建此 DirectoryEntry 的用户是否属于特定组。任何人都知道如何实现这一点? 谢谢,舒奇 最佳答案 我不认为有任何神奇、简单
谁能解释一下使用 LdapConnection/SearchRequest 和 DirectoryEntry/DirectorySearcher 在 ActiveDirectory 中搜索用户之间的区
我正在尝试创建 DirectoryEntry 的实例,以便我可以使用它来测试一些将传递给 DirectoryEntry 的代码。然而,尽管进行了很多尝试,我还是找不到一种方法来实例化 DE 并初始化它
你好, 我有以下代码从当前 AD 创建树: public static ActiveDirectory GetActiveDirectoryTree(string pathToAD = "") {
我只需要用户所属组的 commonName。 DirectoryEntry user = new DirectoryEntry("LDAP://cn=myuser...."); foreach(str
我正在登录页面工作,逻辑就像 -> try { DirectoryEntry LDAPLogin = new DirectoryEntry(ConfigurationSettings.AppS
我是一名优秀的程序员,十分优秀!