Поскольку ваш компьютер вообще не присоединен к домену, мы не можем использовать WindowsIdentity или WindowsPrincipal, а затем проверять его метод IsInRole ().Метод IsInRole () работает только в том случае, если ваш компьютер присоединен к домену и использует учетную запись компьютера домена для выполнения S4USelf.
Вы также не можете использовать подход LogonUser, поскольку ваш компьютер не позволяет создавать сеанс входа в систему.из недоверенного леса.
Я думаю, что мы можем только запросить Active Directory напрямую, чтобы получить необходимую нам информацию.Насколько я могу судить, код в размещенной вами Microsoft KB не очень хорошо работает.Он пытается сделать запрос из атрибута memberOf.Информация о группе не всегда доступна из атрибутов memberOf.
Я только что написал функцию IsInRole (), используя AccountManagement.Я думаю, это то, что вы хотите.Функция IsInRole () вызовет рекурсивную функцию IsInGroup (), чтобы выяснить все группы, к которым принадлежит пользователь.
private bool IsInRole(string domain, string username, string password, string role)
{
using (var context = new PrincipalContext(ContextType.Domain, domain, username, password))
{
GroupPrincipal group = GroupPrincipal.FindByIdentity(context, IdentityType.SamAccountName, role);
UserPrincipal user = UserPrincipal.FindByIdentity(context, IdentityType.SamAccountName, username);
return IsInGroup(user, group);
}
}
private bool IsInGroup(Principal principal, GroupPrincipal group )
{
if (principal.IsMemberOf(group))
return true;
foreach (var g in principal.GetGroups())
{
if (IsInGroup(g, group))
return true;
}
return false;
}
Чтобы использовать эту функцию IsInRole (), вам необходимо указать имя домена и доменполномочия.Если имя пользователя и пароль введены неверно, вы получите исключение.
Для использования API AccountManagement необходим .NET 3.5 SP1.Также вы можете обратить внимание на это исправление .В AccountManagement API были обнаружены некоторые ошибки при работе в какой-либо среде.Возможно, вам придется применить исправление.