Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Общие вопросы по .NET и C# > Является ли юзер админом на указанном сервере


Автор: mihryak 29.4.2010, 15:45
Как проверить, что доменный пользователь (член Domain Users) является администратором на произвольном сервере?
Пока не получается придумать ничего лучше этого:
Код

            using (PrincipalContext context = new PrincipalContext(ContextType.Machine, server))
            {
                var groupPrincipal = GroupPrincipal.FindByIdentity(context, "BUILTIN\\Administrators");
                return groupPrincipal.GetMembers(true).Any(p => p.ContextType == ContextType.Domain &&
                    StringComparer.InvariantCultureIgnoreCase.Equals(p.Name, user));
            }

Работает долго, крайне смущает рекурсивность (в больших сетях тормозить будет безбожно).
Может есть иной способ?
Очень бы хотелось приспособить WindowsPrincipal.IsInRole(WindowsBuiltInRole.Administrator), но ему не задать контекст, в котором будет происходить проверка.

Автор: jonie 29.4.2010, 15:53
а нельзя разве
Код

        [DllImport("advapi32.dll", SetLastError = true, CharSet = CharSet.Unicode)]
        public static extern bool LogonUser(String lpszUsername, String lpszDomain, String lpszPassword,
            int dwLogonType, int dwLogonProvider, ref IntPtr phToken);
....
            IntPtr tokenHandle = new IntPtr(0);
            int LOGON32_LOGON_INTERACTIVE = 2;
            int LOGON32_PROVIDER_DEFAULT = 0;

            // Call LogonUser to obtain a handle to an access token.
            bool returnValue = LogonUser("otheruser", "dafna", "12345",
                LOGON32_LOGON_INTERACTIVE, LOGON32_PROVIDER_DEFAULT,
                ref tokenHandle);


            WindowsIdentity qauserId = new WindowsIdentity(tokenHandle);
            WindowsPrincipal qauser = new WindowsPrincipal(qauserId);
            Thread.CurrentPrincipal = qauser;
            qauserId.Impersonate();
так сделать?

кстати, в домене можно просто сделать запрос LDAP с фильтром. Посмотрите в сторону LINQ2LDAP и LINQ to Active Directory

Автор: mihryak 29.4.2010, 16:09
Цитата
You cannot use LogonUser to log on to a remote computer.

а мне нужно получить для создания WindowsIdentity именно logon token с удалённого компа, чтобы сделать проверку на вхождение в роль в его контектсе

Т.е. есть некий комп в домене, у него есть локальная группа Administrators, и в этой группе есть (или нет) мой доменный юзер - это и надо выяснить. При этом, в этой группе моежт быть и другая группа, ......., в которой есть мой юзер

Про Linq to LDAP ничего не знал, спасибо
Но, боюсь, мне не помогут они ничем, кроме переписывания моего же поиска юзера в другой форме - мне не хватает понимания, что и у кого спрашивать, чтобы получить нужный ответ

Автор: jonie 30.4.2010, 08:20
ну хорошо, давайте тогда попробуем WMI использовать. Дело в том, что в AD не содержится информация о локальных группах.
Вот тут вам пример: http://blogs.technet.com/heyscriptingguy/archive/2005/11/02/how-can-i-determine-the-name-of-the-local-administrators-group.aspx

ну только запрос сразу делайте с условием, чтобы не делать перебор

UPD: ссылка немного не о том, но я думаю вы найдете по ней часть ответа (там sid надо менять)

Автор: mihryak 4.5.2010, 15:36
jonie, спасибо, на WMI смотрел, но его удобство теряется, когда нужно рекурсивность проверки добавить - разбор становится не таким уж простым
в реальных условиях (большой домен, много юзеров) нет сейчас возможности проверить, так что пока оставил свой вариант, будет неприемлимо тормозить - перепишу на WMI

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)