使用C#从Active Directory获取组
我遇到问题通过System.DirectoryServices
从Active Directory中获取组
最初我在一台在域上注册的计算机上启动了我的应用程序,但由于它是一个活动域,我不想对AD进行任何写操作,因此我使用Windows XP作为主机操作系统,并在虚拟机上安装了Windows Server 2003。
我在机器上添加了另一个以太网端口并设置了一个交换机,1个以太网端口专用于虚拟机,另一个端口用于主机。
在配置IP地址以使它们通信之后,我将应用程序传输到主机上并解雇了它,但是我得到了一个DirectoryServicesCOMException
。
随着消息,用户名和密码无效:(只是为了检查它不是活动目录,我创建了第三个虚拟机并安装了Windows XP,我使用在APP中测试的凭据添加到了域中, 。
所以我认为这一定是因为运行该应用程序的机器不是该域的一部分。
下面是导致问题的代码块:
public CredentialValidation(String Domain, String Username, String Password, Boolean Secure)
{
//Validate the Domain!
try
{
PrincipalContext Context = new PrincipalContext(ContextType.Domain, Domain); //Throws Exception
_IsValidDomain = true;
//Test the user login
_IsValidLogin = Context.ValidateCredentials(Username, Password);
//Check the Group Admin is within this user
//******HERE
var Results = UserPrincipal.FindByIdentity(Context, Username).GetGroups(Context);
foreach(Principal Result in Results)
{
if (Result.SamAccountName == "Domain Admins")
{
_IsAdminGroup = true;
break;
}
}
Results.Dispose();
Context.Dispose();
}
catch (PrincipalServerDownException)
{
_IsValidDomain = false;
}
}
登录对话框中的信息是这样输入的:
Domain: test.internal
Username: testaccount
Password: Password01
希望有人能够澄清这个错误。
更新:
在检查服务器上的安全日志后,我可以看到我的登录尝试成功了,但是这取决于:
_IsValidLogin = Context.ValidateCredentials(Username, Password);
在检查组的地方后面的行导致错误,所以主要的问题是下面的代码行不能从没有加入到网络的机器上正常工作:
var Results = UserPrincipal.FindByIdentity(Context, Username).GetGroups(Context);
根据你的代码片段,当你尝试创建PrincipalContext时,你失败了,然后调用ValidateCredentials。 那时,运行你的代码的线程仍然工作在本地身份(如果你在一个web进程中)或你在你的机器上签名的身份(对于Windows进程)。 这两者中的任何一个都不会存在于test.internal域中。
您可能想要尝试在构造函数中包含用户名和密码的PrincipalContext的重载。 请参阅http://msdn.microsoft.com/en-us/library/bb341016.aspx
我曾经通过C#.NET进行了很多用户管理。 我只是挖出了一些可以尝试的方法。
以下两种方法将获得给定SAM帐户名称的DirectoryEntry对象。 它需要一个DirectoryEntry,它是要开始搜索帐户的OU的根目录。
另一个会给你一个用户所属组的可分辨名称列表。 然后,您可以使用这些DN来搜索AD并获取DirectoryEntry对象。
public List<string> GetMemberOf(DirectoryEntry de)
{
List<string> memberof = new List<string>();
foreach (object oMember in de.Properties["memberOf"])
{
memberof.Add(oMember.ToString());
}
return memberof;
}
public DirectoryEntry GetObjectBySAM(string sam, DirectoryEntry root)
{
using (DirectorySearcher searcher = new DirectorySearcher(root, string.Format("(sAMAccountName={0})", sam)))
{
SearchResult sr = searcher.FindOne();
if (!(sr == null)) return sr.GetDirectoryEntry();
else
return null;
}
}
链接地址: http://www.djcxy.com/p/49087.html
上一篇: Get groups from Active Directory using C#
下一篇: How to tell CPAN (Perl) about packages created with meta