Перечислите элементы группы пользователя Windows в удаленной системе с помощью c#

5
задан stakx supports GoFundMonica 5 February 2011 в 15:55
поделиться

5 ответов

Это должно быть легко сделать использование WMI. Здесь у Вас есть указатель на некоторые документы:

Документация WMI для Win32_UserAccount

Даже если у Вас нет предыдущего опыта с WMI, должно быть довольно легко повернуть это код Сценария VB внизу страницы в некоторый код.NET.

Надеюсь, что это помогло!

1
ответ дан 15 December 2019 в 01:16
поделиться

davidg был на правильном пути, и я приписываю ему ответ.

Но WMI запрашивает необходимый, был немного меньше, чем straightfoward, так как мне был нужен не только список пользователей для целой машины, но подмножество пользователей и групп, или локальный или доменный, которые были членами группы локальных администраторов. Для записи, которой был запрос WMI:

SELECT PartComponent FROM Win32_GroupUser WHERE GroupComponent = "Win32_Group.Domain='thehostname',Name='thegroupname'"

Вот полный фрагмент кода:

public string GroupMembers(string targethost, string groupname, string targetusername, string targetpassword)
        {
            StringBuilder result = new StringBuilder(); 
            try
            {
                ConnectionOptions Conn = new ConnectionOptions();
                if (targethost != Environment.MachineName) //WMI errors if creds given for localhost
                {
                    Conn.Username = targetusername; //can be null
                    Conn.Password = targetpassword; //can be null
                }
                Conn.Timeout = TimeSpan.FromSeconds(2);
                ManagementScope scope = new ManagementScope("\\\\" + targethost + "\\root\\cimv2", Conn);
                scope.Connect();
                StringBuilder qs = new StringBuilder();
                qs.Append("SELECT PartComponent FROM Win32_GroupUser WHERE GroupComponent = \"Win32_Group.Domain='");
                qs.Append(targethost);
                qs.Append("',Name='");
                qs.Append(groupname);
                qs.AppendLine("'\"");
                ObjectQuery query = new ObjectQuery(qs.ToString());
                ManagementObjectSearcher searcher = new ManagementObjectSearcher(scope, query);
                ManagementObjectCollection queryCollection = searcher.Get();
                foreach (ManagementObject m in queryCollection)
                {
                    ManagementPath path = new ManagementPath(m["PartComponent"].ToString());                                        
                    { 
                        String[] names = path.RelativePath.Split(',');
                        result.Append(names[0].Substring(names[0].IndexOf("=") + 1).Replace("\"", " ").Trim() + "\\"); 
                        result.AppendLine(names[1].Substring(names[1].IndexOf("=") + 1).Replace("\"", " ").Trim());                    
                    }
                }
                return result.ToString();
            }
            catch (Exception e)
            {
                Console.WriteLine("Error. Message: " + e.Message);
                return "fail";
            }
        }

Так, если я вызываю Groupmembers ("Server1", "Administrators", "myusername", "mypassword"); я возвратил единственную строку с:

SERVER1\Administrator
Администраторы MYDOMAIN\Domain

Фактический возврат WMI больше похож на это:

\\SERVER1\root\cimv2:Win32_UserAccount. Домен = "SERVER1", Имя = "Администратор"

... таким образом, как Вы видите, я должен был сделать немного обработки строк к симпатичному это.

2
ответ дан 15 December 2019 в 01:16
поделиться

Я рекомендовал бы использовать API-функцию Win32 NetLocalGroupGetMembers. Это является намного более прямым, чем попытка выяснить сумасшедший синтаксис LDAP, который необходим для некоторых из других решений, рекомендуемых здесь. Пока Вы исполняете роль пользователя, которого Вы хотите осуществить проверку как путем вызова "LoginUser", Вы не должны сталкиваться ни с какими проблемами безопасности.

Можно найти пример кода для того, чтобы сделать олицетворение здесь.

Если Вы нуждаетесь в помощи, выясняя, как назвать "NetLocalGroupGetMembers" от C#, я reccomend, что Вы контроль помощник Jared Parson PInvoke, который можно загрузить с codeplex.

Если Вы выполняете код в приложении ASP.NET, работающем в IIS, и хотите исполнить роль пользователя, получающего доступ к веб-сайту для совершения вызова, то Вы, возможно, должны предоставить "Доверяемый для Делегации" разрешение к производственному веб-серверу.

Если Вы работаете на рабочем столе, то использование учетных данных безопасности активного пользователя не должно быть проблемой.

Возможно, что Вы объединяетесь в сеть, администратор, возможно, отклонил доступ к "Объекту Securable" для конкретной машины, к которой Вы пытаетесь получить доступ. К сожалению, тот доступ необходим для всех функций API управления сетью для работы. Если это так, затем необходимо будет предоставить доступ к "Объекту Securable" для любых пользователей, которых Вы хотите выполнить как. С настройками безопасности Windows по умолчанию у всех аутентифицируемых пользователей должен быть доступ, как бы то ни было.

Я надеюсь, что это помогает.

- Scott

1
ответ дан 15 December 2019 в 01:16
поделиться

Необходимо смочь сделать это с Системой. DirectoryServices. DirectoryEntry. При наличии затруднений при выполнении его удаленно возможно, Вы могли бы установить что-то на удаленных машинах, чтобы дать Вам Ваши данные через своего рода RPC, как дистанционная работа или веб-сервис. Но я думаю, что Вы пробуете, должно быть возможным удаленно, не становясь слишком необычным.

0
ответ дан 15 December 2019 в 01:16
поделиться

Если Windows не позволит Вам соединиться через, это - механизм входа в систему, я думаю, что Ваша единственная опция состоит в том, чтобы выполнить что-то на удаленной машине с открытым портом (или непосредственно или через дистанционную работу или веб-сервис, как упомянуто).

0
ответ дан 15 December 2019 в 01:16
поделиться
Другие вопросы по тегам:

Похожие вопросы: