public static string[] GetRoles(System.Security.Principal.WindowsPrincipal principal)
{
string[] roles = (string[])CallPrivateMethod(principal.Identity, "GetRoles");
return roles;
}
private static object CallPrivateMethod(object o, string methodName)
{
Type t = o.GetType();
MethodInfo mi = t.GetMethod(methodName, BindingFlags.NonPublic | BindingFlags.Instance);
if (mi == null)
{
throw new ReflectionTypeLoadException(null,null,String.Format("{0}.{1} метод не найден. Реализация среды была изменена",t.FullName,methodName));
}
return mi.Invoke(o, null);
}
список групп домена, в которых состоит пользователь
Я получаю программно список всех пользователей домена и их SID-ы. Теперь хотелось бы рассортировать этих пользователей по группам в которых они состоят. Узнал, что раньше это можно было сделать с помощью механизма "отражения" internal-метода GetRoles() класса WindowsIdentity. У меня MS VS.NET 2010 и по-ходу этого метода там уже нет. Делал так:
Код:
Не работает, генерит исключение. Может у кого-то есть идеи как по другому это сделать.
WindowsIdentity.Groups. Или я неправильно понял, что вам нужно?
Дык есть же свойство
У меня есть имена и сиды всех пользователей домена и названия групп и их сиды. И вот не могу понять как их сопоставить (какой пользователь в какой группе состоит)
http://sources.codenet.ru/download/3793/UserGroups.html
это может помочь. только немного придется покопаться со скриптами на VBS и затем уже его портировать на дотнет как в примере
еще можно пойти наоборот для группы вывести список пользователей. расскажу как это сделать другим способом, может он понравится.
работаем через OLEDB
вот некоторые поля для запросов: userAccountControl, objectSid, createTimestamp, CN, sAMAccountName
это может помочь. только немного придется покопаться со скриптами на VBS и затем уже его портировать на дотнет как в примере
еще можно пойти наоборот для группы вывести список пользователей. расскажу как это сделать другим способом, может он понравится.
работаем через OLEDB
Код:
using (var connection = new OleDbConnection("Provider=ADsDSOObject"))
{
connection.Open();
using (var command = new OleDbCommand("SELECT sAMAccountName FROM 'LDAP://OU=Users,OU=Units,DC=msk,DC=corp,DC=ru' WHERE memberOf='CN=My User Group,OU=Groups,OU=Units,DC=msk,DC=corp,DC=ru'", connection))
using (var reader = command.ExecuteReader())
{
while (reader.Read())
Console.WriteLine(reader["sAMAccountName"]);
}
}
{
connection.Open();
using (var command = new OleDbCommand("SELECT sAMAccountName FROM 'LDAP://OU=Users,OU=Units,DC=msk,DC=corp,DC=ru' WHERE memberOf='CN=My User Group,OU=Groups,OU=Units,DC=msk,DC=corp,DC=ru'", connection))
using (var reader = command.ExecuteReader())
{
while (reader.Read())
Console.WriteLine(reader["sAMAccountName"]);
}
}
вот некоторые поля для запросов: userAccountControl, objectSid, createTimestamp, CN, sAMAccountName
Вот идея про "наоборот" как раз то что нужно. Мне же без разницы сопоставлять пользователей группам или наоборот
Цитата: bagie2
работаем через OLEDB
В принципе можно и напрямую LDAP законнектить.
Цитата: hardcase
В принципе можно и напрямую LDAP законнектить.
Да, я не знал, спасибо.