C# 使用两个不同的域进行验证

C# 使用两个不同的域进行验证,c#,wpf,validation,security,C#,Wpf,Validation,Security,我目前正在为一个新项目进行验证步骤。除此部分(如下所述)外,所有代码均正常工作。我正在尝试检查是否有一个用户(域1)在域2的组中。我正在尝试的一切都是为用户返回null,我不知道为什么 这是我正在使用的函数 public void runTask(string serverName, string taskName) { PrincipalContext ctx = new PrincipalContext(ContextType.Domain, doma

我目前正在为一个新项目进行验证步骤。除此部分(如下所述)外,所有代码均正常工作。我正在尝试检查是否有一个用户(域1)在域2的组中。我正在尝试的一切都是为用户返回null,我不知道为什么

这是我正在使用的函数

public void runTask(string serverName, string taskName)
        {
            PrincipalContext ctx = new PrincipalContext(ContextType.Domain, domain);
            UserPrincipal user = UserPrincipal.FindByIdentity(ctx, loginWindow.getUsername());
            GroupPrincipal group = GroupPrincipal.FindByIdentity(ctx, ADGroup);


            if (user.IsMemberOf(group))
            {
                using (TaskService tasksrv = new TaskService(serverName, loginWindow.getUsername(), domain, loginWindow.getPassword()))
                {
                    Microsoft.Win32.TaskScheduler.Task task = tasksrv.FindTask(taskName);
                    if (!task.IsActive)
                    {
                        if (task.Enabled == true)
                        {
                            //task.Run();
                        }
                        else
                        {
                            log.LogMessage("Task was disabled. Enabling...");
                            task.Enabled = true;
                            //task.Run();
                        }
                    }
                    else
                    {
                        // send email
                        string body = "User: " + loginWindow.getUsername().ToUpper() + "<br/><br/>" + "Server: " + serverName + "<br/><br/>" + task.Name + " is already running.";

                        // send email confirmation
                        email = new Email(false);
                        email.SendMail(toEmail, fromEmail, serverName + subject, body);

                    }
                }
            }
        }
public void runTask(string serverName,string taskName)
{
PrincipalContext ctx=新PrincipalContext(ContextType.Domain,Domain);
UserPrincipal user=UserPrincipal.FindByIdentity(ctx,loginWindow.getUsername());
GroupPrincipal group=GroupPrincipal.FindByIdentity(ctx,ADGroup);
if(用户IsMemberOf(组))
{
使用(TaskService tasksrv=new TaskService(serverName,loginWindow.getUsername(),domain,loginWindow.getPassword())
{
Microsoft.Win32.TaskScheduler.TaskTask=tasksrv.FindTask(taskName);
如果(!task.IsActive)
{
如果(task.Enabled==true)
{
//task.Run();
}
其他的
{
LogMessage(“任务已禁用。正在启用…”);
task.Enabled=true;
//task.Run();
}
}
其他的
{
//发送电子邮件
string body=“User:”+loginWindow.getUsername().ToUpper()+”

“+”服务器:“+serverName+”

“+task.Name+”已在运行。”; //发送电子邮件确认 电子邮件=新电子邮件(错误); email.SendMail(toEmail、fromEmail、服务器名+主题、正文); } } } }
当我设置domain=用户名存在的位置时,它返回一个值,但找不到ADGroup。当我将其切换到ADGroup的域时,用户为null

loginWindow是一个验证用户凭据的简单类。任务是我正在尝试运行的windows任务

任何想法或建议都会有帮助,因为现在我不知所措


谢谢

从代码上看,您似乎在使用同一个域范围的PrincipalContext对象来查找用户和组,并且由于它们实际上位于不同的域中,因此至少应使用各自的上下文执行每个查找:

        PrincipalContext userCtx = new PrincipalContext(ContextType.Domain, domain1);
        UserPrincipal user = UserPrincipal.FindByIdentity(userCtx, loginWindow.getUsername());

        PrincipalContext groupCtx = new PrincipalContext(ContextType.Domain, domain2);
        GroupPrincipal group = GroupPrincipal.FindByIdentity(groupCtx, ADGroup);

这将为用户提供非空结果。不过,我不确定
user.IsMemberOf(group)
是否有效。Active Directory使用foreignSecurityPrincipal记录来保存跨域组成员资格的记录,并且仅使用组的members属性。用户记录未获得匹配的memberOf记录。有关详细信息,请参阅我的答案。

太好了!我确实尝试过这个,但是我一定是打错了什么,因为它现在起作用了(在提供非空值方面)。如果memberOf不起作用,您认为我应该如何验证用户是否是组的成员?我会首先尝试
IsMemberOf
,就像在您的代码中一样。如果不是这样,我会尝试检查
GroupPrincipal.Members
,甚至
GroupPrincipal.GetMembers(true)
进行递归搜索。如果这些都不起作用,那么在我回答的最后一句话的“here”一词中就有一个链接。