我目前正在为新项目进行验证。除了这部分之外,所有代码都在工作(如下所述)。我试图检查用户(domain1)是否在domain2组中。我正在尝试的一切都是为用户返回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);
}
}
}
}
当我设置domain =存在用户名时,它返回一个值,但找不到ADGroup。当我将其切换到ADGroup的域时,用户为空。
loginWindow是一个验证用户凭据的简单类。任务是我正在尝试运行的Windows任务。
任何想法或提示都会有所帮助,因为现在我不知所措。
谢谢!
答案 0 :(得分:1)
好吧,从代码中看起来您使用相同的域范围 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 记录来保留跨域组成员身份的记录,并且仅使用该组的成员属性。用户记录未获得匹配的 memberOf 记录。有关详细信息,请参阅我的回答here。