我在使用System.DirectoryServices
时遇到了从Active Directory获取组的问题。
最初,我在一个注册在域上的计算机上启动了我的应用程序,但由于它是一个活动域,我不想对AD进行任何写操作,因此我在一台Windows XP主机操作系统上安装了Windows Server 2003虚拟机。
我在机器上添加了另一个以太网端口并设置了交换机,其中1个以太网端口专用于虚拟机,另一个端口用于主机。
在配置IP地址以进行通信后,我将我的应用程序转移到主机机器上并启动它,但是我遇到了一个DirectoryServicesCOMException
异常。
错误信息显示用户名和密码无效:( 为了检查是否是Active Directory的问题,我创建了第三个虚拟机并安装了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);
System.DirectoryServices
命名空间中的DirectoryEntry
和DirectorySearcher
类进行传统的方法吗?这只是建议,我对Principal对象并不了解。 - Will Marcouillerstart \\server1
来获取凭据对话框并能够进行身份验证。这在网络中的计算机上100%有效。 - RobertPitt